几天前,我参加了达梦认证数据库管理员(DCA)的线上考试。在自家电脑前提交答卷的那一刻,脑子里闪回的不是某道题,而是备考时一个个实验场景:安装、初始化、建表空间、授权、备份……DCA 考试的内容覆盖数据库管理员的日常工作全貌,几乎每一个知识点都要在实验环境里真正敲一遍才算掌握。
趁着记忆还热乎,我把备考过程中最核心的实操内容按考试知识模块完整复盘一遍,附上我实际踩过的坑和解决办法,希望能帮到正在备考的你。
我的实验环境: 银河麒麟 V10(Kylin10)x86_64 操作系统,达梦数据库 DM8 企业版,安装用户 dmdba(属组 dinstall),安装目录 /dm/dmdbms,数据目录 /dm/data。
很多人拿到安装包就直接双击,结果装到一半报错才回头查环境。我的习惯是先把环境确认一遍:用 ldd --version 看 glibc 版本,用 uname -r 看内核版本,再依次确认 CPU 架构、内存和磁盘空间。我的机器内核是 4.19.90 的麒麟 V10,满足 DM8 的安装要求。
确认环境没问题后,用 root 创建安装用户和安装目录。达梦官方不建议用 root 直接安装数据库,这一点考试也会涉及,标准做法是建一个专门的 dinstall 组和 dmdba 用户:
[root@localhost /]# groupadd dinstall
[root@localhost /]# useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
[root@localhost /]# passwd dmdba
[root@localhost /]# mkdir /dm
[root@localhost /]# chown dmdba:dinstall /dm
最后把 ISO 安装镜像挂载到 /mnt/dm,确认里面有 DMInstall.bin 安装程序和安装手册,准备工作就完成了。这一步看似琐碎,但"先规划、再动手"恰恰是 DBA 的基本素养。
切换到 dmdba 用户,执行 ./DMInstall.bin -i 进入交互式安装。整个过程就是依次回答几个问题:安装语言默认简体中文;学习用没有 Key 文件选 n;时区按需设置;安装类型选默认的典型安装;安装目录我填的是 /dm/dmdbms;最后确认一遍安装小结,回车即开始安装。
安装结束后千万不要忘记用 root 执行配置脚本 /dm/dmdbms/script/root/root_installer.sh,它会创建并启动 DmAPService 服务。少了这一步,后续很多工具会不正常。
我踩过的坑 1:/tmp 分区不足。 安装程序会把安装文件解压到 /tmp,需要约 2G 以上临时空间,而我的虚拟机 /tmp 只有 1.2G,安装直接报错退出。解决办法是创建一个大目录(比如 /home/dmdba/tmp),在 .bash_profile 里设置环境变量 DM_INSTALL_TMPDIR 指向它,source 生效后重新安装即可。
我踩过的坑 2:目录没有写入权限。 安装时提示"没有写入权限",多半是准备阶段忘了执行 chown dmdba:dinstall /dm,把目录属主改回 dmdba 就能解决。
装好软件只是有了"毛坯房",初始化数据库实例才是真正的"交钥匙"。我用 dminit 把关键参数一次性写清楚:
[dmdba@localhost bin]$ ./dminit path=/dm/data db_name=DAMENG instance_name=DMSERVER \
port_num=5236 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123 EXTENT_SIZE=16 PAGE_SIZE=8 LOG_SIZE=256
这里要特别说明:PAGE_SIZE(页大小)、EXTENT_SIZE(簇大小)、字符集等参数在实例初始化后就无法修改,只能重建实例,所以下手前一定要想清楚,这也是 DCA 考试的高频考点。
初始化完成后,还需要用 root 运行 dm_service_installer.sh 把实例服务注册到操作系统,指定服务类型 dmserver、服务名后缀和 dm.ini 路径。注册成功后,启停服务就有三种姿势可选:systemctl 管理 DmServiceDMSERVER 服务,或者直接执行 bin 目录下的 DmServiceDMSERVER 脚本加 start/stop 参数。三种方式我都练熟了,考试时任选一种即可。
习惯图形化操作的同学也可以用 dbca(数据库配置助手)完成同样的工作,向导的每一步都和 dminit 的参数一一对应,对照着理解会更快。
实例启动后,用 disql 连接数据库,这是 DBA 每天打交道最多的工具。可以直接在命令行带账号密码登录,也可以先进入 disql 再用 CONN 连接:
[dmdba@localhost bin]$ ./disql SYSDBA/Dameng123
SQL> CONN sysdba/Dameng123
连接成功后,我习惯先查两张动态视图确认状态:V$DATABASE 看库名、创建时间和归档模式,V$INSTANCE 看实例名和版本信息。能查出结果,说明实例真正跑起来了。
我踩过的坑 3:带特殊字符的密码连不上。 我把密码改成 Dameng@123 后,登录直接报 -70028 创建 SOCKET 连接失败,第一反应是网络问题,折腾半天才发现是密码里的 @ 在作怪。正确做法是把密码用双引号括起来,而双引号在 Linux shell 里又需要单引号或反斜杠保护,即 ./disql TESTUSER/'"Dameng@123"' 或 ./disql TESTUSER/\"Dameng@123\"。这个坑在考试中非常常见,务必记牢。
日常管理中,DM 管理工具(manager)也很常用,对象导航、SQL 编辑、结果查看集成在一个界面里,和 disql 可以互相印证操作结果。
表空间是达梦数据库中最大的逻辑存储单元。我的记忆方法是:用户挂在表空间上,表空间落在数据文件上。创建表空间 DMDATA 时我放了两个 128M 的数据文件,后续练手又陆续做了加文件、改大小、改自动扩展属性这些常规维护:
SQL> CREATE TABLESPACE dmdata DATAFILE '/dm/data/DAMENG/DMDATA01.DBF' SIZE 128,
'/dm/data/DAMENG/DMDATA02.DBF' SIZE 128;
SQL> ALTER TABLESPACE dmdata ADD DATAFILE '/dm/data/DAMENG/DMDATA03.DBF' SIZE 500;
SQL> ALTER TABLESPACE dmdata RESIZE DATAFILE '/dm/data/DAMENG/DMDATA01.DBF' TO 256;
SQL> ALTER TABLESPACE dmdata DATAFILE '/dm/data/DAMENG/DMDATA03.DBF' AUTOEXTEND ON NEXT 20 MAXSIZE 20480;
修改数据文件路径是最容易记混的操作,正确顺序是四步:先把表空间 OFFLINE 脱机,在操作系统层面建好新目录,再用 RENAME DATAFILE 改路径,最后 ONLINE 联机。顺序错了就会报错。
重做日志(联机日志)的管理也是考点,可以用 ALTER DATABASE ADD LOGFILE 增加日志文件、用 RESIZE LOGFILE 调大,但要记住日志文件只能增加或变大,不能删除或变小,且大小不能低于 256M。
我踩过的坑 4:-7014 创建数据文件失败。 建表空间时报这个错,原因是 dmdba 用户对数据文件目录没有写权限,用 root 执行 chown dmdba:dinstall -R /dm/data/DAMENG 即可。这类"权限不足"的报错贯穿整个 DCA 课程,遇到先想权限,十有八九能定位。
达梦的权限体系我总结为一句话:权限给角色,角色给用户,资源限制(PROFILE)管口令策略。我的完整操作流程分四步:先创建资源限制 TESTPRO,设定登录失败 3 次锁定 5 分钟、口令 90 天过期、宽限 3 天;再创建角色 TESTROLE,把 CREATE TABLE、CREATE VIEW 系统权限和 DMHR.EMPLOYEE 表的增删改查对象权限授给它;然后创建用户 TESTUSER,指定默认表空间为 DMDATA,把角色授给用户并挂上资源限制:
SQL> CREATE PROFILE testpro LIMIT FAILED_LOGIN_ATTEMPS 3 PASSWORD_LOCK_TIME 5
PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 3;
SQL> CREATE ROLE testrole;
SQL> GRANT CREATE TABLE, CREATE VIEW TO testrole WITH ADMIN OPTION;
SQL> GRANT SELECT, INSERT, UPDATE, DELETE ON dmhr.employee TO testrole;
SQL> CREATE USER testuser IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE dmdata;
SQL> GRANT testrole TO testuser WITH ADMIN OPTION;
SQL> ALTER USER testuser PROFILE testpro;
回收权限对应 REVOKE 语句,备考时最好成对记忆。
两个细节是我在备考时特别注意的:一是 WITH ADMIN OPTION 针对系统权限和角色,WITH GRANT OPTION 针对对象权限,两者不要混淆;二是普通用户登录 manager 看不到对象导航里的系统表,需要授予 SOI 角色(访问系统对象),查动态视图则需要 VTI 角色,这两个角色的用途是高频考点。
SQL 部分是考试的"体力活",建表、约束、增删改查、多表连接、分组聚合都要熟练。我在 TESTUSER 模式下建了 TESTDEPT 和 TESTEMP 两张练习表,一张带主键和非空约束,另一张把唯一、检查、外键约束全都用上,再插入部门和小于十条员工数据做验证:
SQL> CREATE TABLE testuser.testdept (
deptid INT PRIMARY KEY,
deptname VARCHAR(50) NOT NULL,
location VARCHAR(30));
SQL> CREATE TABLE testuser.testemp (
empid INT PRIMARY KEY,
empname VARCHAR(30) UNIQUE,
salary NUMBER(7,2) CHECK(salary>=8000 AND salary<=30000),
deptid INT NOT NULL FOREIGN KEY REFERENCES testuser.testdept(deptid));
查询练习主要围绕示例库 DMHR 展开:简单查询、LIKE 模糊匹配、ORDER BY 排序、子查询查"高于平均工资的员工",再到 EMPLOYEE 和 DEPARTMENT 两表连接加分组聚合,统计各部门人数和平均薪资并用 HAVING 过滤、按人数降序排列。另外在 disql 里执行外部 SQL 脚本有三种等价写法:反引号、@ 符号、start 命令加脚本路径,考试时任选一种。
模式对象部分,索引、视图、物化视图、序列、同义词、外部链接(DBLINK)一个都不能少。其中物化视图的增量刷新是难点,要点是先对基表建物化视图日志,创建物化视图时刷新方式选 FAST,之后基表数据变更提交后再刷新,就能只同步增量部分:
SQL> CREATE MATERIALIZED VIEW LOG ON testuser.testemp;
SQL> CREATE MATERIALIZED VIEW testuser.testmview2 REFRESH FAST WITH PRIMARY KEY
AS SELECT * FROM testuser.testemp;
SQL> DELETE FROM testuser.testemp WHERE empid=1005; COMMIT;
SQL> REFRESH MATERIALIZED VIEW testuser.testmview2 FAST;
序列用 CREATE SEQUENCE 定义起始值和步长;同义词分私有和公有(PUBLIC);DBLINK 用 CREATE LINK ... CONNECT 'DPI' ... USING 'IP:端口' 创建后,就可以用 表名@链接名 查询远程库的数据。
我踩过的坑 5: 序列的 CURRVAL 必须在同一会话先取过 NEXTVAL 才能用,否则报 -7147 序列当前值尚未在此会话中定义;私有同义词和私有 DBLINK 必须用"模式名.对象名"访问或由属主本人使用,直接访问会报无效对象。
达梦的逻辑导出导入工具 dexp/dimp 是我最喜欢的一章——全库和模式两个粒度各一对命令,规律非常好记:full=y 管全库,schemas= 管模式,导入时用 remap_schema 还能做模式映射,把 DMHR 的数据导进 TESTUSER:
[dmdba@localhost bin]$ ./dexp SYSDBA/Dameng123 directory=/dm/backup/dexp file=fulldb.dmp log=fulldb.log full=y
[dmdba@localhost bin]$ ./dimp SYSDBA/Dameng123 directory=/dm/backup/dexp file=fulldb.dmp log=dimpfulldb.log full=y
[dmdba@localhost bin]$ ./dexp SYSDBA/Dameng123 directory=/dm/backup/dexp file=dmhr.dmp log=dmhr.log schemas=DMHR
[dmdba@localhost bin]$ ./dimp SYSDBA/Dameng123 directory=/dm/backup/dexp file=dmhr.dmp log=dimpdmhr.log remap_schema=DMHR:TESTUSER
我踩过的坑 6: 跨库导入时如果报"服务器与文件内数据的 CASE_SENSITIVE 参数不匹配",说明源库和目标库的大小写敏感参数不一致,导入时加上 IGNORE_INIT_PARA=1 参数忽略即可。另外,普通用户做导出需要对象的 SELECT FOR DUMP 权限,否则导出会报权限不足,授权语句是 GRANT SELECT FOR DUMP ON 表名 TO 用户名。
最后一章是 DMSQL 开发。我在示例库 DMHR 上练了两个经典案例:一是分等级加薪存储过程 P_ADDSALBYDEPT——输入部门编号,遍历该部门员工,薪资 1W 以内加 12%、1W~2W 加 10%、2W 以上加 8%,同时把调薪前后的薪资写入日志表,整个过程用 FOR 循环加 IF 分支实现,末尾的 EXCEPTION 块保证出错时回滚并打印错误信息:
CREATE OR REPLACE PROCEDURE dmhr.p_addsalbydept(in_deptid IN INT) IS
v_newsalary INT := 0;
BEGIN
FOR emp IN (SELECT salary, employee_id, employee_name
FROM dmhr.employee WHERE department_id = in_deptid) LOOP
IF (emp.salary < 10000) THEN
v_newsalary := emp.salary * 1.12;
ELSIF (emp.salary <= 20000) THEN
v_newsalary := emp.salary * 1.1;
ELSE
v_newsalary := emp.salary * 1.08;
END IF;
UPDATE dmhr.employee t SET t.salary = v_newsalary
WHERE t.employee_id = emp.employee_id;
INSERT INTO dmhr.log_addsalary VALUES (...); -- 记录调薪日志
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK; print(sqlcode || '--' || sqlerrm);
END;
/
二是离职员工归档触发器 TR_DELEMP——在 EMPLOYEE 表上做 BEFORE DELETE 的行级触发,把 :OLD 伪记录里的员工信息自动写入历史表 EMP_HISTORY。创建好之后,每删除一名员工,历史表就会悄悄多一条归档记录,非常有成就感。
还有一个很有意思的事件级触发器 TR_DDLPROTECT:对 DMHR 模式的 DROP 和 TRUNCATE 操作做 BEFORE 拦截,用 RAISE_APPLICATION_ERROR 抛出自定义错误,相当于给模式上了一把"防误删锁"。另外提醒一句,调用别人创建的函数或过程时如果报 -5505 没有执行对象权限,记得让属主授权 GRANT EXECUTE ON 对象名 TO 用户名。
把备考中踩过的坑汇总成一张清单,这也是我考前最后一晚只看的材料:
| # | 报错/现象 | 原因 | 解决办法 |
|---|---|---|---|
| 1 | 安装提示 /tmp 空间不足 | 临时目录小于 2G | 设置 DM_INSTALL_TMPDIR 指向大目录 |
| 2 | -7014 创建数据文件失败 | dmdba 对目录无写权限 | chown dmdba:dinstall -R 目录 |
| 3 | -70028 创建 SOCKET 连接失败 | 密码含 @ 等特殊字符 | 密码加双引号再用单引号或 \ 转义 |
| 4 | 重做日志 RESIZE 报大小无效 | 日志只能增不能减,下限 256M | 调整到 ≥256M 且不小于原值 |
| 5 | -7147 序列当前值未定义 | CURRVAL 前未取 NEXTVAL | 同一会话先 SELECT NEXTVAL |
| 6 | dimp 报 CASE_SENSITIVE 不匹配 | 源库与目标库初始化参数不一致 | 导入加 IGNORE_INIT_PARA=1 |
再说三点考试建议:第一,初始化参数(页大小、簇大小、字符集、大小写敏感)一旦创建不可更改,建库前一定读清题目要求;第二,图形化工具和 disql 两种操作方式都要会,考试时可以选自己顺手的方式,但理解每个参数的含义才能在遇到报错时不慌;第三,所有实验务必亲手验证一遍结果——查出来、导出来、调用出来,DCA 考试非常看重"做完并验证"的闭环。
从安装部署到 DMSQL 开发,备考 DCA 的过程其实就是把"数据库管理员的一天"完整走了一遍:装库、建实例、管存储、控权限、写 SQL、做备份、搞开发。当每个实验都能独立完成并验证结果的时候,考试不过是一次水到渠成的实验课。
祝每一位备考 DCA 的同学都能顺利通关。我们 DCP 见!
文章
阅读量
获赞
