注册
DCA学习笔记
专栏/技术分享/ 文章详情 /

DCA学习笔记

DM_407202 2026/08/28 116 0 0
摘要

第 1 题:在银河麒麟 v10 上安装 DM8 数据库系统

重点与注意事项:

  • 用户与权限规划:必须以 root 用户创建安装用户组 dinstall 和用户 dmdba,并提前创建安装主目录 /dm,将其所属用户与所属组修改为 dmdba:dinstall

  • 环境变量与临时空间:若 /tmp 分区不足 2G,需在 dmdba.bash_profile 中设置 DM_INSTALL_TMPDIR 变量指向有空间的目录。

  • Root 配置脚本:安装完成(无论是图形化还是命令行)后,必须使用 root 权限执行 /dm/script/root/root_installer.sh 脚本以配置底层系统服务(如 DmAPService)。

# 1. 检查软硬件环境(以 root 用户执行) uname -r free -m df -h # 2. 创建安装用户与组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba # 3. 创建安装目录并授权 mkdir -p /dm chown -R dmdba:dinstall /dm # 4. 挂载安装 ISO 镜像(以 /opt/dm8.iso 为例) mkdir -p /mnt/dm mount -o loop /opt/dm8.iso /mnt/dm # 5. 切换为 dmdba 用户进行命令行安装 su - dmdba cd /mnt/dm ./DMInstall.bin -i # 交互选项选择:语言选[1 简体中文],无 Key 文件输入 n,时区确认,安装类型选[1 典型安装],安装目录指定为 /dm,确认安装 # 6. 新开终端以 root 身份执行配置脚本 /dm/script/root/root_installer.sh

第 2 题:创建工资管理系统数据库实例

重点与注意事项:

  • 不可逆初始化参数PAGE_SIZE(页大小=16K)、EXTENT_SIZE(簇大小=16页)、CHARSET(字符集:UTF-8 对应值为 1 或 utf-8)在实例初始化完成后无法修改,必须在初始化阶段精确指定。

  • 日志文件配置:题目要求日志大小为 1G(即 LOG_SIZE=1024),且包含 3 个联机日志文件。使用 dminit 命令行初始化时默认创建两个日志文件,初始化完成后需进入数据库通过 ALTER DATABASE ADD LOGFILE 添加第 3 个日志文件。

  • 服务注册与启动:初始化后需用 root 用户运行 dm_service_installer.sh 注册为系统守护服务。

# 1. 以 dmdba 用户使用 dminit 初始化实例 su - dmdba cd /dm/bin ./dminit PATH=/dm/data DB_NAME=DMSALM INSTANCE_NAME=DMSALMDB PORT_NUM=5240 PAGE_SIZE=16 EXTENT_SIZE=16 CHARSET=1 LOG_SIZE=1024 SYSDBA_PWD=Dameng123 # 2. 以 root 用户注册系统服务 su - root cd /dm/script/root ./dm_service_installer.sh -t dmserver -p DMSALMDB -dm_ini /dm/data/DMSALM/dm.ini # 3. 启动实例服务 systemctl start DmServiceDMSALMDB.service # 4. 登录数据库,添加第 3 个 1G 的联机日志文件 su - dmdba cd /dm/bin ./disql SYSDBA/Dameng123:5240
-- 在 disql 中执行添加第 3 个日志文件 ALTER DATABASE ADD LOGFILE '/dm/data/DMSALM/DMSALM03.log' SIZE 1024;

第 3 题:创建表空间与数据文件

重点与注意事项:

  • 目录权限:存储路径 /dm/data/DMSALM 必须已存在且 dmdba 拥有读写权限。

  • 扩展属性参数AUTOEXTEND ON 开启自动扩展,每次扩展 NEXT 32(MB),文件最大值 MAXSIZE 10240(MB 对应 10G)。

-- 连接数据库 CONN SYSDBA/Dameng123:5240; -- (1) 创建业务数据表空间 TSAL(包含两个 512M 数据文件) CREATE TABLESPACE TSAL DATAFILE '/dm/data/DMSALM/TSAL_01.DBF' SIZE 512 AUTOEXTEND ON NEXT 32 MAXSIZE 10240, '/dm/data/DMSALM/TSAL_02.DBF' SIZE 512 AUTOEXTEND ON NEXT 32 MAXSIZE 10240; -- (2) 创建索引表空间 TINDEX(包含一个 128M 数据文件) CREATE TABLESPACE TINDEX DATAFILE '/dm/data/DMSALM/TINDEX_01.DBF' SIZE 128 AUTOEXTEND ON NEXT 32 MAXSIZE 10240;

