数据库运维16 min read

达梦数据库 DM8 安装部署与运维实战

为什么需要达梦

国产数据库在信创替换的大趋势下已成为运维必修课。达梦 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 &

⚠️ 避坑 #2PAGE_SIZECASE_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)。

十条避坑清单

  1. 初始化参数不可改:PAGE_SIZE、CASE_SENSITIVE、CHARSET 初始化后无法修改,迁移前必须规划好
  2. 归档模式必开:不开归档 = 只能冷备 = 无法时间点恢复,生产不可接受
  3. 授权文件别忘:试用版 90 天到期自动停库,生产尽早导入 .key
  4. Oracle 兼容模式设对COMPATIBLE_MODE=2 + CASE_SENSITIVE=1 是 Oracle 迁移前提
  5. DW 监视器独立部署:监视器和主/备同机 = 切换判断失灵
  6. 归档空间要留够SPACE_LIMIT 碰上限 = 库挂起,设 ≥ 数据总量 × 1.5
  7. dmdba 用户运行:root 运行 dmserver 会导致文件权限混乱,后续维护困难
  8. 备份清理脚本别忘:归档和备份不清理 = 磁盘必满,定时清理 > 7 天
  9. PLSQL 包迁移后逐包测%ROWTYPE 和动态 SQL 有细微差异,自动迁移不能保证 100% 正确
  10. 系统参数先调好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 运维就能上手。

分享:

相关文章

评论区