DCA培训心得笔记
图形化安装过程选择了没有权限写入的安装目录
在创建dmdba用户以及相应的dinstall用户组用于管理DM8数据库后,在图形化安装过程中选择创建好的/dm8安装目录却显示如下:
首先需要检查自己图形化安装时是否切换了dmdba用户,若创建/dm8安装目录时采用的是root用户,但执行图形化安装时采用的是dmdba用户时,则会因为dmdba没有/dm8的写入权限导致执行出错:
解决方法:
chown dmdba:dinstall -R /dm8
DM8体系结构
达梦数据库是一个典型的 C/S 架构,由服务器+客户端两部分构成。
DMSERVER:数据库实例+数据库(数据库文件)
数据库实例:一组后台进程或者线程+共享内存
单实例:一个实例管理一个数据库
DMDSC:多个实例管理一个数据库,类似于 Oracle rac 架构
数据库:磁盘上的数据库文件(配置文件、控制文件、重做日志文件、数据文件、归档日志文件、日志文件、备份文件、事件日志文件)
达梦是一个单进程、多线程架构的数据库。
查看进程:
ps -ef |grep dmserver
查看线程:
select * from v$threads
存储结构
配置文件有两个:dm.ini和sqllog.ini
查询视图:
select para_name,para_value,para_type from v$dm_ini;
修改数据库密码策略:
设置系统默认口令策略。
0: 无策略;
1: 禁止与用户名相同;
2: 口令长度不小于 9;
4: 至少包含一个大写字母( A-Z);
8 :至少包含一个数字(0-9);
16:至少包含一个标点符 号(英文输入法状态下,除―和空格外的所有符号;若为其他数字,则表示配置值的和,如 3 =1+2,表示同时启用第 1 项和第 2 项策略。当 COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0
在选择数据库密码策略时,根据需求将前面的数字相加,得出的value设置给参数PWD_POLICY即可:
eg:修改数据库密码策略为禁止与用户名相同并且口令长度不小于 9
alter system set 'PWD_POLICY'=3 both;
逻辑结构
页:是达梦数据库最小的单元。默认大小为 8k,支持 4k、8k、16k、32k。
簇:簇是连续的页组成。一个簇总是在一个数据文件中。默认大小为 16 个页,支持 16、32 个页。
段:是簇的上级逻辑单元,段可以跨数据文件。段分为:表段、索引段、临时段、回滚段。 Dba_segments
表空间:达梦数据库拥有多个表空间;一个表空间可以拥有一个或多个数据文件;一个数据文件只能属于一个表空间。Dba_tablespaces
内存结构
共享内存池:共享内存池是 DMSERVER 启动时从操作系统申请的一大片内存,实例在运行中可以向共享内存池申请内存。
相关参数:
MEMORY_POOL:共享内存池大小
MEMEORY_TARGET:能扩充到的大小
数据缓存区:缓存的是数据页,使用缓冲区可以提高数据库的读写性能。数据库缓冲区设置的太小会造成性能的问题。
数据缓冲区的参考大小:
Oltp,物理内存的 40%-60%
Olap,物理内存的 60%-80%
数据缓冲区的类型:
Normal、keep:可以手动调整,默认就是 normal,达梦 keep 的是表空间。
Fast、recycle:系统自动管理,缓存的是临时页和回滚页的的信息。
数据缓冲区和共享内存池没有关系,数据缓冲区满就淘汰很少使用的数据页。
内连接与外连接
连接查询分为内连接和外连接。 内连接:查询只返回满足条件的记录。 外连接:查询除了返回满足条件的记录外,不满足条件的也返回,用 null 代替。
假设此时TEST用户有两个表:
EMPLOYEE:
名字 | 属性 |
---|---|
EMPLOYEE_ID | INTEGER |
EMPLOYEE_NAME | VARCHAR(20) |
DEPARTMENT_ID | INTEGER |
EMPLOYEE_SALARY | INTEGER |
其中EMPLOYEE_ID是该表的主键。
DEPARTMENT :
名字 | 属性 |
---|---|
DEPARTMENT_ID | INTEGER |
DEPARTMENT_NAME | VARCHAR(20) |
其中DEPARTMENT_ID是该表的主键。
内连接:自然连接,交叉连接,using,on,hash join
自然连接 natural join
把两张连接表中的同名列作为连接条件,进行等值连接,我们称这样的连接为自然连接。
自然连接具有以下特点:
1.连接表中存在同名列;
2.如果有多个同名列,则会产生多个等值连接条件;
3.如果连接表中的同名列类型不匹配,则报错处理。
eg:查询员工名称、部门名称和薪资
SELECT a.EMPLOYEE_NAME, b.DEPARTMENT_NAME,a.EMPLOYEE_SALARY
FROM TEST.EMPLOYEE a NATURAL JOIN TEST.DEPARTMENT b;
交叉连接 cross join
对连接的两张表记录做笛卡尔集,产生最终结果输出。
eg:通过交叉查询员工名称和部门名称
SELECT a.EMPLOYEE_NAME, b.DEPARTMENT_NAME
FROM TEST.EMPLOYEE a CROSS JOIN TEST.DEPARTMENT b;
join…using…
JOIN 关键字指定连接的两张表,USING 指明连接列。要求 USING 中的列存在于两张连接表中。
eg:通过join using查询员工名称和部门名称
SELECT a.EMPLOYEE_NAME, b.DEPARTMENT_NAME
FROM TEST.EMPLOYEE JOIN TEST.DEPARTMENT b USING (DEPARTMENT_ID);
join…on…
JOIN 关键字指定连接的两张表,ON 子句指定连接条件表达式,其中不允许出现 ROWNUM。具体采用何种连接方式,由数据库内部分析确定。
eg:通过join using查询员工名称和部门名称
SELECT a.EMPLOYEE_NAME, b.DEPARTMENT_NAME
FROM TEST.EMPLOYEE JOIN TEST.DEPARTMENT b
ON a.DEPARTMENT_ID=b.DEPARTMENT_ID;
外连接:左外连接、右外连接、全外连接
- 左外连接:返回左表所有记录;
- 右外连接:返回右表所有记录;
- 全外连接:返回两张表所有记录。处理过程为分别对两张表进行左外连接和右外连接,然后合并结果集。
左外连接
select a.EMPLOYEE_NAME,b.DEPARTMENT_NAME
from TEST.EMPLOYEE a left join TEST.DEPARTMENT b
on a.DEPARTMENT_ID=B.DEPARTMENT_ID;
右外连接
select a.EMPLOYEE_NAME,b.DEPARTMENT_NAME
from TEST.EMPLOYEE a right join TEST.DEPARTMENT b
on a.DEPARTMENT_ID=B.DEPARTMENT_ID;
全外连接
全外连接=左外连接+右外连接
select a.EMPLOYEE_NAME,b.DEPARTMENT_NAME
from TEST.EMPLOYEE a full join TEST.DEPARTMENT b
on a.DEPARTMENT_ID=B.DEPARTMENT_ID;
磁盘空间异常,生成了大小异常的备份日志文件
在做全库备份的时候,出现磁盘空间不足的问题:
查看占用率
df -h
发现根目录挂载点的磁盘空间用完了,由于虚拟机只安装了DM8数据库,磁盘空间理应是足够的,需要排查一下是什么文件占用了大量磁盘空间。
到DM8的安装目录下查看占用空间:
发现日志文件莫名占用了18G
其中主要是dm_BAKRES_202209.log大小异常,通过搜寻答案发现:
还原归档时,如果遇到归档已经存在的处理,1:跳过已存在的归档日志,继续其他日志的还原。跳过的信息会生成一条日志记录在安装目录/log/dm_BAKRES_年月.log里;2:直接报错返回;3:强制覆盖存在的归档日志。缺省为1。
自己在还原归档前,确实归档已经存在,这导致了dm_BAKRES_202209.log文件不断的扩大,占用了所有的磁盘空间。最后删除了该日志文件进行了重新备份。
模糊匹配时是否走索引问题
# 当模糊查询%在右侧时会走索引,因为左边部分是可以匹配的
select * from employee where name like 'ZHANG%'
# 当%在左边时不走索引
select * from employee where name like '%ZHANG'或'%ZHANG%'
# 当只查该字段时,还是会走索引,因为可以把索引当成一个小表
select name from employee where name like '%ZHANG'或'%ZHANG%'
数据库的备份还原
- 物理备份
- 完全备份
- 包含指定数据库和表空间所有数据
- 增量备份
- 基于一次完全备份或上一次增量备份后,往后每次备份只备份与前一次相比有差异的的数据文件
- 完全备份
- 逻辑备份
- 冷备
- 数据库停止运行时的备份
- 热备
- 数据库启动状态下的备份
逻辑备份包含:全库导出、按用户导出
#dexp在达梦的bin目录下
#需要先创建目录,且导入导出用同一个用户
#全库导出 full=y
dexp userid=sysdba/SYSDBA:5238 directory=/dm8/backup/dexp file=full.dmp log=full.log full=y
#按用户导出
dexp userid=sysdba/SYSDBA:5238 directory=/dm8/backup/dexp file=dmtest.dmp log=dmtest.log owner=dmtest
图形化界面可以在manager中进行导出
导入sql:
#数据导入:oracle 用@,DM 使用 start 或者`
SQL> start /dm8/backup/t_emp.sql
SQL> `/dm8/backup/t_emp.sql
物理备份:联机备份、脱机备份
联机备份
# 全库备份到默认路径
backup database
# 全库备份到指定路径
backup database full backupset '备份目录';
# 基于基础备份集的增量备份
backup database increment to incrbak01 backupset '/dm8/backup/incr/incrbak01';
# 基于指定备份集的增量备份
backup database increment with BACKUPDIR '/dm8/backup/full' to incrbak02 backupset '/dm8/backup/incr/incrbak02';
脱机备份可以采用console工具,在tool目录下
./console
图形化完全卸载DM8
采用图形化界面卸载DM8,首先需要执行卸载脚本:
cd /dm8/
./uninstall.sh
在进行图形化操作后会提示使用root用户执行命令:
su root
/dm8/root_uninstaller.sh
在执行完该命令后点击确定,还需要手动删除/dm8下残留的文件,卸载完成。