第 4 题:创建角色 ROLE_SALM 并授权

重点与注意事项:

  • 题目要求创建角色 ROLE_SALM,并赋予创建表、视图、索引、物化视图、存储过程的权限。

  • 对应的系统权限关键字分别为:CREATE TABLECREATE VIEWCREATE INDEXCREATE MATERIALIZED VIEWCREATE PROCEDURE

-- 1. 创建角色 CREATE ROLE ROLE_SALM; -- 2. 为角色授予所需的系统权限 GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE MATERIALIZED VIEW, CREATE PROCEDURE TO ROLE_SALM;

第 5 题:创建资源配置文件 PRO_SALM

重点与注意事项:

  • 密码重用限制:修改 3 次后才能重复使用旧密码,参数为 PASSWORD_REUSE_TIMEPASSWORD_REUSE_MAXPASSWORD_REUSE_MAX 3 表示密码可重用前必须经过的密码修改次数)。

  • 非活跃锁定与失败次数:超过 90 天未登录锁定为 INACTIVE_ACCOUNT_TIME 90(或部分版本资源配置参数 FAILED_LOGIN_ATTEMPS 5 限制登录失败 5 次即锁定)。

-- 创建安全资源配置文件 PRO_SALM CREATE PROFILE PRO_SALM LIMIT PASSWORD_REUSE_MAX 3 INACTIVE_ACCOUNT_TIME 90 FAILED_LOGIN_ATTEMPS 5;

第 6 题:创建用户 U_DMSALM 并分配权限与资源

重点与注意事项:

  • 参数与空间配置:在一条 CREATE USER 语句中一次性指定密码、默认数据表空间 DEFAULT TABLESPACE TSAL、默认索引表空间 DEFAULT INDEX TABLESPACE TINDEX、资源配置文件 PROFILE PRO_SALM

  • 权限授予:分别授予指定的系统权限及预置角色 RESOURCEVTI、自定义角色 ROLE_SALM

-- 1. 创建用户并指定表空间与资源限制 CREATE USER U_DMSALM IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE TSAL DEFAULT INDEX TABLESPACE TINDEX PROFILE PRO_SALM; -- 2. 赋予系统权限 GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX TO U_DMSALM; -- 3. 赋予角色权限 GRANT RESOURCE, VTI, ROLE_SALM TO U_DMSALM;

第 7 题:在 U_DMSALM 模式下建表、导入数据及创建索引/视图

