注册
dca学习总结
专栏/技术分享/ 文章详情 /

dca学习总结

zxw 2026/09/30 248 0 0
摘要

达梦DCA学习笔记

一、部署与实例生命周期

安装

DM8支持图形化和命令行两种安装方式。推荐练熟命令行:

sudo mkdir -p /dm/dmdbms su - dmdba ./DMInstall.bin -i sudo /dm/dmdbms/script/root/root_installer.sh

-i 进入交互式安装,依次选语言、key文件(可跳过)、安装路径、安装类型。装完必须执行 root_installer.sh,它负责创建DmAPService等系统服务,漏掉这一步后面注册实例服务会出问题。安装前可以用 ldd --version 和 uname -r 确认glibc和内核版本满足要求,DM对麒麟、统信等国产系统都有适配。

初始化实例

实例由 dminit 创建:

/dm/dmdbms/bin/dminit path=/dm/data DB_NAME=HRDB INSTANCE_NAME=HRSVR \ PORT_NUM=5237 CHARSET=1 PAGE_SIZE=16 EXTENT_SIZE=16 \ LOG_SIZE=512 LOG_PATH=/dm/data/HRDB/DM01.log \ LOG_PATH=/dm/data/HRDB/DM02.log LOG_PATH=/dm/data/HRDB/DM03.log \ SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123

需要特别注意的是一组"建库即定型"的参数:CHARSET(1为UTF-8,0为GB18030)、PAGE_SIZE(页大小,4/8/16/32K)、EXTENT_SIZE(簇大小)、CASE_SENSITIVE(大小写敏感性)。这些在实例创建后都无法修改,选错了就得重建。

实例创建后,数据文件、控制文件、联机日志都落在 path 指定目录下,主配置文件是 dm.ini,后续内存、连接数、兼容性参数都在里面调。

服务管理与卸载

实例注册为系统服务后通过脚本启停:

sudo /dm/dmdbms/script/root/dm_service_installer.sh -t dmserver \ -dm_ini /dm/data/HRDB/dm.ini -p DMSERVER ./DmServiceDMSERVER start # start | stop | restart | status

一台服务器只能安装一套DM软件,装新版本前要先卸载旧版。卸载同样分图形化和命令行两种方式,命令行是 uninstall.sh -i,交互中会询问是否删除 dm_svc.conf 配置文件。卸载前先停掉所有实例服务。

二、存储体系:表空间与重做日志

表空间是DM中最大的逻辑存储单元。考试中要求数据和索引分离存放,这本身就是存储设计的良好实践—分散IO压力:

CREATE TABLESPACE HRDATA DATAFILE '/dm/data/HRDB/HRDATA01.DBF' SIZE 128 AUTOEXTEND ON NEXT 64 MAXSIZE 20480, '/dm/data/HRDB/HRDATA02.DBF' SIZE 128 AUTOEXTEND ON NEXT 64 MAXSIZE 20480; CREATE TABLESPACE HRIDX DATAFILE '/dm/data/HRDB/HRIDX.DBF' SIZE 64 AUTOEXTEND ON NEXT 32 MAXSIZE 10240;

表空间的日常维护操作手册讲得很全,值得记住的有四类:

-- 增加数据文件 ALTER TABLESPACE dmdata ADD DATAFILE '/dm/data/DAMENG/DMDATA03.DBF' SIZE 500; -- 调整文件大小(可增可缩) ALTER TABLESPACE dmdata RESIZE DATAFILE '/dm/data/DAMENG/DMDATA01.DBF' TO 256; -- 修改自动扩展属性 ALTER TABLESPACE dmdata DATAFILE '/dm/data/DAMENG/DMDATA02.DBF' AUTOEXTEND OFF; -- 迁移文件路径:先脱机,改名,再联机 ALTER TABLESPACE dmdata OFFLINE; ALTER TABLESPACE dmdata RENAME DATAFILE '/dm/data/DAMENG/DMDATA01.DBF' TO '/dm/data/DAMENG/TBS/DMDATA01.DBF'; ALTER TABLESPACE dmdata ONLINE;

手册的常见问题里有一个很典型的报错:创建表空间时报 [-7014]:创建数据文件失败,原因不是SQL写错了,而是dmdba用户对目标目录没有写权限。数据库报错不一定出在数据库层,遇到错误先看操作系统权限。

