注册
DRS同步测试
专栏/技术分享/ 文章详情 /

DRS同步测试

雾岛听风 2026/09/23 199 0 0
摘要

DRS

DM-DM之间DMDRS的同步,单向、双向测试

1测试说明

本次测试包含表、数据、视图、物化视图、触发器、存储过程、包、序列的同步

2测试环境

X86_64 4c

操作系统: Kylin V10 SP3

IP DM1:192.168.126.150:5236 DM2:192.168.126.150:5237

内存:6648

数据库版本: 03134284552-20260414-322369-20221

初始化参数: extent_size=32 page_size=32 charset=0 case_sensitive=1 blank_pad_mode=1

源端RLOG_APPEND_LOGIC=1 ARCH_INI=1 RLOG_APPEND_SYSTAB_LOGIC = 1

#其他参数依据参数优化脚本V5.6进行调整

3语句记录

--创建同步用户 CREATE USER DMDRS IDENTIFIED BY "Dmdrs@2026"; GRANT DBA TO DMDRS; -- 建表 CREATE TABLE DMDRS.TEST (     ID   INT,     NAME VARCHAR(10) ); -- 插入测试数据 INSERT INTO DMDRS.TEST VALUES (1, 'AAA'); INSERT INTO DMDRS.TEST VALUES (2, 'BBB'); INSERT INTO DMDRS.TEST VALUES (3, 'CCC'); COMMIT; -- 查询验证 SELECT * FROM DMDRS.TEST; -- 基于 TEST 表创建视图 CREATE VIEW DMDRS.V_TEST1 AS SELECT ID, NAME FROM DMDRS.TEST WHERE ID > 2; -- 查询视图 SELECT * FROM DMDRS.V_TEST1; -- 创建物化视图,完全刷新、按需触发 CREATE MATERIALIZED VIEW DMDRS.MV_TEST1 REFRESH COMPLETE ON DEMAND AS SELECT ID, NAME FROM DMDRS.TEST WHERE ID < 3; -- 手动刷新 REFRESH MATERIALIZED VIEW DMDRS.MV_TEST1 COMPLETE; -- 查询物化视图 REFRESH MATERIALIZED VIEW DMDRS.MV_TEST1 COMPLETE; SELECT * FROM DMDRS.MV_TEST1; -- 创建序列,供触发器或主键自增使用 CREATE SEQUENCE DMDRS.SEQ_TEST_ID START WITH 100 INCREMENT BY 1 NOCYCLE CACHE 10; -- 测试取值 SELECT DMDRS.SEQ_TEST_ID.NEXTVAL FROM DUAL; -- 触发器 插入 TEST 时,若 ID 为空,用序列自动填充 CREATE OR REPLACE TRIGGER DMDRS.TRG_TEST_ID BEFORE INSERT ON DMDRS.TEST FOR EACH ROW WHEN (NEW.ID IS NULL) BEGIN     SELECT DMDRS.SEQ_TEST_ID.NEXTVAL INTO :NEW.ID FROM DUAL; END; / -- 测试:不指定 ID 插入 INSERT INTO DMDRS.TEST (NAME) VALUES ('EEE'); COMMIT; -- 查看结果 SELECT * FROM DMDRS.TEST; -- 存储过程:根据 ID 查询 NAME 并打印 CREATE OR REPLACE PROCEDURE DMDRS.P_TEST_QUERY(     P_ID IN INT ) AS     V_NAME VARCHAR(10); BEGIN     SELECT NAME INTO V_NAME FROM DMDRS.TEST WHERE ID = P_ID;     DBMS_OUTPUT.PUT_LINE('ID=' || P_ID || ', NAME=' || V_NAME); EXCEPTION     WHEN NO_DATA_FOUND THEN         DBMS_OUTPUT.PUT_LINE('未找到 ID=' || P_ID);     WHEN OTHERS THEN         DBMS_OUTPUT.PUT_LINE('异常: ' || SQLERRM); END; / -- 调用 SET SERVEROUTPUT ON; CALL DMDRS.P_TEST_QUERY(1); CALL DMDRS.P_TEST_QUERY(999); -- 1. 包规范 CREATE OR REPLACE PACKAGE DMDRS.PKG_TEST AS     FUNCTION F_COUNT RETURN INTEGER; END PKG_TEST; / -- 2. 包体 CREATE OR REPLACE PACKAGE BODY DMDRS.PKG_TEST AS     FUNCTION F_COUNT RETURN INTEGER IS         V_CNT INTEGER;     BEGIN         SELECT COUNT(*) INTO V_CNT FROM DMDRS.TEST;         RETURN V_CNT;     END F_COUNT; END PKG_TEST; / -- 3. 调用测试 SET SERVEROUTPUT ON; DECLARE     V_RESULT INTEGER; BEGIN     V_RESULT := DMDRS.PKG_TEST.F_COUNT();     DBMS_OUTPUT.PUT_LINE('当前计数: ' || V_RESULT); END; / -- 表数据 SELECT * FROM DMDRS.TEST; -- 视图 SELECT * FROM DMDRS.V_TEST; -- 物化视图 SELECT * FROM DMDRS.MV_TEST; -- 序列 SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OWNER = 'DMDRS' AND OBJECT_TYPE = 'SEQUENCE' ORDER BY OBJECT_NAME; -- 触发器 SELECT OWNER, TRIGGER_NAME,STATUS FROM ALL_TRIGGERS WHERE OWNER = 'DMDRS'; -- 存储过程 SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OWNER = 'DMDRS' AND OBJECT_TYPE = 'PROCEDURE' ORDER BY OBJECT_NAME; -- 包 SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OWNER = 'DMDRS' AND OBJECT_TYPE = 'PACKAGE' ORDER BY OBJECT_NAME;

