目录
- 课程学习背景与 DM 数据库简介
- DM8 数据库安装与环境配置(图文教程)
- 实例创建与初始化配置
- 核心功能实战:备份还原操作指南
- DM 函数用法与 SQL 查询实战
- DM SQL 程序设计思路与步骤
- 常见问题排查与技巧总结
- 学习总结与国产数据库展望
1. 课程学习背景与 DM 数据库简介
在《国产数据库技术》课程学习中,我重点钻研了达梦数据库(DM8) —— 这款由武汉达梦数据库股份有限公司自主研发的企业级关系型数据库,具备完全自主知识产权,兼容 Oracle、MySQL 等主流数据库语法,在性能、安全性和兼容性上均达到国际先进水平,广泛应用于政务、金融、能源等关键领域。
通过课程学习,我深刻体会到国产数据库在 “去 IOE” 浪潮中的核心价值,本文将结合实操经验,从安装配置到程序开发,全方位分享 DM8 的学习心得,帮助开发者快速上手这款优秀的国产数据库。
2. DM8 数据库安装与环境配置(图文教程)
2.1 安装前准备
- 操作系统:CentOS 7.9(64 位)
- 硬件要求:CPU≥2 核,内存≥4GB,磁盘空间≥20GB
- 依赖包:glibc-devel、libaio-devel(提前通过yum install安装)
- 下载安装包:从达梦官网获取 DM8 安装介质(dm8_20230908_x86_rhel7_64.iso)
2.2 详细安装步骤
- 挂载安装包:
mkdir /mnt/dm8 mount -o loop dm8_20230908_x86_rhel7_64.iso /mnt/dm8- 创建安装用户与组:
groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba3.执行图形化安装:
切换至 dmdba 用户,进入挂载目录执行安装脚本:
su - dmdba cd /mnt/dm8 ./DMInstall.bin- 步骤 1:选择语言(中文)和时区(GMT+8)
- 步骤 2:接受许可协议
- 步骤 3:选择安装类型(典型安装,默认路径/home/dmdba/dmdbms)
- 步骤 4:等待安装完成(约 5-10 分钟),按提示执行 root 脚本:
su - root /home/dmdba/dmdbms/script/root/root_installer.sh2.3 环境变量配置
编辑/home/dmdba/.bashrc文件,添加以下内容:
export DM_HOME=/home/dmdba/dmdbms export PATH=$DM_HOME/bin:$PATH export LD_LIBRARY_PATH=$DM_HOME/lib:$LD_LIBRARY_PATH生效配置:source /home/dmdba/.bashrc,执行disql命令验证环境是否正常。
3. 实例创建与初始化配置
3.1 使用 dbca 工具创建实例
DM8 提供图形化工具dbca.sh快速创建实例,步骤如下:
- 执行cd $DM_HOME/bin && ./dbca.sh启动工具
- 选择 “创建数据库实例”,设置实例名称(如DMSERVER)、端口号(默认 5236)
- 配置数据文件存储路径(建议单独挂载磁盘,如/data/dm8/data)
- 设置 SYSDBA 用户密码(默认用户名SYSDBA,密码需包含大小写字母 + 数字)
- 选择初始化参数:字符集(UTF-8)、页大小(8KB)、日志文件大小(2GB)
- 确认配置并完成实例创建,启动实例:
systemctl start dm.service # 或 ./dmctl start /home/dmdba/dmdbms/data/DMSERVER/dm.ini3.2 客户端连接测试
使用 DM 管理工具(Windows 端)或disql命令行连接:
disql SYSDBA/Sysdba123@localhost:5236
连接成功后显示:
服务器[localhost:5236]:处于普通打开状态 登录使用时间 : 3.232(ms) disql V8 SQL>
4. 核心功能实战:备份还原操作指南
DM8 的备份还原功能支持全量、增量、日志备份,以下是实操步骤:
4.1 全量备份(命令行方式)
- 登录 disql,执行备份语句:
BACKUP DATABASE FULL TO BACKUP_FULL_20240501 BACKUPSET '/data/dm8/backup/full_20240501';- BACKUP DATABASE FULL:全量备份
- BACKUPSET:指定备份集存储路径
4.2 还原与恢复操作
假设数据库数据文件损坏,需通过备份集还原:
- 停止数据库实例:./dmctl stop /home/dmdba/dmdbms/data/DMSERVER/dm.ini
- 执行还原命令:
dmrestore INI_FILE=/home/dmdba/dmdbms/data/DMSERVER/dm.ini BACKUPSET='/data/dm8/backup/full_20240501'- 执行恢复命令(同步日志):
dmrestore RECOVER INI_FILE=/home/dmdba/dmdbms/data/DMSERVER/dm.ini BACKUPSET='/data/dm8/backup/full_20240501'- 启动数据库:./dmctl start /home/dmdba/dmdbms/data/DMSERVER/dm.ini
4.3 定时备份脚本(自动化方案)
编写 Shell 脚本实现每日全量备份,结合 crontab 定时执行:
#!/bin/bash BACKUP_DIR=/data/dm8/backup DATE=$(date +%Y%m%d) su - dmdba -c "disql SYSDBA/Sysdba123@localhost:5236 <UP DATABASE FULL TO BACKUP_FULL_$DATE BACKUPSET '$BACKUP_DIR/full_$DATE'; EOF" # 保留7天备份 find $BACKUP_DIR -name "full_*" -mtime +7 -delete
添加定时任务:crontab -e,添加0 2 * * * /home/dmdba/script/dm_backup.sh(每日凌晨 2 点执行)
5. DM 函数用法与 SQL 查询实战
DM8 兼容主流 SQL 函数,同时提供特有函数,以下结合实际场景举例:
5.1 常用函数示例
函数类型 | 示例 SQL | 功能说明 |
字符串函数 | SELECT CONCAT('DM', '数据库') AS 结果; | 拼接字符串,返回 “DM 数据库” |
日期函数 | SELECT DATEADD(DAY, 3, SYSDATE) AS 三天后; | 计算当前日期后 3 天 |
聚合函数 | SELECT DEPT_ID, AVG(SALARY) AS 平均工资 FROM EMP GROUP BY DEPT_ID; | 按部门统计平均工资 |
特有函数 | SELECT SF_GET_SESSION_ID() AS 会话ID; | 获取当前会话 ID(DM 特有) |
5.2 复杂查询实战:多表联查 + 条件过滤
场景:查询 “研发部” 员工中工资高于部门平均工资的员工信息,包含部门名称、员工姓名、工资:
SELECT d.DEPT_NAME, e.EMP_NAME, e.SALARY, (SELECT AVG(SALARY) FROM EMP WHERE DEPT_ID = d.DEPT_ID) AS 部门平均工资 FROM EMP e JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID WHERE d.DEPT_NAME = '研发部' AND e.SALARY > (SELECT AVG(SALARY) FROM EMP WHERE DEPT_ID = d.DEPT_ID);查询结果:
DEPT_NAME | EMP_NAME | SALARY | 部门平均工资 |
研发部 | 张三 | 15000 | 12000 |
研发部 | 李四 | 13000 | 12000 |
| | | | |
6. DM SQL 程序设计思路与步骤
DM8 支持 PL/SQL 风格的程序设计,包括存储过程、函数、触发器等,以下以 “员工工资调整存储过程” 为例,说明设计思路:
6.1 需求分析
实现按部门批量调整工资:
- 输入参数:部门 ID(DEPT_ID)、调整比例(RATIO,如 0.1 表示上涨 10%)
- 逻辑:调整该部门所有员工工资,记录调整日志
- 输出:受影响的员工数量
6.2 程序设计步骤
- 创建日志表(存储工资调整记录):
CREATE TABLE SALARY_ADJUST_LOG ( LOG_ID INT IDENTITY(1,1) PRIMARY KEY, EMP_ID INT, OLD_SALARY DECIMAL(10,2), NEW_SALARY DECIMAL(10,2), ADJUST_RATIO DECIMAL(4,2), ADJUST_DATE DATETIME DEFAULT SYSDATE );
- 编写存储过程:
CREATE OR REPLACE PROCEDURE PROC_ADJUST_SALARY( IN P_DEPT_ID INT, V_NEW_SALARY DECIMAL(10,2); BEGIN P_AFFECTED_CNT := 0; -- 遍历部门员工,调整工资 FOR EMP_REC IN (SELECT EMP_ID, SALARY FROM EMP WHERE DEPT_ID = P_DEPT_ID) LOOP V_OLD_SALARY := EMP_REC.SALARY; V_NEW_SALARY := V_OLD_SALARY * (1 + P_RATIO); -- 更新工资 UPDATE EMP SET SALARY = V_NEW_SALARY WHERE EMP_ID = EMP_REC.EMP_ID; -- 插入日志 INSERT INTO SALARY_ADJUST_LOG (EMP_ID, OLD_SALARY, NEW_SALARY, ADJUST_RATIO) VALUES (EMP_REC.EMP_ID, V_OLD_SALARY, V_NEW_SALARY, P_RATIO); P_AFFECTED_CNT := P_AFFECTED_CNT + 1; END LOOP; COMMIT; DBMS_OUTPUT.PUT_LINE('工资调整完成,受影响员工数:' || P_AFFECTED_CNT); EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('调整失败:' || SQLERRM); RAISE; END; /- 调用存储过程:
SET SERVEROUTPUT ON; DECLARE V_CNT INT; BEGIN PROC_ADJUST_SALARY(DEPT_ID => 10, RATIO => 0.1, P_AFFECTED_CNT => V_CNT); END; /执行结果:工资调整完成,受影响员工数:5
7. 常见问题排查与技巧总结
7.1 安装失败问题
- 问题 1:图形化安装界面无法启动
解决:检查是否安装libXext、libX11等依赖包,执行yum install libXext libX11 -y
- 问题 2:执行 root 脚本时报 “权限不足”
解决:确保安装目录所有者为 dinstall 组,执行chown -R dmdba:dinstall /home/dmdba/dmdbms
7.2 连接数据库失败
- 问题:disql连接时报 “网络通信异常”
解决:
- 检查数据库实例是否启动:./dmctl status /home/dmdba/dmdbms/data/DMSERVER/dm.ini
- 检查防火墙是否开放 5236 端口:firewall-cmd --add-port=5236/tcp --permanent && firewall-cmd --reload
- 验证监听状态:netstat -an | grep 5236
7.3 性能优化技巧
- 索引优化:对查询频繁的字段(如 EMP.DEPT_ID、EMP.EMP_NAME)创建索引
- 分页查询:使用ROWID分页,比LIMIT更高效:
SELECT * FROM ( SELECT ROWID, EMP.* FROM EMP WHERE DEPT_ID = 10 ORDER BY EMP_ID ) WHERE ROWID BETWEEN 1 AND 20;- 避免全表扫描:查询时指定 WHERE 条件,避免SELECT *
8. 学习总结与国产数据库展望
通过《国产数据库技术》课程学习,我不仅掌握了 DM8 数据库的安装配置、核心功能和程序开发,更深刻认识到国产数据库在技术自主性、安全可控性上的优势。DM8 作为国产数据库的代表,其兼容性、性能和易用性已能满足企业级应用需求,随着 “去 IOE” 政策的推进,国产数据库的市场份额将持续扩大。
未来学习计划:
- 深入研究 DM8 的高可用架构(主从复制、集群部署)
- 探索 DM8 与 Java、Python 等编程语言的集成开发
- 关注国产数据库生态建设,学习 TiDB、OceanBase 等其他主流产品
国产数据库的发展离不开开发者的实践与推广,希望本文的学习心得能为更多开发者提供参考,共同推动国产数据库技术的进步!