本文是一份面向达梦数据库 DCA(Dameng Certified Associate)认证考生的全考点实操攻略,覆盖官方考试范围内从"安装数据库管理系统"到"ODBC/Python 接口配置"的全部 14 个考点,每个考点都给出可执行命令、核心参数与高频踩坑点。
一句话核心:DCA 是纯上机实操考试,拼的不是理论而是熟练度 —— 每个知识点练 3 遍以上,按本文的"考点主线"串起来练,2 小时足够从容交卷。
在进入考点前,先看清 DCA 的真实形态,才能制定正确的备考策略。
| 项目 | 实际情况 |
|---|---|
| 考试形式 | 纯实操(VNC 远程接入考试服务器),2 小时 |
| 前期培训 | 3 天原厂培训(理论 + 实操),考试内容远少于培训容量 |
| 主要工具 | DM Manager(图形化)、disql(命令行)、dmrman(备份还原) |
| 评分规则 | 外部学员 70 分通过,达梦内部员工要求 90 分以上 |
| 核心特点 | 图形工具连不上时必须能用命令行兜底,建议双线掌握 |
达梦官方强烈不建议使用 root 安装,需要单独的用户和权限规划。
# 创建安装用户和分组(考试环境通常已预建 dmdba)
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
passwd dmdba
# 创建安装目录并授权(关键!权限不足会导致安装失败)
mkdir -p /dm8
chown dmdba:dinstall /dm8
chmod -R 750 /dm8
# root 下放行 X 访问,并切换到 dmdba 配置 DISPLAY(与执行安装同一窗口)
xhost +
su - dmdba
export DISPLAY=:0.0 # 具体值以 echo $DISPLAY 实际输出为准
# 进入安装介质目录执行
cd /opt
./DMInstall.bin # 图形化安装;命令行安装用 ./DMInstall.bin -i
安装完成后按提示以 root 执行 root_installer.sh,用于创建 DmAPService 等后台服务。
⚠️ 易错点:安装(DMInstall.bin)、初始化(dbca)、图形化工具(manager)必须在配置好 DISPLAY 且执行过 xhost + 的同一个窗口操作,否则报
invalid (NULL) pointer/ "核心已转储"。
初始化是 DCA 的第一道坎:部分初始化参数一旦确定无法修改,错了只能删库重建。
# 进入安装目录 bin 下执行(dmdba 用户)
./dminit PATH=/dm8/data DB_NAME=DAMENG INSTANCE_NAME=DMSERVER \
PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=1024 \
CHARSET=1 CASE_SENSITIVE=Y SYSDBA_PWD=Dameng123 \
SYSAUDITOR_PWD=Dameng123
| 参数 | 默认值 | 可选项 | 是否可修改 |
|---|---|---|---|
| PORT_NUM(端口) | 5236 | 自定义 | 可改 |
| PAGE_SIZE(页大小) | 8K | 4/8/16/32K | 不可改 |
| EXTENT_SIZE(簇大小) | 16 页 | 16/32/64 页 | 不可改 |
| LOG_SIZE(日志大小) | 命令行 4096M / 图形 256M | 256M~2G(图形) | 可改 |
| CASE_SENSITIVE(大小写敏感) | Y | Y/N | 不可改 |
| CHARSET(字符集) | 0=GB18030 | 0/1=UTF-8/2=EUC-KR | 不可改 |
| 口令 | SYSDBA / SYSAUDITOR | — | 需在口令管理页设置 |
⚠️ 易错点:大小写敏感、页大小、簇大小、字符集确定后不可修改。考题要求什么就设什么,先看清题目再点"完成"。设置 SYSDBA 密码时注意Caps Lock 是否开启——大小写输错会导致后续全部登录失败,只能重新初始化。
命令行方式初始化不会自动注册系统服务,图形化 dbca(./dbca.sh)默认自动注册。考试两种方式都可能考,建议都练。
# 服务方式启停(推荐,考试常用)
./DmServiceDMSERVER start
./DmServiceDMSERVER stop
./DmServiceDMSERVER status
# 前台方式启动(仅调试用)
./dmserver /dm8/data/DAMENG/dm.ini
启动后用 ps -ef | grep dmserver 确认进程存在,再用 disql 验证可连接。
# 进入 /dm8/bin
./disql SYSDBA/Dameng123:5236
# 密码带特殊字符时(如 Dameng@123),必须转义
./disql "SYSDBA/\"Dameng@123\":5236"
# 或在 Linux 下用单引号包裹
./disql 'SYSDBA/"Dameng@123":5236'
cd /dm8/tool && ./manager,填写主机、端口(5236)、用户名、密码即可连接。考试大量操作可在 manager 中完成,但强烈建议同时掌握 SQL 写法——图形工具起不来时只能靠命令行。
达梦默认预定义 SYSTEM / ROLL / MAIN / TEMP(以及 HMAIN)五个表空间,默认表空间不允许删除。新建表空间:
-- 创建表空间 TBS,两个数据文件,各 32M,自动扩展每次 1M,上限 1G
CREATE TABLESPACE "TBS" DATAFILE '/dm8/data/DAMENG/TBS01.DBF' SIZE 32
AUTOEXTEND ON NEXT 1 MAXSIZE 1024,
'/dm8/data/DAMENG/TBS02.DBF' SIZE 32
AUTOEXTEND ON NEXT 1 MAXSIZE 1024 CACHE=NORMAL;
-- 表空间脱机 / 联机(SYSTEM/ROLL/TEMP 不能脱机;脱机后数据不可读写)
ALTER TABLESPACE TBS OFFLINE;
ALTER TABLESPACE TBS ONLINE;
-- 修改自动扩展
ALTER TABLESPACE TBS DATAFILE 'TBS01.DBF' AUTOEXTEND ON NEXT 2 MAXSIZE 10240;
-- 增加数据文件
ALTER TABLESPACE TBS ADD DATAFILE 'TBS03.DBF' SIZE 64;
-- 删除表空间
DROP TABLESPACE TBS;
⚠️ 易错点:DM 数据文件最小不能低于页大小的 4096 倍(页大小 8K 时最小 32M),低于会创建报错。
-- 创建用户 TEST01:密码 Dameng123,默认表空间 TBSTEST,最多失败登录 5 次
CREATE USER "TEST01" IDENTIFIED BY "Dameng123"
DEFAULT TABLESPACE TBSTEST
LIMIT FAILED_LOGIN_ATTEMPS 5;
-- 用户锁定 / 解锁
ALTER USER TEST01 ACCOUNT LOCK;
ALTER USER TEST01 ACCOUNT UNLOCK;
PWD_POLICY 是隐含参数,不在 dm.ini 中,只能通过函数或 SQL 修改:
-- 查看当前口令策略
SELECT * FROM V$PARAMETER WHERE NAME = 'PWD_POLICY';
-- 修改为组合策略(如 2+4+8=14:长度+大写+数字)
ALTER SYSTEM SET 'PWD_POLICY' = 14 BOTH;
| 值 | 策略 | 值 | 策略 |
|---|---|---|---|
| 0 | 无策略 | 8 | 至少包含一个数字 |
| 1 | 禁止与用户名相同 | 16 | 至少包含一个标点符号 |
| 2 | 长度 ≥ PWD_MIN_LEN | 可组合 | 相加即可(如 2+4=6) |
| 4 | 至少包含一个大写字母 | — | — |
-- 创建角色并赋权(考试必考:创建角色 + 授予建表/视图/索引权限)
CREATE ROLE DMROLE;
GRANT CREATE TABLE TO DMROLE;
GRANT CREATE INDEX TO DMROLE;
GRANT CREATE VIEW TO DMROLE;
-- 将角色授予用户
GRANT DMROLE TO TEST01;
-- 对象权限与回收
GRANT SELECT ON DMHR.EMPLOYEE TO TEST01;
GRANT SELECT (EMPLOYEE_ID, EMPLOYEE_NAME) ON DMHR.EMPLOYEE TO TEST01; -- 列级
REVOKE SELECT ON DMHR.EMPLOYEE FROM TEST01; -- 回收
-- 查看当前权限
SELECT * FROM SESSION_PRIVS;
💡 经验:权限转授需
WITH GRANT OPTION,回收需加CASCADE级联回收,否则报错。
达梦表约束与 Oracle 高度兼容,考试必考五大约束:主键(PRIMARY KEY)、非空(NOT NULL)、唯一(UNIQUE)、检查(CHECK)、外键(FOREIGN KEY)。
-- 部门表(主表)
CREATE TABLE DEPT (
DEPTNO INT PRIMARY KEY,
DNAME VARCHAR(20) NOT NULL,
LOC VARCHAR(30)
);
-- 员工表(从表):五大约束齐全
CREATE TABLE EMP (
EMPNO INT PRIMARY KEY, -- 主键约束
ENAME VARCHAR(20) NOT NULL, -- 非空约束
EMAIL VARCHAR(50) UNIQUE, -- 唯一约束
SALARY NUMERIC(10,2) CHECK (SALARY BETWEEN 2000 AND 8000), -- 检查约束(2000-8000)
DEPTNO INT,
CONSTRAINT FK_EMP_DEPT FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) -- 外键约束
);
💡 精度( p ) 指数字总有效位数,标度( s ) 指小数位位数。外键引用关系一旦建错,会导致后续数据导入失败,务必按题目要求建准。
ALTER TABLE EMP DROP CONSTRAINT FK_EMP_DEPT;
DROP TABLE EMP CASCADE;
数据导入在 disql 中支持 start 或反引号 ` 方式执行脚本,图形化工具导入只能用手工 commit,否则数据未真正落库:
-- disql 中执行 SQL 脚本(两种方式均可)
start /dm8/sql/create_emp.sql
`/dm8/sql/create_emp.sql
⚠️ 易错点(高频失分点):
- 图形化导入后必须手工 COMMIT;
- 按主外键依赖顺序导入——先导主表(DEPT),再导从表(EMP),否则外键约束报错;
- 导入失败先回头检查表与约束是否建对,而不是反复重导。
视图是考试最耗时、最难的一环,通常 2 个复杂视图 + 1 个物化视图。
普通视图不存储数据,本质是一条 SELECT 定义的"虚拟表"。复杂视图考察多表连接、聚合函数(GROUP BY)、子查询过滤等。
-- 复杂视图:多表连接 + 聚合 + 子查询过滤
CREATE OR REPLACE VIEW V_DEPT_SAL AS
SELECT D.DEPTNO, D.DNAME, SUM(E.SALARY) AS TOTAL_SAL
FROM DEPT D JOIN EMP E ON D.DEPTNO = E.DEPTNO
GROUP BY D.DEPTNO, D.DNAME
HAVING SUM(E.SALARY) > (SELECT AVG(SALARY) * 2 FROM EMP);
💡 考试技巧:先单独跑 SELECT 子句确认结果正确,再拼接
CREATE VIEW ... AS,避免视图创建失败反复调试。
物化视图真正存储数据,三种刷新方式必须分清:
| 刷新方式 | 关键字 | 说明 |
|---|---|---|
| 完全刷新 | COMPLETE | 全量重建(数据量小、简单场景) |
| 强制刷新 | FORCE | 能快速则快速,否则完全 |
| 快速刷新 | FAST | 增量刷新,必须先建物化视图日志表 |
-- ① 先建物化视图日志(快速刷新前提!高频失分点)
CREATE MATERIALIZED VIEW LOG ON EMP
WITH ROWID (EMPNO, ENAME, SALARY, DEPTNO)
PURGE START WITH SYSDATE REPEAT INTERVAL '1' DAY;
-- ② 创建物化视图(快速刷新 + 定时刷新计划)
CREATE MATERIALIZED VIEW MV_EMP_SAL
REFRESH FAST WITH ROWID START WITH SYSDATE NEXT SYSDATE + 1 AS
SELECT EMPNO, ENAME, SALARY FROM EMP WHERE SALARY >= 5000;
-- ③ 手动一次性刷新多个物化视图(DBMS_MVIEW 包,需先创建系统包)
SP_CREATE_SYSTEM_PACKAGES(1, 'DBMS_MVIEW');
CALL DBMS_MVIEW.REFRESH('MV_EMP_SAL', 'F'); -- F=快速刷新;也可 'FC' 混合刷新
⚠️ 高频失分点:物化视图增量刷新(fast)必须先建日志表,忘记建日志表或日志列不齐,刷新会失败。
-- 基本索引
CREATE INDEX IDX_EMP_SALARY ON EMP(SALARY);
-- 复合索引 + 指定表空间(注意索引表空间考点)
CREATE INDEX IDX_EMP_DEPT_SAL ON EMP(DEPTNO, SALARY) TABLESPACE TBS;
-- 重建 / 删除索引
ALTER INDEX IDX_EMP_SALAY REBUILD;
DROP INDEX IDX_EMP_SALARY;
💡 索引作用是加速查询,创建索引主要注意:表空间指定、复合索引列顺序、是否唯一(
CREATE UNIQUE INDEX)。
dexp(逻辑导出)/ dimp(逻辑导入)位于 bin 目录,四种级别互斥:
| 级别 | 关键字 | 说明 |
|---|---|---|
| 数据库级 | FULL | 导出/导入整个数据库 |
| 用户级 | OWNER | 一个或多个用户的所有对象 |
| 模式级 | SCHEMAS | 一个或多个模式的所有对象 |
| 表级 | TABLE | 一个或多个指定表/分区 |
# 全库导出
./dexp SYSDBA/Dameng123 file=/dm8/backup/full.dmp log=/dm8/backup/full.log full=y
# 用户导出 / 模式导出 / 表导出
./dexp SYSDBA/Dameng123 file=usr.dmp owner=('TEST01')
./dexp SYSDBA/Dameng123 file=sche.dmp schemas='DMHR'
./dexp SYSDBA/Dameng123 file=tab.dmp tables=('DMHR.EMPLOYEE')
# 大库必备:多文件分割(FILE 必须含 %U,FILESIZE 每文件上限)
./dexp SYSDBA/Dameng123 file=full_%U.dmp filesize=128m full=y
关键参数:DIRECTORY(导出目录)、FILESIZE(单文件大小,须配 %U)、PARALLEL(并行)、COMPRESS(压缩)、QUERY(过滤条件)、ENCRYPT_PASSWORD(加密)。
# 全库导入
./dimp SYSDBA/Dameng123 file=/dm8/backup/full.dmp full=y
# 表存在时的行为:SKIP / APPEND / TRUNCATE / REPLACE
./dimp SYSDBA/Dameng123 file=tab.dmp tables=('EMP') table_exists_action=replace
# 模式映射(考试易错点)
./dimp SYSDBA/Dameng123 file=sche.dmp schemas='SRC' remap_schema=SRC:DST
# 大数据量调优
./dimp SYSDBA/Dameng123 file=full.dmp full=y PARALLEL=8 TABLE_PARALLEL=4 \
FAST_LOAD=Y COMMIT_ROWS=10000
⚠️ 易错点汇总:
- **模式映射(REMAP_SCHEMA)**是高频易错点,跨用户导入必须配对;
- 目录权限不足报
-7020→chown -R dmdba:dinstall <目录>;- 源库 GB18030 / 目标库 UTF-8 会造成中文乱码,初始化时字符集要保持一致;
- 大库禁用本机执行 dexp/dimp:导出工具内存峰值可达数 GB,可能触发 OOM Killer 误杀 dmserver 进程,生产环境务必在独立备份机执行(引自知达梦知识库《达梦备份恢复知识库》生产禁令)。
考试通常只考存储函数,典型题是"根据员工编码 + 月份返回工资(含考勤扣款)",重点是入参合法性检查与异常处理——异常时必须返回错误值而不是报错(高频失分点)。
-- 存储函数:按月返回员工实发工资,异常返回 -1
CREATE OR REPLACE FUNCTION F_GET_SAL (
P_EMPNO INT,
P_MONTH VARCHAR(6)
) RETURN NUMERIC(10,2)
AS
V_SAL NUMERIC(10,2);
BEGIN
-- 入参合法性检查
IF P_EMPNO IS NULL OR P_MONTH IS NULL THEN
RETURN -1;
END IF;
-- 查询工资(查无此人由异常统一处理)
SELECT SALARY INTO V_SAL FROM EMP WHERE EMPNO = P_EMPNO;
IF SQL%NOTFOUND THEN
RETURN -1;
END IF;
RETURN V_SAL;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN -1;
WHEN OTHERS THEN
RETURN -1;
END;
/
-- 调用
SELECT F_GET_SAL(1001, '202609') FROM DUAL;
⚠️ 易错点:异常分支必须
RETURN错误值,出口统一,不能抛异常让调用端 CRASH。存储过程用CREATE OR REPLACE PROCEDURE,逻辑同函数。
ODBC 是"送分题",按模板改参数即可,关键是核对连接参数。
# odbcinst.ini:注册驱动
[DM8ODBC]
Description = DM ODBC DSN
Driver = /dm8/bin/libdmdpi.so # 以实际安装路径为准
# odbc.ini:配置数据源(核对端口/用户/密码/服务器名)
[DM8]
Description = DM Database
Driver = DM8ODBC
SERVER = localhost
UID = SYSDBA
PWD = Dameng123
TCP_PORT = 5236
验证:isql DM8 进入 ODBC 交互,执行 select * from dual;。
# 关键:配置环境变量(root 没有 LD_LIBRARY_PATH,需手动添加)
export PATH=$PATH:/dm8/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm8/bin
import dmPython
conn = dmPython.connect(user='SYSDBA', password='Dameng123',
server='localhost', port=5236)
cur = conn.cursor()
cur.execute('SELECT EMPNO, ENAME FROM EMP WHERE DEPTNO=20')
for row in cur.fetchall():
print(row)
cur.close()
conn.close()
💡 经验:Python 接口题会提供模板,考试时改参数即可,属于易拿分项。
| # | 踩坑点 | 解决方案 |
|---|---|---|
| 1 | 初始化参数(页/簇/大小写敏感/字符集)设错 | 只能删除实例重新初始化,先看题再点确认 |
| 2 | SYSDBA 密码大小写输错(Caps Lock) | 保持 Caps Lock 状态一致;错了重建实例 |
| 3 | 图形化工具报 invalid(NULL) pointer / 核心转储 |
重配 DISPLAY,在 xhost + 的同一窗口启动 |
| 4 | 数据导入失败 | 检查表/约束;按主外键顺序;图形化记得 commit |
| 5 | 物化视图快速刷新失败 | 先建物化视图日志表再建物化视图 |
| 6 | 备份报 -8055 备份目录冲突 |
备份集与归档集分开目录,清掉旧备份集 |
| 7 | 备份报 -718 归档日志不连续 |
执行 checkpoint(100) 或重启数据库 |
| 8 | 还原报 DB_MAGIC 不匹配 |
还原必须是同一个库;跨库需 recover ... update db_magic |
| 9 | 数据文件读写出错 | 用 root 操作了 console 导致权限变更,改用 dmdba |
| 10 | dimp 导入中文乱码 | 源/目标库字符集一致(GB18030/UTF-8) |
| 11 | 存储函数异常报错崩溃 | 异常分支统一 RETURN 错误值,禁止抛异常 |
| 12 | 密码带特殊字符连接失败 | 转义:'SYSDBA/"Dameng@123":5236' |
文章
阅读量
获赞