4测试流程

4.1单向同步DM1(源5236)→DM2(目的5237)测试

测试流程:

先在源端创建表、序列、包等对象,安装DRS同步后再在目的端查看发现所有被创建的内容被同步过来并做测试

源端创建对象

创建用户
image1.png
创建表并插入数据
image2.png
创建视图
image3.png
创建物化视图
image4.png
创建序列、触发器
image5.png
创建存储过程
image6.png
创建包
image7.png

安装DRS

image8.png
image9.png
在源端安装DDL同步触发器
image10.png
image11.png

在目的端创建DMDRS用户
image12.png

写单向配置信息

目的端 exec.xml
image13.png

源端 cpt.xml
image14.png

注册服务并启动服务 先启动目的端服务,再开启源端服务
image15.png

控制台配置,先尝试装载表和数据
image16.png

目的端进行查看信息并进行测试

image17.png

目的端查看表以及表中数据
image18.png

源端添加、更新、删除数据并在目的端查看,验证数据被同步过来
image19.png

装载全部的源端对象
image20.png
目的端查询视图信息
image21.png

源端删除旧视图创建新视图并在目的端查看,验证视图被同步过来
image22.png

目的端查看物化视图信息
image23.png
源端删除旧物化视图创建新物化视图并在目的端查看,验证物化视图被同步过来
image24.png

目的端查看序列和触发器
image25.png

目的端查看存储过程并调用测试
image26.png

目的端查看包以及调用测试
image27.png

4.2双向同步DM1(5236)⇆DM2(5237)测试

测试流程:

将单向修改为双向,添加配置信息,注册服务等;之后开启drs同步,进行查看以及测试同步是否完成以及可用。

目的端配置DDL同步触发器

image28.png
image29.png

记录USER_ID

image30.png

写双向配置信息

image31.png
image32.png

SET LSN设置数据库当前最新的日志LSN作为日志解析的位置

image33.png
image34.png

这里目标端已经有数据和表且数据一致,只需要再做增量追加 add dict
image35.png
image36.png

同步测试

image38.png

在DM1端插入新数据等待一会在DM2端查看可以看到数据被同步过来了(9303 A2B)
image37.png

在DM2端插入新数据等待一会在DM1端查看可以看到数据被同步过来了(9302 B2A)

在DM2端添加一个视图V_TEST_B,在DM1端进行查看发现同步可用
image39.png

在DM2端添加一个物化视图MV_TEST_B,在DM1端进行查看发现同步可用
image40.png

在DM2目的端查看序列和触发器
image41.png

在DM2目的端查看存储过程并调用测试
image42.png

在DM2端查看包并调用测试
image43.png

在DM2端创建新包并在DM1端查看并调用,在DM1端进行查看发现同步可用
image44.png

5结论

总结

可以通过DRS实现DM到DM之间的对象同步,包含表、数据、视图、物化视图、触发器、存储过程、包、序列的单向与双向同步功能。以及在源端进行更新操作时,在另一端可以同步更新的结果信息。

问题收获

#DM同步中触发器默认是disable,默认情况同步后触发器不生效。

因为DRS本身是解析源库的日志来搬运数据的,而触发器执行也会产生日志。如果目标库的触发器也生效,就很容易出现“搬运一次,触发器又生成一次”的重复操作,导致主键冲突或者数据翻倍。所以,为了确保同步的数据和源库严格一致,DRS 默认会屏蔽目标端触发器的执行。
image45.png
image46.png
image47.png
image48.png

#双向同步中如果遇到序列同步无限增长的情况,需要在/data/dmdrs/bin/drs.xml文件中加入用户ID,两个源端都需要添加。

这个参数的作用是用来过滤添加用户的所有序列值同步操作
image49.png
image50.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服