重做日志(REDO)记录所有数据页的修改。实例运行中可以在线扩容:

ALTER DATABASE ADD LOGFILE '/dm/data/DAMENG/DAMENG03.log' SIZE 256; ALTER DATABASE RESIZE LOGFILE '/dm/data/DAMENG/DAMENG03.log' TO 500;

dminit阶段写了三个LOG_PATH就是三个联机日志文件,后期不够可以随时加。

三、用户与权限体系

DM的权限体系是三层结构:PROFILE管口令策略,角色打包权限,用户挂接前两者:

CREATE PROFILE PRO_HR LIMIT PASSWORD_REUSE_MAX 3 PASSWORD_LIFE_TIME 90; CREATE ROLE ROLE_HR; GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE MATERIALIZED VIEW, CREATE PROCEDURE TO ROLE_HR; CREATE USER HR IDENTIFIED BY "Dameng123" PROFILE PRO_HR DEFAULT TABLESPACE HRDATA DEFAULT INDEX TABLESPACE HRIDX; GRANT ROLE_HR TO HR;

PROFILE的常用参数除了密码复用次数(PASSWORD_REUSE_MAX)和有效期(PASSWORD_LIFE_TIME),还有 FAILED_LOGIN_ATTEMPTS(失败锁定阈值)、PASSWORD_LOCK_TIME(锁定时长)、PASSWORD_GRACE_TIME(过期宽限期)。

这里有一个值得单独说的边界问题。考题里有个需求是"用户超过90天未登录则锁定账号",但翻遍PROFILE的参数列表,并不存在原生的"未登录天数"选项。实际工程中这个需求要靠登录触发器检查上次登录时间来实现。

另外DM自带三权分立设计,SYSDBA管数据库、SYSAUDITOR管审计,初始化时分别设置密码。

还有一个手册里的高频报错值得记录:跨用户调用函数时报 [-5505]:没有执行XX对象权限,解法是由属主授权:

GRANT EXECUTE ON dmhr.f_getempemail TO testuser;

四、SQL与模式对象

表与约束

DM的DDL语法与Oracle高度兼容,主键、外键、CHECK、默认值一应俱全:

ALTER TABLE HR.T_EMP ADD CONSTRAINT PK_T_EMP PRIMARY KEY (EMP_ID); ALTER TABLE HR.T_EMP ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (DEPT_ID) REFERENCES HR.T_DEPT(DEPT_ID); ALTER TABLE HR.T_EMP ADD CONSTRAINT CK_EMP_SALARY CHECK (SALARY >= 1800); ALTER TABLE HR.T_ATDLOG MODIFY LOGTIME DEFAULT SYSDATE;

约束命名建议养成 PK_表名、FK_子表_父表、CK_表名_字段 的习惯,出问题时报错信息里的约束名能直接告诉你错在哪。外键的存在还决定了数据装载顺序:必须先导父表再导子表,顺序反了就是连锁约束报错。

视图与条件聚合

统计类视图的核心技巧是 SUM(CASE WHEN ... THEN 1 ELSE 0 END) 条件聚合。考试里用它按部门、员工、月份统计迟到和早退次数:

CREATE OR REPLACE VIEW HR.V_EMPLATETIMES AS SELECT D.DEPT_NAME, E.EMP_NAME, TO_CHAR(A.LOGTIME, 'YYYYMM') AS ATTENDANCE_MONTH, SUM(CASE WHEN A.ATDTYPE = 1 AND A.STATUS = 1 THEN 1 ELSE 0 END) AS LATE_COUNT, SUM(CASE WHEN A.ATDTYPE = 2 AND A.STATUS = 1 THEN 1 ELSE 0 END) AS EARLY_LEAVE_COUNT FROM HR.T_ATDLOG A JOIN HR.T_EMP E ON A.EMP_ID = E.EMP_ID JOIN HR.T_DEPT D ON A.DEPT_ID = D.DEPT_ID WHERE A.STATUS = 1 GROUP BY D.DEPT_NAME, E.EMP_NAME, TO_CHAR(A.LOGTIME, 'YYYYMM');

一行数据按条件折算成1或0再求和,比嵌套子查询拼COUNT清晰一些。

物化视图