重点与注意事项:

  • 建表与外键顺序:必须先建主表(DEPT 部门表),再建包含外键关联的从表 EMP,最后创建依赖员工表的 SALARY 表。自增列主键定义采用 IDENTITY(1,1)

  • 数据导入顺序与中文符号清理:题目给定脚本中含有中文引号(如 ’101’ 等)及拼写错误(如 NUL),导入前必须全部替换为合法的标准 SQL 语法(NULL、英文单引号 '、英文分号 ;)。数据插入必须严格遵循 DEPT \rightarrow EMP \rightarrow SALARY 的顺序以满足外键约束依赖。

  • 索引与视图定义:在 EMP(ENAME) 上创建索引时必须使用 STORAGE (ON TINDEX) 将其存放在 TINDEX 索引表空间。

-- 切换至目标用户环境或使用管理员操作 CONN U_DMSALM/Dameng123:5240; -- 1. 创建 DEPT 表 CREATE TABLE U_DMSALM.DEPT ( DEPTNO INT NOT NULL, DNAME VARCHAR(14), LOCATION VARCHAR(13), CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO) ); -- 2. 创建 EMP 表 CREATE TABLE U_DMSALM.EMP ( EMPNO INT NOT NULL, ENAME VARCHAR(50), HIREDATE DATE, COMM TEXT, DEPTNO INT, CONSTRAINT PK_EMP PRIMARY KEY (EMPNO), CONSTRAINT FK_EMP_DEPT FOREIGN KEY (DEPTNO) REFERENCES U_DMSALM.DEPT(DEPTNO) ); -- 3. 创建 SALARY 表 CREATE TABLE U_DMSALM.SALARY ( SERIALNUM INTEGER IDENTITY(1, 1) NOT NULL, EMPNO INT NOT NULL, BASICSAL DEC(7,2), BONUS DEC(7,2), COMM TEXT, CONSTRAINT PK_SALARY PRIMARY KEY (SERIALNUM), CONSTRAINT FK_SALARY_EMP FOREIGN KEY (EMPNO) REFERENCES U_DMSALM.EMP(EMPNO) ); -- 4. 导入数据(按外键依赖严格按顺序导入) -- 步骤 (1):导入 DEPT 数据 INSERT INTO U_DMSALM.DEPT(DEPTNO, DNAME, LOCATION) VALUES (101, '总经理办', '北三环西路'), (102, '行政部', '北三环西路'), (103, '开发部', '北三环西路'), (104, '市场部', '关山一路'), (105, '技术支持部', '东湖开发区'), (201, '总经理办', '关山一路'), (202, '行政部', '关山一路'), (304, '技术支持部', '体育东路'); COMMIT; -- 步骤 (2):导入 EMP 数据 INSERT INTO U_DMSALM.EMP(EMPNO, ENAME, HIREDATE, COMM, DEPTNO) VALUES (1001, '马学铭', '2008-05-30', NULL, 101), (1002, '程擎武', '2012-03-27', NULL, 101), (1003, '郑吉群', '2010-12-27', NULL, 101), (2001, '李慧军', '2010-05-15', NULL, 201), (2002, '常鹏程', '2011-08-06', NULL, 201); COMMIT; -- 步骤 (3):导入 SALARY 数据 INSERT INTO U_DMSALM.SALARY(SERIALNUM, EMPNO, BASICSAL, BONUS, COMM) VALUES (1, 1001, 18000, 12000, NULL), (2, 1002, 8000, 10000, NULL), (3, 1003, 10000, 5000, NULL), (4, 2001, 9000, 1100, '迟到2次'), (5, 2002, 5000, 0, NULL); COMMIT; -- 5. 在 EMP 表的 ENAME 列上创建索引,指定存储在 TINDEX 表空间 CREATE INDEX ind_ename ON U_DMSALM.EMP(ENAME) STORAGE (ON TINDEX); -- 6. 创建视图 V_EMPSAL CREATE OR REPLACE VIEW U_DMSALM.V_EMPSAL AS SELECT e.EMPNO AS 员工编码, e.ENAME AS 员工名称, d.DNAME AS 部门名称, s.BASICSAL AS 薪资, e.HIREDATE AS 入职日期 FROM U_DMSALM.EMP e JOIN U_DMSALM.DEPT d ON e.DEPTNO = d.DEPTNO JOIN U_DMSALM.SALARY s ON e.EMPNO = s.EMPNO ORDER BY s.BASICSAL DESC;

第 8 题:创建视图 V_TOTAL

重点与注意事项:

  • 工资总额定义为 (NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) 并起别名为 S_SALARY,使用 NVL 预防空值计算异常。

  • 按照计算列 S_SALARY DESC 倒序排序。

CREATE OR REPLACE VIEW U_DMSALM.V_TOTAL AS SELECT d.DNAME, e.ENAME, (NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) AS S_SALARY FROM U_DMSALM.EMP e JOIN U_DMSALM.DEPT d ON e.DEPTNO = d.DEPTNO JOIN U_DMSALM.SALARY s ON e.EMPNO = s.EMPNO ORDER BY S_SALARY DESC;

第 9 题:创建手动刷新的物化视图 V_TJ

重点与注意事项:

  • 手动完全刷新:物化视图定义中指定 BUILD IMMEDIATE REFRESH COMPLETE ON DEMAND

  • 分组过滤与聚合:按部门编码及名称分组聚合统计最高(MAX)、最低(MIN)、平均(AVG)、总额(SUM)及人数(COUNT),并通过 HAVING AVG(...) > 10000 过滤,最后指定 ORDER BY AVG(...) 排序。

CREATE MATERIALIZED VIEW U_DMSALM.V_TJ BUILD IMMEDIATE REFRESH COMPLETE ON DEMAND AS SELECT d.DEPTNO, d.DNAME, MAX(NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) AS MAX_SALARY, MIN(NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) AS MIN_SALARY, AVG(NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) AS AVG_SALARY, SUM(NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) AS SUM_SALARY, COUNT(e.EMPNO) AS EMP_COUNT FROM U_DMSALM.DEPT d JOIN U_DMSALM.EMP e ON d.DEPTNO = e.DEPTNO JOIN U_DMSALM.SALARY s ON e.EMPNO = s.EMPNO GROUP BY d.DEPTNO, d.DNAME HAVING AVG(NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)) > 10000 ORDER BY AVG_SALARY; -- 执行手动刷新测试 REFRESH MATERIALIZED VIEW U_DMSALM.V_TJ COMPLETE;

第 10 题:编写存储函数 U_DMSALM.F_GETGZ

