从数据复制、增量同步到一致性校验的完整实践
摘要: 本文介绍 DMDRS、DMDVS 与 DMDFM 在 DM8 数据同步场景中的职责分工和协同方式,记录源端与目标端部署、同步表配置、全量装载、DDL/DML 捕获、增量 UPDATE 验证及 DMDVS 一致性校验过程。文章最后结合实验中的模块名、端口、字典加载和校验失败问题,总结定位顺序和部署验收标准。
关键词: DMDRS、DMDVS、DMDFM、DM8、全量装载、增量同步、数据校验、故障排查
DMDRS(DM Data Replication Service)是达梦数据库提供的数据复制服务,用于在源数据库和目标数据库之间传输、装载并持续同步符合配置范围的数据对象和变更。
DMDRS 不是单纯的数据库备份工具,而是一条由“源端捕获、网络传输、目标端执行”组成的同步链路。
在本次实验中,DMDRS 先完成 EMPLOYEE、ORDERS 等对象的全量装载,再继续捕获源端的 CREATE、INSERT、INDEX、UPDATE 等操作,使目标端能够获得对应的表结构和数据变化。
常见应用方向包括:
结合本次 DM8 实验,DMDRS 的主要优势体现在以下几个方面:
组件边界: DMDRS 负责复制,DMDVS 负责一致性校验,DMDFM 负责图形化管理和代理通信。三者相互配合,但不能相互替代。
本次方案中,各组件的职责如下:
这几个组件不能相互替代:DMDVS 校验失败不等于 DMDRS 一定停止,DMDRS 装载报错也不能靠 DMDVS 自动修复。排查时应先确认问题属于复制、管理通信还是一致性校验层。
| 节点 | 地址 | 实例 / 组件 | 端口 |
|---|---|---|---|
源端 drssrc |
192.168.80.** |
DRSSRC / instance1 / CPT link1 |
5236 / 5345 |
目标端 drsdst |
192.168.80.** |
DRSDST / instance2 / EXEC |
5236 / 5346 |
| 校验服务 | 部署在 drsdst |
DMDVS + DMDFM Agent |
5349 / 19345 |
端口用途如下:
5236:数据库服务端口;5345 / 5346:DMDRS 管理端口;5349:DMDVS 服务端口;19345:DMDFM Agent 端口。
图 1:DMDRS 与 DMDVS 的实验拓扑
图 2:DMDRS 部署状态页面
源端和目标端分别准备数据库、归档和 DRS 目录,统一交给 dmdba:dinstall 管理。初始化数据库后先正常启动、退出一次,再进入 DRS 配置阶段。
# 源端 drssrc
mkdir -p /dmdata/data /dmarch/DRSSRC /data/dmdrs5
chown -R dmdba:dinstall /dmdata /dmarch /data/dmdrs5
chmod -R 755 /dmdata /dmarch /data/dmdrs5
# 目标端 drsdst
mkdir -p /dmdata/data /data/dmdrs5
chown -R dmdba:dinstall /dmdata /data/dmdrs5
chmod -R 755 /dmdata /data/dmdrs5
数据库两端应保持以下环境一致:
源库启用本地归档和逻辑日志,目标库准备同版本数据库和 DRS 目标实例。
开始配置前,先检查源端和目标端的服务、端口及 drsvr 进程。
# 源端
ss -lntp | grep ':5345 ' || echo '源端 instance1 未监听'
pgrep -af drsvr || echo '源端没有 drsvr'
# 目标端
ss -lntp | grep ':5346 ' || echo '目标端 instance2 未监听'
pgrep -af drsvr || echo '目标端没有 drsvr'
当前工程中,源端服务名是 instance1,CPT 模块名是 link1;目标端服务名是 instance2。控制台命令必须使用配置中的实际模块名。
cd /home/dmdba/dmdrs5/INST_DRS/instance1
grep -n '<name>' drs.xml
grep -nE '<map>|<item' drs.xml
# 典型输出对应
# instance1 = DMDRS 服务
# link1 = CPT 模块
# DRS_TEST.EMPLOYEE==DRS_TEST.EMPLOYEE
# DRS_TEST.ORDERS==DRS_TEST.ORDERS
图 3:DMDFM 一对一场景中的 DMDRS 两端配置
图 4:DMDFM 中 link1 同步表映射
CPT 首次启动前,先使用当前源库日志位置设置增量起点。随后使用真实模块名 link1 添加表,并执行 CREATE、INSERT、INDEX 等装载掩码。
# 源端 drssrc / drcsl
cd /home/dmdba/dmdrs5/INST_DRS/instance1
./drcsl
connect 127.0.0.**:5345
alter link1 set lsn
alter link1 add table \
"sch.name='DRS_TEST' and tab.name='EMPLOYEE'" CREATE|INSERT|INDEX
alter link1 add table \
"sch.name='DRS_TEST' and tab.name='ORDERS'" CREATE|INSERT|INDEX
show link1 load table running
show link1 load table error
小数据量实验中,running 状态可能很快消失,因此必须同时到目标数据库检查表和行数。装载完成且无错误后,再执行 start link1。
start link1 show mode
目标端使用 DIsql 检查表和数据量:
SELECT OWNER, TABLE_NAME
FROM DBA_TABLES
WHERE OWNER = 'DRS_TEST'
AND TABLE_NAME IN ('EMPLOYEE', 'ORDERS');
SELECT COUNT(*) FROM DRS_TEST.EMPLOYEE;
SELECT COUNT(*) FROM DRS_TEST.ORDERS;
图 5:DMDRS 装载状态与同步表结果
对已经加入映射范围的 EMPLOYEE 增加 ARTICLE9_TAG 字段,可以验证 DDL 捕获和目标端字段变化。
材料中还按教程记录了 DMDRS.TEST 的建表、插入和索引测试。新测试表必须先加入同步映射,否则只能证明源端 SQL 执行成功,不能证明 DMDRS 完成同步。
-- 已映射表的 DDL 测试:源端
ALTER TABLE DRS_TEST.EMPLOYEE
ADD ARTICLE9_TAG VARCHAR2(30);
-- 教程测试表:源端 DMDRS 用户
CREATE TABLE TEST (
ID INT,
NAME VARCHAR2(20)
);
INSERT INTO TEST VALUES (1, 'PP');
INSERT INTO TEST VALUES (3, 'AA');
COMMIT;
CREATE INDEX TESTINDEX ON TEST(ID);
图 6:DMDFM 中的 DDL 同步配置
图 7:源端对 EMPLOYEE 执行 ALTER TABLE 并确认字段
图 8:源端创建 DMDRS.TEST、插入数据并创建索引
图 9:目标端确认 DMDRS 用户存在
图 10:目标端自动出现 TEST 表并查询两行数据
图 11:源端继续向 TEST 写入同步测试数据
图 12:目标端查询到新增数据
图 13:目标端确认 TESTINDEX 状态为 VALID
在源端更新 DMDRS.TEST 记录并提交,再到目标端查询结果。
-- 源端
UPDATE DMDRS.TEST
SET NAME = 'PP_UPDATE'
WHERE ID = 1;
COMMIT;
-- 目标端
SELECT *
FROM DMDRS.TEST
ORDER BY ID;
验证链路应保持单向:源端执行 DDL/DML,目标端只查询结果。目标端手工修改同步表会引入新的差异,影响后续 DMDVS 校验。
图 14:源端执行 UPDATE 并提交
图 15:目标端查询更新后的记录
DMDVS 安装在 drsdst,复用 DMDFM Agent,服务端口为 5349,缓存目录为 /home/dmdba/dmdvs_cache,DM8 依赖路径为 /home/dmdba/dmdbms/bin。
# 目标端 drsdst
mkdir -p /home/dmdba/dmdvs /home/dmdba/dmdvs_cache
chmod 755 /home/dmdba/dmdvs /home/dmdba/dmdvs_cache
ss -lntp | grep -E ':19345 |:5349 |:5236 ' || true
| 配置项 | 本次值 |
|---|---|
| 主机 / 服务 | 192.168.80.** / 校验服务 |
| 安装 / 缓存 | /home/dmdba/dmdvs / /home/dmdba/dmdvs_cache |
| Agent | 192.168.80.**:19345,复用已有代理 |
| 服务端口 | 5349 |
| 校验规则 | DRS_TEST.EMPLOYEE==DRS_TEST.EMPLOYEE;DRS_TEST.ORDERS==DRS_TEST.ORDERS |
DMDVS 校验成功的判定包括:
校验成功后仍应保留任务记录和结果截图,作为部署验收证据。
图 16:DMDVS 远程安装成功页面
图 17:DMDVS 校验服务详情页面
图 18:DMDVS 校验任务成功页面
| 错误 / 现象 | 根因 | 定位与处理 |
|---|---|---|
DRS-3008:模块未找到 |
把教程中的 cpt_dm8 当成当前模块名 |
grep drs.xml 确认实际模块名,用 link1 替换命令中的模块名 |
DRS-5125:离线字典加载失败 |
未完成 add table,或字典未被 link1 加载 |
依次执行 show dict、set lsn、add table,装载完成后再执行 start link1 |
DRS-6165:目标端表已存在 |
重复装载且未使用 DROP |
先查询对象;实验表可清场重装,业务表不要直接 DROP |
| 页面显示 0 张表 | 服务、模块、字典或页面状态不一致 | 先查 5345/5346、drsvr、show mode、show dict,不要先反复点击识别表 |
| DMDVS 校验失败 | 代理、服务端口或校验规则不一致 | 先查 19345/5349,再核对 DRS_TEST 模式和表名规则 |
排查时应遵循以下原则:
| 检查项 | 通过标准 |
|---|---|
源端 instance1 |
5345 监听,drsvr 存在,link1 运行 |
目标端 instance2 |
5346 监听,drsvr 存在,目标表可查询 |
| 全量装载 | 目标端表结构和数据量与源端一致 |
| 增量同步 | INSERT / UPDATE / DELETE 在目标端得到相同结果 |
| DDL 同步 | ARTICLE9_TAG 或 TESTINDEX 在目标端可核对 |
| DMDVS | 校验任务成功,差异数据为 0 |
本次实践完成了 DMDRS 源端和目标端部署、同步表配置、全量装载、DDL/DML 增量同步、UPDATE 验证,以及 DMDVS 一致性校验的完整流程。
其中,DMDRS 关注数据是否能够按照映射关系复制,DMDVS 关注指定对象在源端和目标端是否一致,DMDFM 则提供图形化配置和服务管理入口。实际排查时,应先确认服务、模块、端口和字典状态,再分析同步结果或校验差异。
THE END
达梦社区地址:https://eco.dameng.com
文章
阅读量
获赞