物化视图和普通视图的本质区别是数据是否真实落盘:普通视图保存的是一段SQL,每次查询现算;物化视图存储结果集,查询快但需要在源表变更后刷新:

CREATE MATERIALIZED VIEW HR.MV_ATDLATE TABLESPACE HRDATA AS SELECT LOGTIME, EMP_ID, DEPT_ID, ATDTYPE, STATUS FROM HR.T_ATDLOG WHERE STATUS = 1; REFRESH MATERIALIZED VIEW HR.MV_ATDLATE;

建好先手动REFRESH再验证数据,否则查到的是空集。

索引

索引单独建到HRIDX表空间,与数据文件物理隔离:

CREATE INDEX HR.IX_ATDLOG_LOGTIME ON HR.T_ATDLOG(LOGTIME) TABLESPACE HRIDX;

五、逻辑备份与还原

dexp/dimp是DM的逻辑导出导入工具,对标Oracle的exp/imp。导出有FULL(整库)、OWNER(按用户)、SCHEMAS(按模式)、TABLES(按表)四种级别,日常迁移业务用户用SCHEMAS最顺手:

cd /dm/dmdbms/bin ./dexp USERID=HR/Dameng123@localhost:5237 FILE=hr.dmp LOG=hr.log \ DIRECTORY=/dm/backup/dexp SCHEMAS=HR

导入时 REMAP_SCHEMA 可以完成属主映射,把HR的全部对象和数据搬进新用户HREXP:

./dimp USERID=HREXP/Dameng123@localhost:5237 FILE=/dm/backup/dexp/hr.dmp \ LOG=hr_imp.log SCHEMAS=HR REMAP_SCHEMA=HR:HREXP

两个使用要点:DIRECTORY目录要提前手动创建,工具不会建;导入完成后用 DBA_OBJECTS 检查有没有STATUS为INVALID的对象,视图依赖关系错乱时会出现,必要时重新编译或重导。

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE OWNER = 'HREXP';

六、程序开发:触发器

触发器

手册把触发器放在开发的最后,分两类。表级触发器的经典场景是审计留痕——删除员工的瞬间把旧记录抄进历史表:

CREATE OR REPLACE TRIGGER dmhr.tr_delemp BEFORE DELETE ON dmhr.employee FOR EACH ROW BEGIN INSERT INTO dmhr.emp_history(employee_id, employee_name, phone_num, start_date, end_date, job_id, department_id, salary) VALUES(:OLD.employee_id, :OLD.employee_name, :OLD.phone_num, :OLD.hire_date, curdate, :OLD.job_id, :OLD.department_id, :OLD.salary); END;

事件级触发器则可以做DDL防护,比如阻止对某个模式下对象的DROP和TRUNCATE:

CREATE OR REPLACE TRIGGER DMHR.TR_DDLPROTECT BEFORE DROP OR TRUNCATE ON DMHR.SCHEMA BEGIN RAISE_APPLICATION_ERROR(-20001, '不允许' || :EVENTINFO.OPTYPE || '对象' || :EVENTINFO.OBJECTNAME); END;

:OLD 伪记录和 :EVENTINFO 事件属性是两类触发器各自的核心抓手。

七、应用访问接口

DM把各语言驱动随服务端一起发布,drivers目录下有Python、JDBC、ODBC、DPI等接口,不用单独去找安装包。

dmPython走标准的DB-API 2.0风格,用过pymysql或cx_Oracle可以直接上手:

cd /dm/dmdbms/drivers/python/dmPython python3 setup.py install --user
import dmPython conn = dmPython.connect(user='HR', password='Dameng123', server='localhost', port=5237) cursor = conn.cursor() cursor.execute('SELECT * FROM HR.T_EMP WHERE ROWNUM <= 10') for row in cursor.fetchall(): print(row) cursor.close() conn.close()

ODBC方式则需要先源码编译unixODBC(configure、make、make install三部曲),再配置两个文件:odbcinst.ini声明驱动指向 /dm/dmdbms/drivers/odbc/libdodbc.so,odbc.ini配置数据源的服务器、端口、用户名密码,最后用 isql dm -v 测试连通。

按知识体系重新梳理一遍之后,DCA的轮廓其实很清晰:覆盖了DBA日常工作的完整闭环,从把软件装上、把实例建起来,到管存储、管权限、管对象、做备份、写程序、接应用。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服