重点与注意事项:
用户与权限规划:必须以 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
重点与注意事项:
不可逆初始化参数: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;
重点与注意事项:
目录权限:存储路径 /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;
重点与注意事项:
题目要求创建角色 ROLE_SALM,并赋予创建表、视图、索引、物化视图、存储过程的权限。
对应的系统权限关键字分别为:CREATE TABLE、CREATE VIEW、CREATE INDEX、CREATE MATERIALIZED VIEW、CREATE PROCEDURE。
-- 1. 创建角色
CREATE ROLE ROLE_SALM;
-- 2. 为角色授予所需的系统权限
GRANT CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE MATERIALIZED VIEW, CREATE PROCEDURE TO ROLE_SALM;
重点与注意事项:
密码重用限制:修改 3 次后才能重复使用旧密码,参数为 PASSWORD_REUSE_TIME 或 PASSWORD_REUSE_MAX(PASSWORD_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;
重点与注意事项:
参数与空间配置:在一条 CREATE USER 语句中一次性指定密码、默认数据表空间 DEFAULT TABLESPACE TSAL、默认索引表空间 DEFAULT INDEX TABLESPACE TINDEX、资源配置文件 PROFILE PRO_SALM。
权限授予:分别授予指定的系统权限及预置角色 RESOURCE、VTI、自定义角色 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;
重点与注意事项:
建表与外键顺序:必须先建主表(DEPT 部门表),再建包含外键关联的从表 EMP,最后创建依赖员工表的 SALARY 表。自增列主键定义采用 IDENTITY(1,1)。
数据导入顺序与中文符号清理:题目给定脚本中含有中文引号(如 ’101’、, 等)及拼写错误(如 NUL),导入前必须全部替换为合法的标准 SQL 语法(NULL、英文单引号 '、英文分号 ;)。数据插入必须严格遵循 DEPT → EMP → 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;
重点与注意事项:
工资总额定义为 (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;
重点与注意事项:
手动完全刷新:物化视图定义中指定 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;
重点与注意事项:
输出内容拼接:通过 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);
重点与注意事项:
导出目录与权限:导出目标目录 /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
重点与注意事项:
先导出后导入:先用 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
重点与注意事项:
动态库与 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
文章
阅读量
获赞
