一、DMDRS和DMDVS产品简介
达梦数据复制软件(简称DMDRS)是一种用于同构数据库、异构数据库以及各种数据管理系统之间的数据复制软件。DMDRS采用模块化的设计,通过灵活配置不同的功能模块,实现多功能的数据复制服务,以满足多种场景下的数据复制业务需求。基于数据复制业务的应用场景,DMDRS提供数据迁移、数据同步、数据分发和数据转换等功能,而且数据同步功能还支持一对一、双向、一对多、多对一、级联同步、环形同步和DMDRS主备等多种同步拓扑结构。
达梦数据校验软件(简称DMDVS)是一种用于同构或异构数据库数据差异识别,并支持对差异数据进行修复、备份与还原的数据校验软件。DMDVS采用模块化的设计,实现多功能的数据校验服务,满足静态数据校验、动态数据校验、单向数据校验、中转数据校验和分布式数据校验等多种场景下的数据校验业务需求。
DMDVS是达梦的新产品,所以比起DRS,大家对DVS可能没什么了解,在本博客中我就不再介绍DRS了,之前在别的博客中介绍过了。今天主要就是介绍一下如何在DRS运行过程中,使用DVS进行动态的数据对比。
二、静态数据对比
在介绍本博客的重点即动态数据对比之前,先用一个简单的静态对比带大家了解一下DMDVS的使用方法。
2.1 启动dvs服务
./dvs_serverd start
(启动脚本要自己配,相信大家都会,就bin目录下cp service_template/TemplateService嘛)
2.2进入控制台
./drcsl dvs.xml
先连接
connect
输入两台数据库信息来添加校验数据库
CMP ADD DB <db_type> <db_info_name> "<server>" <user> <pwd> [<port>] [<db_name>][<server_name>] [<ssl_path> <ssl_pwd>]
比如
cmp add db dm8 dm_a “主调ip” SYSDBA 密码 5236
cmp add db dm8 dm_b “被调ip” SYSDBA 密码 5236

2.3静态校验指令
cmp job jobname=test1 db1 db2 "SYSDBA.*==SYSDBA.*"
2.4查看报告
show report test1

很简单对吧,下面就来看重点
三、动态数据校验
3.1概述
动态数据校验主要应用于在使用DMDRS服务进行数据增量同步的同时校验数据一致性的场景。动态数据校验通过指定源DMDRS的连接信息与源DMDRS服务建立连接,获取需要校验的源数据库信息,由源DMDRS通知目标DMDRS将目标数据库信息发送给DMDVS,再由DMDVS校验当前已同步的数据的一致性。

3.2准备
动态数据校验仅支持DM8和Oracle 10g及以上版本的数据库使用。使用该功能前,需要开启数据库的闪回功能,即ENABLE_FLASHBACK 置为 1。
DM8数据库开启闪回功能后,还需设置“dm.ini”文件的TRX_VIEW_MODE和TRX_VIEW_POLICY参数值为1。
3.3运行
(1)首次执行动态数据校验作业。
DCMP JOB [JOBNAME=<job_name>] "<cpt_conn_info>" "<cpt_cmp_table>" [<mask>]
cpt_conn_info:
CPT模块的IP、端口号以及CPT模块的名称组成的连接信息,格式为"IP:Port[:CPT_NAME]"
注意:端口号不是数据库端口号,是drs配置文件中的mgr_port

cpt_cmp_table:
源数据库需要进行校验的表信息。支持模式下所有表的校验,也支持模式下的单张表或者多张表的校验
比如:
DCMP JOB jobname=dcmp_person "192.168.160.161:5347:cpt_dm8" "PERSON.*"

(这张图是我测试RESOURCES表的图,PERSON的没截,大家知道这个意思就好)
(2)重复执行动态数据校验作业。
DCMP JOB JOBNAME=<job_name>

(3)查看报告
SHOW REPORT JOBNAME=<job_name>

(4)我们来测试一下
原来的数据(不要在意性别,随机生成的)

新插入5行数据

数据成功同步到目的端
这时再直接重复运行校验任务,结果如下