重点与注意事项:

  • 输出内容拼接:通过 SELECT ... INTO 获取工资总额与备注,若备注为 NULL 则转换为空字符串输出。

  • 异常捕获:在 EXCEPTION 部分捕获所有异常(包括无数据或数据格式异常),打印错误信息并按题目要求返回 -1000

CREATE OR REPLACE FUNCTION U_DMSALM.F_GETGZ( v_empno IN INT, v_deptno IN INT ) RETURN VARCHAR IS v_total_sal DEC(10,2) := 0; v_comm VARCHAR(1000) := ''; v_result VARCHAR(1000); BEGIN SELECT (NVL(s.BASICSAL, 0) + NVL(s.BONUS, 0)), NVL(s.COMM, '') INTO v_total_sal, v_comm FROM U_DMSALM.EMP e JOIN U_DMSALM.SALARY s ON e.EMPNO = s.EMPNO WHERE e.EMPNO = v_empno AND e.DEPTNO = v_deptno; v_result := '工资总额:' || v_total_sal || ', 备注:' || v_comm; RETURN v_result; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN '-1000'; WHEN OTHERS THEN RETURN '-1000'; END; / -- 调用测试 SELECT U_DMSALM.F_GETGZ(1001, 101);

第 11 题:对 SALARY 表做逻辑备份

重点与注意事项:

  • 导出目录与权限:导出目标目录 /bakcup(注意题干路径拼写)必须提前创建且 dmdba 有写权限。

  • 单表导出语法:使用 ./dexp 工具,指定 TABLES=U_DMSALM.SALARY 参数导出单表。

# 1. 创建备份存放目录并授权(以 root 或 dmdba 执行) mkdir -p /bakcup chown -R dmdba:dinstall /bakcup # 2. 以 dmdba 用户执行 dexp 单表导出 cd /dm/bin ./dexp U_DMSALM/Dameng123:5240 FILE=salary.dmp DIRECTORY=/bakcup LOG=salary_exp.log TABLES=U_DMSALM.SALARY

第 12 题:创建用户 SAL_BAK 并完成模式对象导入

重点与注意事项:

  • 先导出后导入:先用 dexp 导出 U_DMSALM 整个模式,再用 dimp 导入。

  • 模式重映射(REMAP_SCHEMA):导入时必须配置参数 REMAP_SCHEMA=U_DMSALM:SAL_BAK,将对象所有权直接重映射到新用户。

-- 1. 登录数据库创建 SAL_BAK 用户并赋予相应权限 CONN SYSDBA/Dameng123:5240; CREATE USER SAL_BAK IDENTIFIED BY "Dameng123" DEFAULT TABLESPACE TSAL; GRANT RESOURCE, PUBLIC TO SAL_BAK;
# 2. 导出 U_DMSALM 整个模式 cd /dm/bin ./dexp SYSDBA/Dameng123:5240 FILE=dmsalm_schema.dmp DIRECTORY=/bakcup LOG=dmsalm_exp.log SCHEMAS=U_DMSALM # 3. 将导出的模式数据导入至 SAL_BAK 用户下 ./dimp SYSDBA/Dameng123:5240 FILE=dmsalm_schema.dmp DIRECTORY=/bakcup LOG=salbak_imp.log REMAP_SCHEMA=U_DMSALM:SAL_BAK

第 13 题:配置 Python 接口并测试连接

重点与注意事项:

  • 动态库与 DPI 环境dmPython 依赖达梦底层的 DPI 动态库,必须在操作系统中设置 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/bin

  • 模块安装:进入达梦安装包驱动目录 /dm/drivers/python/dmPython 执行安装。

# 1. 安装 dmPython 模块(以 root 或 dmdba 执行) cd /dm/drivers/python/dmPython python3 setup.py install # 2. 配置运行时环境变量(写入 /home/dmdba/.bash_profile) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/bin source /home/dmdba/.bash_profile # 3. 编写测试脚本 test_dm.py 并执行验证 cat << 'EOF' > /home/dmdba/test_dm.py import dmPython try: conn = dmPython.connect(user='U_DMSALM', password='Dameng123', server='localhost', port=5240) cursor = conn.cursor() cursor.execute('SELECT DNAME, ENAME, S_SALARY FROM U_DMSALM.V_TOTAL') rows = cursor.fetchall() print("数据库连接成功!V_TOTAL 数据查询结果:") for row in rows: print(row) cursor.close() conn.close() except Exception as e: print("连接或执行失败:", e) EOF # 运行 Python 连接测试 python3 /home/dmdba/test_dm.py
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服