注册
我的 DCA 考试实录:从装库到通关的完整复盘
培训园地/ 文章详情 /

我的 DCA 考试实录:从装库到通关的完整复盘

Azure 2026/08/19 213 0 0

写在前面

几天前,我参加了达梦认证数据库管理员(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 的基本素养。

二、安装 DM8:交互式安装十分钟搞定

切换到 dmdba 用户,执行 ./DMInstall.bin -i 进入交互式安装。整个过程就是依次回答几个问题:安装语言默认简体中文;学习用没有 Key 文件选 n;时区按需设置;安装类型选默认的典型安装;安装目录我填的是 /dm/dmdbms;最后确认一遍安装小结,回车即开始安装。

01_cli_install.png

安装结束后千万不要忘记用 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 初始化实例:参数一次写对,终身受益

装好软件只是有了"毛坯房",初始化数据库实例才是真正的"交钥匙"。我用 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 考试的高频考点。

02_dminit.png

初始化完成后,还需要用 root 运行 dm_service_installer.sh 把实例服务注册到操作系统,指定服务类型 dmserver、服务名后缀和 dm.ini 路径。注册成功后,启停服务就有三种姿势可选:systemctl 管理 DmServiceDMSERVER 服务,或者直接执行 bin 目录下的 DmServiceDMSERVER 脚本加 start/stop 参数。三种方式我都练熟了,考试时任选一种即可。

习惯图形化操作的同学也可以用 dbca(数据库配置助手)完成同样的工作,向导的每一步都和 dminit 的参数一一对应,对照着理解会更快。

09_gui_dbca.jpg

四、disql 连接:别小看这个"SQL 提示符"

实例启动后,用 disql 连接数据库,这是 DBA 每天打交道最多的工具。可以直接在命令行带账号密码登录,也可以先进入 disql 再用 CONN 连接:

[dmdba@localhost bin]$ ./disql SYSDBA/Dameng123
SQL> CONN sysdba/Dameng123

连接成功后,我习惯先查两张动态视图确认状态:V$DATABASE 看库名、创建时间和归档模式,V$INSTANCE 看实例名和版本信息。能查出结果,说明实例真正跑起来了。

03_disql.png

我踩过的坑 3:带特殊字符的密码连不上。 我把密码改成 Dameng@123 后,登录直接报 -70028 创建 SOCKET 连接失败,第一反应是网络问题,折腾半天才发现是密码里的 @ 在作怪。正确做法是把密码用双引号括起来,而双引号在 Linux shell 里又需要单引号或反斜杠保护,即 ./disql TESTUSER/'"Dameng@123"'./disql TESTUSER/\"Dameng@123\"。这个坑在考试中非常常见,务必记牢。

日常管理中,DM 管理工具(manager)也很常用,对象导航、SQL 编辑、结果查看集成在一个界面里,和 disql 可以互相印证操作结果。

08_gui_manager.jpg

五、表空间与重做日志:DBA 的"地盘意识"

表空间是达梦数据库中最大的逻辑存储单元。我的记忆方法是:用户挂在表空间上,表空间落在数据文件上。创建表空间 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。

04_tablespace.png

我踩过的坑 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 语句,备考时最好成对记忆。

05_user.png

两个细节是我在备考时特别注意的:一是 WITH ADMIN OPTION 针对系统权限和角色,WITH GRANT OPTION 针对对象权限,两者不要混淆;二是普通用户登录 manager 看不到对象导航里的系统表,需要授予 SOI 角色(访问系统对象),查动态视图则需要 VTI 角色,这两个角色的用途是高频考点。

七、SQL 与模式对象:基本功决定上限

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 四板斧

达梦的逻辑导出导入工具 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

06_dexp.png

我踩过的坑 6: 跨库导入时如果报"服务器与文件内数据的 CASE_SENSITIVE 参数不匹配",说明源库和目标库的大小写敏感参数不一致,导入时加上 IGNORE_INIT_PARA=1 参数忽略即可。另外,普通用户做导出需要对象的 SELECT FOR DUMP 权限,否则导出会报权限不足,授权语句是 GRANT SELECT FOR DUMP ON 表名 TO 用户名

九、DMSQL 存储过程与触发器:让数据库自己干活

最后一章是 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。创建好之后,每删除一名员工,历史表就会悄悄多一条归档记录,非常有成就感。

07_proc.png

还有一个很有意思的事件级触发器 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 见!

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服