DRS运行过程中的DVS数据对比

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值