可以看到当前已同步的数据是一致的
现在我们创建一个存储过程来观察动态对比
每秒往PERSON.PERSON表中添加10行数据,每500行数据提交一次,持续5分钟
CREATE OR REPLACE PROCEDURE PERSON.INSERT_BATCH_DATA
AS
v_counter INT := 0; -- 用于计数当前批次插入的行数
v_total_inserted INT := 0; -- 用于统计总插入行数
v_start_time TIMESTAMP; -- 开始时间
v_end_time TIMESTAMP; -- 结束时间(开始时间+5分钟)
v_sex CHAR(1); -- 性别变量
v_name VARCHAR(50); -- 姓名变量
v_email VARCHAR(50); -- 邮箱变量
v_phone VARCHAR(25); -- 电话变量
BEGIN
-- 记录开始时间并计算结束时间
v_start_time := SYSTIMESTAMP;
v_end_time := v_start_time + INTERVAL '5' MINUTE;
DBMS_OUTPUT.PUT_LINE('开始批量插入数据: ' || TO_CHAR(v_start_time, 'YYYY-MM-DD HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('计划结束时间: ' || TO_CHAR(v_end_time, 'YYYY-MM-DD HH24:MI:SS'));
-- 主循环:持续运行直到达到5分钟
WHILE SYSTIMESTAMP < v_end_time LOOP
-- 每秒插入10条数据
FOR i IN 1..10 LOOP
-- 生成随机测试数据
v_sex := CASE ROUND(DBMS_RANDOM.VALUE(0, 1)) WHEN 0 THEN 'M' ELSE 'F' END;
v_name := 'Person_' || TO_CHAR(v_total_inserted + i, 'FM000000');
v_email := 'email' || TO_CHAR(v_total_inserted + i, 'FM000000') || '@example.com';
v_phone := '1' || TO_CHAR(DBMS_RANDOM.VALUE(3000000000, 4999999999));
-- 插入数据
INSERT INTO PERSON.PERSON (SEX, NAME, EMAIL, PHONE)
VALUES (v_sex, v_name, v_email, v_phone);
v_counter := v_counter + 1;
v_total_inserted := v_total_inserted + 1;
END LOOP;
-- 每500行提交一次
IF v_counter >= 500 THEN
COMMIT;
DBMS_OUTPUT.PUT_LINE('已提交 ' || v_total_inserted || ' 行数据,时间: ' || TO_CHAR(SYSTIMESTAMP, 'HH24:MI:SS'));
v_counter := 0;
END IF;
-- 等待1秒(减去插入10条数据所花费的时间)
DBMS_LOCK.SLEEP(1);
END LOOP;
-- 提交剩余未提交的数据
IF v_counter > 0 THEN
COMMIT;
DBMS_OUTPUT.PUT_LINE('最终提交: ' || v_total_inserted || ' 行数据');
END IF;
DBMS_OUTPUT.PUT_LINE('插入完成!总插入行数: ' || v_total_inserted);
DBMS_OUTPUT.PUT_LINE('实际结束时间: ' || TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('总耗时: ' || (SYSTIMESTAMP - v_start_time));
END;
初始状态:

50秒之后我们执行动态对比,结果如下:

100秒之后我们执行动态对比,结果如下:

存储过程执行完毕后,结果如下:


看到这大家可能觉得这和多次的静态数据对比没什么区别,但是大家可以思考一下,上面的例子是数据量比较小的情况,如果数据量很大,那同步就需要花费一定时间,如果我们想知道已经同步了的增量数据的一致性,即在数据同步的过程中进行数据的校验,就需要利用动态数据校验。
四、遇到的一些问题
4.1执行dcmp校验任务后dvs服务直接停了,执行show task会发现所有任务只有开始时间,没有结束时间

这个应该是内存的问题,我换了台虚拟机就可以了
4.2执行动态数据校验任务成功后,想看报告却有如下报错

我们可以在bin/log/dvs_时间.log中看到如下错误信息

这是因为在部署 DMDVS 时需配置动态库依赖路径,该报错一般都是需要的数据库驱动路径没加到环境变量里面导致,通过 ldd 检查动态库文件libdvdm.so发现存在缺失

这是因为我是在一台独立的服务器上安装的dvs,bin目录下可能不包含libdmdpi.so和libdmfldr.so,我们可以在数据库服务器上用find / -name libdmdpi.so和find / -name libdmfldr.so的方式找到这些文件路径并把它scp添加到动态库文件中,然后重启DMDVS即可

然后可能日志会出现这样的报错

然后可能日志会出现这样的报错

这样就成功了
社区地址:https://eco.dameng.com
2998

被折叠的 条评论
为什么被折叠?



