达梦数据复制软件(DMDRS)是一款适配同构、异构数据库及各类数据管理系统的通用数据复制工具。软件采用模块化架构,可灵活配置组合,一站式支持数据迁移、数据实时同步、数据分发、数据转换等核心能力。支持一对一、双向、一对多、多对一、级联、环形、主备等多种同步拓扑,能够适配静态迁移、动态实时同步、多节点数据分发、自定义数据转换等各类业务场景,具备高效稳定、断点续传、低源库负载的特点,可满足企业数据流转、系统迁移、容灾备份与数据汇聚分发等多样化数据复制需求。DMDRS常用的链路图示:
START cpt_dm8 # 启动指定名称 CPT 模块
START EXEC # 启动第一个 EXEC 模块
START # 启动全部模块
STOP cpt_dm8 # 停止指定 CPT 模块
STOP EXEC # 停止第一个 EXEC 模块
STOP # 停止全部模块
注意:指定具体 LSN 会清理目标端事务,存在丢数据风险;执行前必须确保 CPT 已停止,且无正在进行的装载操作。
ALTER cpt_dm8 SET LSN # 使用源库最新日志 LSN 作为同步起点
ALTER cpt_dm8 SET LSN 123456 # 指定具体 LSN 作为同步起点
# 单个表
alter cpt_dm8 add table "sch.name='RESOURCES' and tab.name='EMPLOYEE'"
# 整个模式所有表
alter cpt_dm8 add table "sch.name='RESOURCES'"
# 多模式
alter cpt_dm8 add table "sch.name='RESOURCES' or sch.name='PERSON'"
# 掩码示例:目标端先删表,重建,导入数据,分组并行
alter cpt_dm8 add table "sch.name='RESOURCES'" DROP|CREATE|INSERT|GROUP
常用掩码简要说明
| 掩码 | 作用 |
|---|---|
| DROP | 删除目标端对象 |
| CREATE | 创建表、约束 |
| INSERT | 导入数据 |
| GROUP | 分组并行装载,提升大表速度 |
| NOLOCK | 原表不上 S 锁,业务不停机,但可能数据不一致 |
| TRUNCATE | 清空目标表数据,保留表结构 |
alter cpt_dm8 stop load # 停止该 CPT 下全部装载
alter cpt_dm8 stop table RESOURCES.EMPLOYEE # 停止指定单张表装载
show cpt_dm8 load status # 装载总体统计
show cpt_dm8 load table running # 查看正在装载的表
show cpt_dm8 load table error # 查看装载出错的表
show cpt_dm8 load table all # 所有表装载完整状态
show cpt_dm8 load table RESOURCES.* # 查看指定模式下表装载情况
show cpt_dm8 state # CPT 整体统计:读日志、解析、发送流量、LSN
show cpt_dm8 read # 读取日志文件、偏移、状态
show cpt_dm8 parse # 日志解析状态
show cpt_dm8 send # 发送队列、发送 LSN
show cpt_dm8 table # 各表 DML 操作统计(插入/更新/删除)
show cpt_dm8 conf # 查看 CPT 配置参数
show cpt_dm8 dict all # 查看本地离线字典信息
show exec_dm8 state # EXEC 整体运行统计
show exec_dm8 thr # 工作线程、事务执行情况
show exec_dm8 lag # 各表同步延迟(秒)
show exec_dm8 link lag # 整条链路总延迟
show exec_dm8 trx # 查看目标端活动事务
show exec_dm8 ckpt # 检查点信息
show exec_dm8 dict # 目标端字典信息
show exec_dm8 conf # 查看 EXEC 配置参数
适用于已经通过备份还原初始化目标库,只需要从当前时刻开始同步增量,不会自动全量装载的场景。
# 添加增量同步字典,从当前 LSN 开始同步
alter cpt_dm8 add dict "sch.name='RESOURCES' and tab.name='EMPLOYEE'" LSN
# 删除源端同步字典(目标端还保留对象)
alter cpt_dm8 delete dict RESOURCES.EMPLOYEE
# 终止同步:源端删除 + 通知目标端清理对象信息
alter cpt_dm8 terminate dict RESOURCES.EMPLOYEE
# 删除目标表,重建,导入数据
cp cpt_dm8 "sch.name='RESOURCES' and tab.name='EMPLOYEE'" DROP|CREATE|INSERT
遇到 DMDRS 异常时,建议按以下五个步骤依次排查:
第一步:确认基础环境
在深入分析 DMDRS 日志之前,首先需要确认基础环境是否正常。这一步往往能快速排除许多常见问题,避免在错误的方向上浪费时间。
ps aux | grep dmserver 或数据库客户端连接测试来验证SELECT ARCH_MODE FROM V$DATABASE; 应返回 Y),以及必要的附加日志(DM8 需开启 RLOG_APPEND_SYSTAB_LOGIC)LD_LIBRARY_PATH 已正确配置,包含数据库驱动路径(如 /home/dmdba/dmdbms/bin)netstat -tlnp | grep <端口号> 检查第二步:检查 DMDRS 服务状态
确认基础环境正常后,检查 DMDRS 各服务是否正常运行。
drsvr 进程是否存在ps aux | grep drsvr 查看第三步:查看模块运行状态
如果服务进程存在但同步功能异常,通过控制台命令查看 CPT/EXEC 模块的详细运行状态,定位异常发生在哪个环节。
第四步:启用调试日志深入分析
若常规状态查看无法定位问题,可通过 log_mask 开启详细调试日志,或通过 trace 命令跟踪特定表的同步流程。调试日志可以揭示模块内部的详细处理过程,是定位复杂问题的关键手段。
第五步:分析日志与定位根因
结合模块日志、系统日志和跟踪日志,综合分析确定问题根因,并采取相应的解决措施(修改配置、重启服务、清理缓存等)。
| 问题类型 | 典型现象 | 排查方向 |
|---|---|---|
| 模块启动失败 | CPT/EXEC 无法启动,报错退出 | 配置文件语法错误、端口被占用、动态库缺失、目录权限不足 |
| 同步中断 | CPT 运行中停止读取或发送,LSN 不增长 | 网络连接断开、归档日志缺失或损坏、目标端异常退出 |
| 装载失败 | add table 后状态为 ERROR,目标端无数据 | 表结构不匹配(字段数、数据类型不一致)、目标端用户权限不足、数据格式不兼容 |
| 数据不一致 | 目标端数据与源端数据存在差异 | 日志解析错误、过滤规则配置不当、数据同步过程中断 |
| 同步延迟 | 目标端数据落后源端较长时间 | 网络带宽不足、目标端入库性能瓶颈、大事务阻塞、磁盘 IO 瓶颈 |
本节汇总了 DMDRS 使用过程中最常见的故障现象、原因分析和解决方案,按问题类型分类整理。
问题一:CPT 启动时报 DRS-5125 离线字典加载失败
DRS-5125 离线字典加载失败 LOAD DICT,CPT 无法正常启动。RLOG_APPEND_SYSTAB_LOGIC 未开启)enable_sys_dict 参数未配置或配置不当CALL SP_SET_PARA_VALUE(1, 'RLOG_APPEND_SYSTAB_LOGIC', 1);
<enable_sys_dict>0</enable_sys_dict>
SET DEFINE OFF;
START ddl_sql_dm8.sql;
问题二:CPT 启动时报 DRS-3000 端口被占用
DRS-3000 无法绑定监听端口号 port: 5345 code: 98,进程启动失败。DUMP LOG 命令执行后临时模块未完全退出# 查看端口占用
netstat -tlnp | grep 5345
# 彻底停止所有 drsvr 进程
pkill -9 -f "drsvr"
# 确认端口已释放
netstat -tlnp | grep 5345
# 清理缓存后重新启动
rm -rf cpt_dm8_master/ log/ mgr/
nohup ./drsvr cpt.xml >> cpt_master.log 2>&1 &
问题三:CPT 启动时报 DRS-3037 未找到动态库文件
DRS-3037 未找到动态库文件 path: libdrcdm8.so。LD_LIBRARY_PATH 环境变量未包含 DM8 驱动路径。export LD_LIBRARY_PATH=/data/dmdrs5/bin:/home/dmdba/dmdbms/bin:$LD_LIBRARY_PATH
建议:将所有 DMDRS 相关操作统一使用
dmdba用户执行,避免 root 用户环境变量缺失问题。
问题四:EXEC 启动后状态信息为空
show exec_dm8 state 显示“当前无状态统计信息”。resvd_size 参数未配置,默认值为 10GB,磁盘剩余空间不足exec.xml 中添加或修改:<resvd_size>1</resvd_size>
<!--
<cluster>
<mode>master</mode>
<standby>
<item>
<ip>192.168.21.139</ip>
<port>5346</port>
<target_name>exec_dm8_slave</target_name>
</item>
</standby>
</cluster>
-->
chown -R dmdba:dinstall /data/dmdrs5
问题五:CPT 发送 LSN 为 0,发送状态为“准备语句”
show cpt_dm8 send 显示起始 LSN=0、发送 LSN=0、状态=准备语句。# 删除旧的装载记录
alter cpt_dm8 delete load_record all
# 重新设置 LSN(从当前数据库最新 LSN 开始)
alter cpt_dm8 set lsn
# 重新添加同步表
alter cpt_dm8 add table "sch.name='DMDRS' and tab.name='EMPL1'" DROP|CREATE|INSERT|INDEX
# 查看装载状态,确认完成后启动同步
show cpt_dm8 load status
start cpt_dm8
问题六:CPT 进程异常退出
ps aux | grep drsvr | grep cpt 无输出。# 查看 cpt_master.log 中的错误信息
tail -200 /data/dmdrs5/bin_cpt_dm8_master_135/cpt_master.log | grep -E "ERROR|FATAL|signal"
# 彻底清理所有 drsvr 进程
pkill -9 -f "drsvr"
# 确认端口已释放
netstat -tlnp | grep 5345
cpt.xml 中的 cluster 配置问题七:EXEC 接收不到数据(显示“暂未接收”)
show exec_dm8 state 显示接收日志时间=暂未接收,最新接收日志 LSN=暂未接收。send 配置中 IP/端口/模块名不正确# 1. 确认 EXEC 进程正常运行
ps aux | grep drsvr | grep exec
netstat -tlnp | grep 5345
# 2. 确认 CPT 的 send 配置正确
show cpt_dm8 conf | grep -A5 "CPT-SEND"
# 检查 IP、PORT、TARGET_NAME 是否正确指向 EXEC
# 3. 测试网络连通性
telnet 192.168.21.139 5345
# 4. 检查 CPT 发送状态
show cpt_dm8 send
如果状态为“准备语句”且发送 LSN 为 0,参见问题五的解决方案。
问题八:装载失败,表状态为 ERROR
show cpt_dm8 load table all 显示状态为 ERROR。# 查看具体错误信息
show cpt_dm8 load table error
# 使用断点续传
alter cpt_dm8 continue load
# 若续传失败,使用指定掩码重装
alter cpt_dm8 continue reload DROP|CREATE|INSERT|GROUP
# 强制激活失败表同步(谨慎使用)
alter cpt_dm8 sync table "SCHNAME"."TABNAME"
注意:强制激活装载失败表的同步会导致没有装载成功的分组数据全部被过滤,请慎重使用。
问题九:同步延迟过大
show exec_dm8 lag 显示表同步延迟持续增大(如延迟数十秒甚至数小时)。show exec_dm8 link lagshow exec_dm8 ckptshow exec_dm8 thrwork_thr 和 load_thr 参数,适当增加工作线程数max_merge_row 参数,优化事务合并力度max_speed 参数NUM: 1000 SKIP 警告,随后同步被切断。show exec_dm8 ckpt 显示检查点数量持续增长且不回落。检查点是 EXEC 模块记录已成功提交至目标数据库的逻辑进度标记(LSN),用于故障重启后的断点续传。每个活跃事务在执行过程中会产生对应的检查点文件,事务提交成功后检查点会被释放。
正常情况下,检查点文件数量较少,因为事务提交后立即释放。
满载触发链:
site_buf_size 默认仅 64MB,缓冲区被迅速填满。.ckpt 检查点文件。max_ckpt_num 默认上限为 1000,一旦活跃检查点文件数量达到此值,即触发 SKIP 报错并强行切断同步。ckpt_interval 默认 30 秒,如果检查点执行频繁且事务未提交,会加剧检查点文件的积累速度。ckpt_interval 太小,检查点过于密集,恢复时需扫描的检查点文件数量更多。核心公式:
检查点文件数量 = 活跃事务数 × 每个事务产生的检查点文件数
当活跃事务数持续增加且无法提交时,检查点数量线性增长,直至突破上限。
| 参数 | 作用 | 推荐值 | 配置位置 |
|---|---|---|---|
clear_interval |
装载失败后自动清理该表检查点的时间间隔 | 24 小时(默认 168) | exec.xml |
ckpt_limit |
检查点文件占用的磁盘空间上限 | 100 GB(默认 50 GB) | exec.xml |
max_ckpt_num |
检查点文件数量上限 | 3000(默认 1000) | exec.xml |
site_buf_size |
站点私有缓冲区大小 | 512 MB(默认 64 MB) | exec.xml |
error_policy |
错误处理策略 | 2(MERGE INTO 重试) | exec.xml |
ckpt_interval |
CPT 端检查点执行间隔时间 | 60 秒(默认 30 秒) | cpt.xml |
1. clear_interval
exec.xml 中 <exec> 标签内add table 命令添加的同步表,从表装载失败开始,如果超出该参数设置的间隔时间后仍未重装或续装,DMDRS 会自动停止该表的增量同步,删除源端表字典,清理目标端对应检查点。<exec>
<clear_interval>24</clear_interval>
...
</exec>
2. ckpt_limit
exec.xml 中 <exec> 标签内<exec>
<ckpt_limit>102400</ckpt_limit> <!-- 单位:MB,102400 = 100GB -->
...
</exec>
3. max_ckpt_num
exec.xml 中 <exec> 标签内ckpt_limit 磁盘限制,也不会继续推进检查点。该参数用于从数量维度进行保护,避免检查点文件过多占用系统资源(文件句柄、内存等),同时防止重启后恢复时间过长。NUM: 1000 SKIP 报错的直接原因。<exec>
<max_ckpt_num>3000</max_ckpt_num>
...
</exec>
4. site_buf_size
exec.xml 中 <exec> 标签内<exec>
<site_buf_size>512</site_buf_size> <!-- 单位:MB -->
...
</exec>
5. error_policy
exec.xml 中 <group> 标签内0:终止同步(默认)。遇到错误立即停止,检查点无法推进。1:忽略错误继续同步。仅忽略有错误的操作,不影响事务中其他操作。2:INSERT/UPDATE 失败时,使用 MERGE INTO 重新执行。忽略 DELETE 失败。MERGE INTO 仅支持有主键表,且要求开启全列日志。<exec>
<group>
<item>
<id>0</id>
<error_policy>2</error_policy>
...
</item>
</group>
</exec>
6. ckpt_interval
cpt.xml 中 <cpt> 标签内ckpt_interval 可以减少 CPT 端产生的检查点数量,间接缓解 EXEC 端的检查点堆积压力。<cpt>
<ckpt_interval>60</ckpt_interval> <!-- 单位:秒 -->
...
</cpt>
| 场景 | 推荐组合 |
|---|---|
| 大表装载频繁失败 | clear_interval=24 + max_ckpt_num=3000 + error_policy=2 |
| 大事务多,内存充足 | site_buf_size=512 + ckpt_limit=100GB + max_ckpt_num=5000 |
| CPT 重启频繁,恢复慢 | ckpt_interval=60(调大减少检查点文件数) |
以上全部组合调整:
clear_interval=24
ckpt_limit=102400
max_ckpt_num=3000
site_buf_size=512
error_policy=2
ckpt_interval=60
定期执行以下命令,提前发现检查点堆积风险:
# 查看当前检查点数量
show exec_dm8 ckpt
# 查看检查点文件占用磁盘大小
show exec_dm8 stor
# 查看活跃事务数(若持续增长需关注)
show exec_dm8 info
告警阈值建议:
| 步骤 | 操作 | 命令/检查项 | 说明 |
|---|---|---|---|
| 第一步:基础环境确认 | |||
| 1.1 | 确认数据库运行 | ps aux | grep dmserver | 源端和目标端都要检查 |
| 1.2 | 确认归档模式 | SELECT ARCH_MODE FROM V$DATABASE; | 返回 Y 表示已开启 |
| 1.3 | 确认网络连通 | 从 CPT 机器 telnet EXEC_IP 5345 | 确认 CPT 能连接 EXEC |
| 1.4 | 确认环境变量 | echo $LD_LIBRARY_PATH | 确认包含数据库驱动路径 |
| 1.5 | 确认端口状态 | netstat -tlnp | grep 5345 | 确认端口未被占用 |
| 第二步:检查服务状态 | |||
| 2.1 | 确认进程存在 | ps aux | grep drsvr | 确认 CPT 和 EXEC 进程都在 |
| 2.2 | 查看启动日志 | show cpt log error/show exec log error | 查看启动时是否有错误 |
| 第三步:查看模块运行状态 | |||
| 3.1 | 查看 CPT 状态 | show cpt_dm8 state | 检查读取/解析/发送状态和 LSN |
| 3.2 | 查看 CPT 发送 | show cpt_dm8 send | 检查发送 LSN 是否正常增长 |
| 3.3 | 查看 EXEC 状态 | show exec_dm8 state | 检查接收状态和 LSN |
| 3.4 | 查看 EXEC 延迟 | show exec_dm8 lag | 检查各表同步延迟 |
| 第四步:启用调试日志 | |||
| 4.1 | CPT 端调试 | 配置 log_mask=READ|SEND | 查看 CPT 读取和发送详情 |
| 4.2 | EXEC 端调试 | 配置log_mask=TRACE_SQL|EXEC_TRX_EXEC | 查看 EXEC 执行 SQL 和事务状态 |
| 4.3 | 定点跟踪 | trace exec_dm8 "表名" add | 跟踪特定表的同步过程 |
| 第五步:分析并解决 | |||
| 5.1 | 查看错误日志 | show cpt log error/show exec log error | 定位具体错误信息 |
| 5.2 | 查看详细日志文件 | 查看 LOG00001/ 目录下的各类日志 | 深入分析执行细节 |
| 5.3 | 采取解决措施 | 修复配置、重启服务、断点续传等 | 根据定位的问题采取对应措施 |
文章
阅读量
获赞
