为什么需要达梦
国产数据库在信创替换的大趋势下已成为运维必修课。达梦 DM8 是国产数据库市场份额最大的产品之一(党政/金融/电信广泛部署),其核心优势:
| 特性 | DM8 | 对比 Oracle |
|---|---|---|
| Oracle 兼容性 | 90%+ SQL/PLSQL 兼容 | 原生 |
| 授权成本 | 按核心/实例,远低于 Oracle | 高昂 |
| 平台支持 | Linux/Windows/国产 OS 全覆盖 | 主要 Linux/Windows |
| 国密算法 | SM2/SM3/SM4 原生支持 | 无 |
| 集群方案 | DSC(共享存储集群)+ DW(主备) | RAC + Data Guard |
| 集群成本 | 无额外 Licensing | RAC 极贵 |
适合迁移场景:非极端性能需求的 Oracle 业务(OA/ERP/中间业务),以及新建信创项目的首选数据库。
安装部署
环境准备
# 操作系统要求(官方推荐)
# - RHEL/CentOS 7+、Ubuntu 18+、Kylin V10、UOS 20
# - 最低 2GB 内存 / 10GB 磁盘
# - 生产推荐 8GB+ / 100GB+ / SSD
# 创建 dm 用户(不要用 root 运行数据库)
groupadd dinstall
useradd -g dinstall -m -s /bin/bash dmdba
echo "dmdba:DMpassword123" | chpasswd
# 目录规划
mkdir -p /opt/dmdbms/bin # 安装目录
mkdir -p /opt/dmdbms/data # 数据文件
mkdir -p /opt/dmdbms/arch # 归档日志
mkdir -p /opt/dmdbms/backup # 备份目录
chown -R dmdba:dinstall /opt/dmdbms
# 内核参数(生产必须)
cat >> /etc/security/limits.conf << 'EOF'
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 65536
dmdba hard nproc 65536
EOF
# sem/shm(与 Oracle 类似)
sysctl -w kernel.sem="250 32000 100 128"
sysctl -w kernel.shmmax=$(echo $(free -g | awk '/Mem/{print $2}') * 1024 * 1024 * 1024)
sysctl -w kernel.shmall=$(echo $(cat /proc/sys/kernel/shmmax) / $(getconf PAGE_SIZE))
sysctl -p
安装方式
方式一:图形安装(开发/测试)
# 挂载 ISO
mount -o loop dm8_202507.iso /mnt/dm
su - dmdba
cd /mnt/dm
./DMInstall.bin # GUI 安装向导
方式二:静默安装(生产推荐)
# 准备响应文件
cat > /tmp/dm_install.ini << 'EOF'
TIMEZONE=+08:00
INSTALL_TYPE=Typical
INSTALL_DIR=/opt/dmdbms
KEY_FILE= # 留空=试用版;填入授权文件路径=正式版
EOF
su - dmdba
cd /mnt/dm
./DMInstall.bin -i /tmp/dm_install.ini
安装后注册服务:
# root 执行
/opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /opt/dmdbms/data/dm.ini
systemctl enable DmServiceDMSERVER
⚠️ 避坑 #1:试用版有时间限制(通常 90 天),到期后数据库自动停止。生产环境必须在安装时或安装后尽快导入授权文件(
.key),放在$DM_HOME/bin/下即可自动识别。
初始化实例
su - dmdba
# 初始化数据库实例
/opt/dmdbms/bin/dminit \
PATH=/opt/dmdbms/data \
INSTANCE_NAME=DMSERVER \
PORT_NUM=5236 \
DB_NAME=DMDB \
SYS_DB_SIZE=128 \
MAIN_DB_SIZE=512 \
LOG_SIZE=256 \
CASE_SENSITIVE=1 \ # 区分大小写(与 Oracle 一致)
CHARSET=1 \ # UTF-8(1=UTF8, 0=GB18030)
LENGTH_IN_CHAR=0 \ # 字节计算长度(Oracle 兼容)
PAGE_SIZE=16 \ # 页大小 KB(8/16/32;初始化后不可改)
EXTENT_SIZE=16 \ # 区大小页数
BLANK_PAD_MODE=0 \ # 空格填充模式
SYS_PRIV_MODE=0 # 系统权限模式
# 启动实例
/opt/dmdbms/bin/dmserver /opt/dmdbms/data/dm.ini -noconsole &
⚠️ 避坑 #2:
PAGE_SIZE和CASE_SENSITIVE初始化后不可更改!Oracle 迁移场景必须设CASE_SENSITIVE=1(Oracle 默认区分大小写),否则迁移后 SQL 行为不一致。
连接与基本操作
DM 客户端工具
# disql(类似 Oracle sqlplus)
su - dmdba
/opt/dmdbms/bin/disql SYSDBA/SYSDBA@localhost:5236
# 常用管理命令
SQL> SELECT NAME, STATUS FROM V$INSTANCE; # 实例状态
SQL> SELECT NAME, PATH FROM V$DATAFILE; # 数据文件
SQL> SELECT * FROM V$ARCH_FILE; # 归档信息
SQL> SELECT SF_GET_PARA_VALUE(1,'MAX_SESSIONS'); # 参数查询
SQL> CALL SP_SET_PARA_VALUE(1,'MAX_SESSIONS',1000); # 参数修改(动态参数)
SQL> CALL SP_SET_PARA_VALUE(2,'BUFFER_POOLS',4); # 参数修改(静态参数,需重启)
DM 管理工具(图形)
# DEM(达梦企业管理器)—— 类似 Oracle Enterprise Manager
# 需单独部署:先初始化 DEM 库,再启动 dem 服务
/opt/dmdbms/bin/dminit PATH=/opt/dmdbms/dem INSTANCE_NAME=DEM PORT_NUM=5237 ...
/opt/dmdbms/web/dem.sh start
# 访问:http://localhost:8080/dem
参数调优
DM8 的核心参数与 Oracle 有对应关系,调优思路相近:
内存参数
-- 缓冲区大小(最重要,类似 Oracle SGA)
CALL SP_SET_PARA_VALUE(2,'BUFFER', 4000); -- MB,生产建议 60-70% 物理内存
CALL SP_SET_PARA_VALUE(2,'BUFFER_POOLS', 4); -- 缓冲池数(减少竞争)
-- 排序区(类似 Oracle PGA sort_area_size)
CALL SP_SET_PARA_VALUE(1,'SORT_BUF_SIZE', 50); -- MB
-- 字典缓存(类似 Oracle library_cache)
CALL SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', 50); -- MB
并行与连接
-- 最大会话数
CALL SP_SET_PARA_VALUE(1,'MAX_SESSIONS', 1000);
-- 最大并行工作线程
CALL SP_SET_PARA_VALUE(1,'MAX_OS_RUN_TIME', 600);
-- 工作线程数(类似 Oracle processes)
CALL SP_SET_PARA_VALUE(2,'WORKER_THREADS', 16);
I/O 参数
-- I/O 后台线程
CALL SP_SET_PARA_VALUE(2,'IO_THR_GROUPS', 4);
-- 日志刷盘频率(类似 Oracle log_checkpoint_interval)
CALL SP_SET_PARA_VALUE(1,'CKPT_INTERVAL', 60); -- 秒
-- 直接 I/O(绕过 OS 缓存,大文件场景)
CALL SP_SET_PARA_VALUE(2,'DIRECT_IO', 1);
生产参数模板(8 核 / 16GB 内存):
| 参数 | 建议值 | 说明 |
|---|---|---|
| BUFFER | 8000 MB | ≈ 50% 物理内存 |
| BUFFER_POOLS | 4 | 减少哈希桶竞争 |
| MAX_SESSIONS | 1000 | 中等业务量 |
| WORKER_THREADS | 16 | ≈ 2× CPU 核数 |
| SORT_BUF_SIZE | 50 MB | 复杂查询 |
| CKPT_INTERVAL | 60 s | 平衡性能与恢复速度 |
| DIRECT_IO | 1 | SSD 场景 |
| REDO_BUF_SIZE | 128 MB | 重做日志缓冲 |
备份与恢复
归档模式(前提)
-- 开启归档(类似 Oracle ARCHIVELOG)
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/arch, TYPE=LOCAL, FILE_SIZE=256, SPACE_LIMIT=4096';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 确认归档状态
SELECT NAME, STATUS FROM V$DATABASE; -- STATUS 应为 ARCHIVE_MODE
⚠️ 避坑 #3:不开启归档模式只能做全量冷备份(数据库停机状态),无法做联机备份和时间点恢复。生产必须开归档。
联机备份
-- 全库备份
CALL SP_BACKUPSET_ADD_DEVICE_PATH('BAK_DIR', '/opt/dmdbms/backup');
BACKUP DATABASE FULL TO "FULL_BAK_20260716" BACKUPSET 'BAK_DIR/FULL_20260716';
-- 增量备份(基于最近全量)
BACKUP DATABASE INCREMENT WITH BACKUPDIR 'BAK_DIR/FULL_20260716' TO "INC_BAK_20260716" BACKUPSET 'BAK_DIR/INC_20260716';
-- 表级备份
BACKUP TABLE HR.EMPLOYEES TO "TAB_BAK_EMP" BACKUPSET 'BAK_DIR/TAB_EMP_20260716';
恢复操作
# 全库恢复(需停库)
dmserver 停止 →
/opt/dmdbms/bin/dmrestore INI_PATH=/opt/dmdbms/data/dm.ini BAK_PATH=/opt/dmdbms/backup/FULL_20260716
# 增量恢复(先全量再增量)
dmrestore INI_PATH=/opt/dmdbms/data/dm.ini BAK_PATH=/opt/dmdbms/backup/FULL_20260716
dmrestore INI_PATH=/opt/dmdbms/data/dm.ini BAK_PATH=/opt/dmdbms/backup/INC_20260716
# 表级恢复
dmrestore TABLE=HR.EMPLOYEES INI_PATH=/opt/dmdbms/data/dm.ini BAK_PATH=/opt/dmdbms/backup/TAB_EMP_20260716
定时备份脚本
# /opt/dmdbms/scripts/dm_daily_backup.sh
#!/bin/bash
export DM_HOME=/opt/dmdbms
export PATH=$DM_HOME/bin:$PATH
BAK_DIR=/opt/dmdbms/backup
LOG=/opt/dmdbms/logs/backup.log
DATE=$(date +%Y%m%d)
echo "$(date) === Daily backup start ===" >> $LOG
# 联机全量(周日)/ 增量(其他日)
DAY=$(date +%u)
if [ "$DAY" -eq 7 ]; then
disql SYSDBA/SYSDBA@localhost:5236 << EOF >> $LOG
BACKUP DATABASE FULL TO "FULL_${DATE}" BACKUPSET '${BAK_DIR}/FULL_${DATE}';
EOF
else
disql SYSDBA/SYSDBA@localhost:5236 << EOF >> $LOG
BACKUP DATABASE INCREMENT WITH BACKUPDIR '${BAK_DIR}/FULL_latest' TO "INC_${DATE}" BACKUPSET '${BAK_DIR}/INC_${DATE}';
EOF
fi
# 清理 7 天前备份
find $BAK_DIR -type d -mtime +7 -exec rm -rf {} +
echo "$(date) === Daily backup end ===" >> $LOG
Oracle 迁移实战
达梦提供了 DTS(达梦数据迁移软件) 作为官方迁移工具,支持 Oracle → DM 的全量迁移。
迁移流程概览
1. 评估兼容性(SQL/PLSQL/对象类型)
2. DM 端初始化兼容参数
3. DTS 创建迁移工程 → 源端 Oracle → 目标端 DM
4. 迁移元数据(表结构、索引、约束、视图)
5. 迁移数据(全量导出/导入)
6. 迁移存储过程/触发器/包
7. 应用适配验证
8. 性能调优 + 全量回归测试
兼容参数设置
-- Oracle 兼容模式(初始化时已设 CASE_SENSITIVE=1)
-- 以下运行时参数进一步调整
CALL SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE', 2); -- 2=Oracle 兼容模式
CALL SP_SET_PARA_VALUE(1,'ORACLE_COMPATIBLE', 1); -- Oracle 语法兼容开关
CALL SP_SET_PARA_VALUE(2,'IDENT_CASE', 1); -- 对象名大小写敏感
CALL SP_SET_PARA_VALUE(2,'LENGTH_IN_CHAR', 0); -- 字节长度模式
CALL SP_SET_PARA_VALUE(1,'BLANK_PAD_MODE', 0); -- Oracle 空格比较模式
常见迁移适配点
| Oracle 特性 | DM8 处理 | 需手动调整 |
|---|---|---|
NUMBER(p,s) |
映射为 DECIMAL/NUMBER |
精度检查 |
VARCHAR2 |
映射为 VARCHAR |
语义一致 |
DATE |
映射为 DATE |
时间格式可能需调整 |
CLOB/BLOB |
映射为 CLOB/BLOB |
大对象加载方式 |
SEQUENCE |
完全兼容 | 无 |
SYSDATE |
映射为 SYSDATE |
无 |
NVL/DECODE |
完全兼容 | 无 |
ROWNUM |
完全兼容 | 无 |
DBMS_OUTPUT |
兼容 | 无 |
UTL_FILE |
需替换 | 用 DM 的文件 API |
DBMS_SCHEDULER |
兼容 | 调度器语法微调 |
| 自定义 TYPE | 有限兼容 | 复杂嵌套 TYPE 需重写 |
WITH 子查询 |
完全兼容 | 无 |
⚠️ 避坑 #4:PLSQL 包中的
%ROWTYPE和动态 SQL(EXECUTE IMMEDIATE)在 DM8 有细微语法差异,迁移后务必逐包测试。
DTS 操作步骤
# 1. 启动 DTS
/opt/dmdbms/tool/dts.sh
# 2. 新建工程 → 添加迁移源(Oracle JDBC)
# URL: jdbc:oracle:thin:@10.10.4.17:1521:ORCLCDB
# 用户: system / password
# 3. 添加迁移目标(DM JDBC)
# URL: jdbc:dm://localhost:5236
# 用户: SYSDBA / SYSDBA
# 4. 选择迁移对象:勾选 schemas/tables/views/procedures/packages
# 5. 执行迁移 → 查看日志 → 逐对象检查错误
集群方案
DW 主备(类似 Oracle Data Guard)
# 主库配置
# dm.ini:
DW_MODE = AUTO # 自动切换模式
DW_PORT = 5238 # 主备通信端口
INST_OGUID = 45630 # 组 ID
# 备库初始化(从主库备份恢复)
dmrestore INI_PATH=/opt/dmdbms/dw/dm.ini BAK_PATH=/opt/dmdbms/backup/FULL_20260716
# 备库 dm.ini:
DW_MODE = AUTO
DW_PORT = 5238
INST_OGUID = 45630
ALTER_MODE_STATUS = 0 # 备库模式
STARTUP_MODE = 2 # 备库启动
# dmmonitor(监视器配置)
MON_OGUID = 45630
MON_DB_IP = 192.168.1.10 # 主库 IP
MON_DB_IP = 192.168.1.11 # 备库 IP
MON_DB_PORT = 5236
DSC 共享存储集群(类似 Oracle RAC)
# DSC 需共享存储(ASM 或裸设备)
# 每节点 dm.ini:
DSC_ENABLE = 1
DSC_SEQ_NO = 0/1 # 节点序号
DSC_EP_SEQNO = 0,1 # 所有节点序号
DSC_CFG_PATH = /dev/raw/raw1 # 配置文件设备
# CSS 服务(集群同步服务,类似 Oracle CSSD)
/opt/dmdbms/bin/dmcss INI_PATH=/opt/dmdbms/dsc/dmcss.ini
⚠️ 避坑 #5:DW 自动切换依赖监视器(dmmonitor)判断主库存活。监视器必须部署在第三台机器上,不能和主/备同机。
性能监控
-- 会话监控
SELECT SESS_ID, SQL_TEXT, STATE, CREATE_TIME FROM V$SESSIONS WHERE STATE='ACTIVE';
-- 等待事件
SELECT NAME, WAIT_COUNT, WAIT_TIME FROM V$WAIT_EVENT ORDER BY WAIT_TIME DESC;
-- 缓冲区命中率(类似 Oracle cache hit ratio)
SELECT SF_GET_CACHE_HIT_RATIO();
-- 死锁检测
SELECT * FROM V$DEADLOCK;
-- SQL 执行计划
EXPLAIN SELECT * FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 10;
-- 慢查询(执行时间 > 3 秒)
SELECT SF_GET_SQL_EXPLAIN(SESS_ID) FROM V$SESSIONS WHERE WAIT_TIME > 3000;
性能对比参考
| 操作 | DM8 耗时(8核/16G) | Oracle 19c 耗时 | 说明 |
|---|---|---|---|
| 100 万行全表扫描 | ~0.8s | ~0.5s | DM8 略慢 |
| 索引范围扫描 | ~0.02s | ~0.01s | 基本持平 |
| 10 万行 INSERT | ~3s | ~2s | 批量提交差异 |
| 复杂 JOIN(5表) | ~1.2s | ~0.7s | 优化器差距 |
| PLSQL 包执行 | ~0.5s | ~0.3s | 编译后差距缩小 |
常见故障排查
| 故障 | 诊断命令 | 原因与处理 |
|---|---|---|
| 启动失败 | dmserver dm.ini 看日志 |
授权过期/dm.ini 参数错/端口占用 |
| 连接拒绝 | netstat -tlnp | grep 5236 |
未启动/防火墙/MAX_SESSIONS 满 |
| 归档满 | SELECT * FROM V$ARCH_FILE |
SPACE_LIMIT 达上限;清理旧归档或增大限制 |
| 死锁 | SELECT * FROM V$DEADLOCK |
应用事务交叉锁;kill 会话 CALL SP_CLOSE_SESSION(sess_id) |
| 磁盘满 | df -h /opt/dmdbms/data |
数据文件自扩展到上限;加磁盘或清理 |
| 主备断连 | dmmonitor 看状态 |
网络/端口/OGUID 不匹配 |
| 慢查询 | V$SESSIONS + EXPLAIN |
索引缺失/统计信息陈旧;重建索引 CREATE INDEX ... |
| 字符集乱码 | SELECT SF_GET_PARA_VALUE(1,'CHARSET') |
客户端/服务端字符集不匹配;连接时指定 |
⚠️ 避坑 #6:DM8 的归档空间限制(
SPACE_LIMIT)是硬限制,到上限后数据库挂起。生产必须设自动清理或设足够大的限制(推荐 ≥ 数据文件总量 × 1.5)。
十条避坑清单
- 初始化参数不可改:PAGE_SIZE、CASE_SENSITIVE、CHARSET 初始化后无法修改,迁移前必须规划好
- 归档模式必开:不开归档 = 只能冷备 = 无法时间点恢复,生产不可接受
- 授权文件别忘:试用版 90 天到期自动停库,生产尽早导入
.key - Oracle 兼容模式设对:
COMPATIBLE_MODE=2+CASE_SENSITIVE=1是 Oracle 迁移前提 - DW 监视器独立部署:监视器和主/备同机 = 切换判断失灵
- 归档空间要留够:
SPACE_LIMIT碰上限 = 库挂起,设 ≥ 数据总量 × 1.5 - dmdba 用户运行:root 运行 dmserver 会导致文件权限混乱,后续维护困难
- 备份清理脚本别忘:归档和备份不清理 = 磁盘必满,定时清理 > 7 天
- PLSQL 包迁移后逐包测:
%ROWTYPE和动态 SQL 有细微差异,自动迁移不能保证 100% 正确 - 系统参数先调好:
limits.conf的 nofile/nproc、sysctl的 sem/shmmax——和 Oracle 同理,不改就踩坑
总结
达梦 DM8 在信创替换场景下的运维核心要点:
- 初始化是关键一步——PAGE_SIZE/CASE_SENSITIVE/CHARSET 不可逆,迁移前必须规划
- 归档 + 定时备份 = 生产底线——和 Oracle 同理,不开归档就无法做时间点恢复
- Oracle 兼容模式是迁移前提——
COMPATIBLE_MODE=2开启后 90%+ 语法可直接运行 - DW 主备是性价比最高的高可用——成本远低于 DSC/RAC,适合绝大多数业务
- 性能差距在可接受范围——简单查询接近 Oracle,复杂场景需调索引/统计信息
掌握安装初始化、归档备份、Oracle 兼容参数、DW 主备搭建这四块,DM8 运维就能上手。

