达梦数据复制软件(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 自带的诊断工具 drdgtool。该工具可以解析错误日志、检查点文件,快速定位故障.
进入DMDRS执行程序工作目录
启动诊断工具,执行启动命令:
./drdgtool
启动成功后,进入工具命令操作界面,即可执行各类诊断分析命令。
该功能主要用于统计、解析DMDRS运行中的绑定失败、入库失败异常日志,支持精准查询单条指定异常记录、批量查询区间异常记录,并可导出SQL、JSON、BIN三种格式的详细日志文件,是排查数据同步语句报错的核心功能。
使用该功能需两个关键参数,可直接从DMDRS原始报错日志中获取:
①记录ID(RECID):异常操作专属标识,十六进制格式,由「8位以内文件号+8位文件偏移」组成,单日志文件首个记录ID为「文件号00000000」;
②站点号(SITEID):异常操作对应的源端站点编号,日志中可直接查询。
命令格式:
ERRLOG DUMP RECID:<RECID> SITEID:<SITEID> [SQL|STRUCT|BIN] [OUTDIR:"<OUTDIR_PATH>"] [DIR:"<DIR_PATH>"]
输出格式可选:SQL (默认)/STRUCT (JSON)/BIN;
OUTDIR:导出文件存放目录,默认当前目录;
DIR:错误日志目录,默认ERRLOG_站点号目录。
简单示例:
# 1号站点,recid=10007ECF7,默认输出out.sql
ERRLOG DUMP RECID:10007ECF7 SITEID:1
按记录 ID 区间批量导出,还支持事务号、表名、时间过滤。
命令格式:
ERRLOG DUMP MIN:<MIN_RECID> MAX:<MAX_RECID> SITEID:<SITEID> [TRX_ID [OP_ID]] [SQL|STRUCT|BIN] [OUTDIR:"<OUTDIR_PATH>"] [DIR:"<DIR_PATH>"] ["SCHNAME.TABNAME" [ROWID:<ROWID>]] [FROM "START_TIME" TO "END_TIME"]
示例:
# 查询26站点3号日志全部异常
ERRLOG DUMP MIN:300000000 MAX:3FFFFFFFF SITEID:26
看模块是否正常运行:show mode
CPT 源端:show cpt_dm8 state 看读、解析、发送队列是否堆积
EXEC 目标端:
show exec_dm8 lag 看延迟;
show exec_dm8 thr 看线程是否卡住;
show exec_dm8 trx 看长事务
装载报错:show cpt_dm8 load table error 定位哪张表失败
装载失败后:alter cpt_dm8 continue load 尝试续传
在 DRS 日志拿到报错的 recid、siteid;
drdgtool 中执行ERRLOG DUMP RECID:xxx SITEID:x;
./drdgtool
ERRLOG DUMP RECID:XXX SITEID:X
读取生成的 out.sql,拿到报错原始 SQL;
对比源端、目标端表结构,定位数据、字段类型问题。
当日志大批量报错:
MGR[HALT]:out of memory limit,max_size:52(GB),alloc_size:67464756 (Bytes),file:.....
这段报错指内存不够,一般与参数mem_size有关,mem_size指的是有关服务程序运行时可以申请的最大内存。修改配置文件<mem_size>参数,适当增大,并重启服务,日志报错停止,装载正常。
当日志报错检查点堆积时,一般是因为之前有一些装载失败的表,重新装载这部分表即可;
若暂时不重新装载这部分表,则需要清理检查点,可通过 s group 32767 查看表情况
cpt端执行:aletr cpt terminate dict 模式.表
exec端执行:ALTER EXEC TERMINATE OBJ 目的端模式.表
清理检查点之后需重启DRS服务
动态修改方法:
可以通过执行:
set cpt max_ckpt_num 3000
将cpt模块检查点数量设为3000
max_ckpt_num指的是检查点缓存文件的最大数量。
当日志出现准备已经准备好的SQL语句失败,执行失败后面一般会跟具体的原因,如Invalid convert string,violate not null constraint on [user_name]。
Invalid convert string可以推测失败原因是无效字符串,violate not null constraint on [user_name]在user_name字段违反非空约束等
[ERROR]日志后,一般有:
保存操作 (recid:600000000 siteid: 33554433) lsn:......
此时可以通过DRS诊断工具将本次执行失败的SQL导出到out.sql中,
./drdgtool
ERRLOG DUMP RECID:600000000 SITEID:33554433
初步查看是否存在乱码现象判断哪段字符属性不一致,之后在源端与目的端分别查询表结构,进一步确认该字段两边数据类型是否一致。
解决方法:
使用DTS重新迁移表结构,再重新装载数据;
在目的端达梦备份该表之后,重新创建该表,修改字段数据类型与源端一致,再重新迁移数据到新表
违反非空约束处理方法相同:
此时可以通过DRS诊断工具将本次执行失败的SQL导出到out.sql中,
./drdgtool
ERRLOG DUMP RECID:xxx SITEID:x
初步查看判断哪段输入数据为空,从而触发违反非空约束,之后在源端与目的端分别查询表结构,进一步确认该字段两边字段两端空值约束是否一致
解决方法:
使用DTS重新迁移表结构,再重新装载数据;
在目的端达梦备份该表之后,重新创建该表,修改字段非空约束与源端一致,再重新迁移数据到新表。
当日志出现报错record length exceed......,可能是因为在使用DTS迁移表结构的时候没有选择支持超长存储
解决方法:
在达梦端truncate清空表,修改表结构支持超长存储,using long rows,修改好表结构之后,再重新装载数据
当日志出现
cpt_mysql [ERROR]: DRS-6095 在LSN区间内,表操作影响行数与预期不一致.......
其后日志为:
cpt_mysql [INFO]:保存操作 (recid:B00000000 sitied:1),lsn:LSN......
同样可以用DRS诊断工具导出SQL到out.sql,查询对应记录在目的端是否存在,一种情况是因为部分源端数据在目的端丢失
解决方法:
1.利用DVS工具对源端和目的端进行数据修复,修复目的端中部分缺失记录
2.另一种方法是在达梦端重新装载这个表的数据,注意需加上TRUNCATE掩码,先清空表,再重新装载。
当装载数据时,有时会出现同步数据较慢从而影响装载进度的情况;
排查思路:
1.首先在EXEC端执行状态查看命令state,初步判断同步是否出现阻塞;
2.查看线程运行情况
s thr
查看数据库当前线程,观察正在执行、等待执行的线程数量;如果等待执行的线程数量很多,定位线程正在操作的目标表
3.查看事务状态
s trx
查看当前数据库活跃事务,看是否存在长事务等
4.检查表对象:主键、索引是否缺失
针对之前定位的表,在目标端查询表结构,核查该表是否存在主键、必要业务索引;
如果缺少主键、索引,往往就是同步卡住的常见诱因,需要给该表补充主键和索引。
文档主要说明达梦 DRS 复制工具的模块组成、控制台操作命令,介绍 drdgtool 诊断工具的使用方式,整理内存超限、检查点堆积、SQL 执行失败、记录长度超限、LSN 区间行数不一致、缺少主键索引同步慢等常见故障现象及对应处理手段。故障排查可查看 CPT、EXEC 模块运行状态,借助 drdgtool 导出异常 SQL 定位问题,部分场景需要重新装载表数据修复。
文章
阅读量
获赞
