本次测试包含表、数据、视图、物化视图、触发器、存储过程、包、序列的同步
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进行调整
--创建同步用户
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;
测试流程:
先在源端创建表、序列、包等对象,安装DRS同步后再在目的端查看发现所有被创建的内容被同步过来并做测试
创建用户
创建表并插入数据
创建视图
创建物化视图
创建序列、触发器
创建存储过程
创建包
在源端安装DDL同步触发器
在目的端创建DMDRS用户
写单向配置信息
目的端 exec.xml
源端 cpt.xml
注册服务并启动服务 先启动目的端服务,再开启源端服务
控制台配置,先尝试装载表和数据
目的端查看表以及表中数据
源端添加、更新、删除数据并在目的端查看,验证数据被同步过来
装载全部的源端对象
目的端查询视图信息
源端删除旧视图创建新视图并在目的端查看,验证视图被同步过来
目的端查看物化视图信息
源端删除旧物化视图创建新物化视图并在目的端查看,验证物化视图被同步过来
目的端查看序列和触发器
目的端查看存储过程并调用测试
目的端查看包以及调用测试
测试流程:
将单向修改为双向,添加配置信息,注册服务等;之后开启drs同步,进行查看以及测试同步是否完成以及可用。
这里目标端已经有数据和表且数据一致,只需要再做增量追加 add dict
在DM1端插入新数据等待一会在DM2端查看可以看到数据被同步过来了(9303 A2B)
在DM2端插入新数据等待一会在DM1端查看可以看到数据被同步过来了(9302 B2A)

在DM2端添加一个视图V_TEST_B,在DM1端进行查看发现同步可用
在DM2端添加一个物化视图MV_TEST_B,在DM1端进行查看发现同步可用
在DM2目的端查看序列和触发器
在DM2目的端查看存储过程并调用测试
在DM2端查看包并调用测试
在DM2端创建新包并在DM1端查看并调用,在DM1端进行查看发现同步可用
可以通过DRS实现DM到DM之间的对象同步,包含表、数据、视图、物化视图、触发器、存储过程、包、序列的单向与双向同步功能。以及在源端进行更新操作时,在另一端可以同步更新的结果信息。
#DM同步中触发器默认是disable,默认情况同步后触发器不生效。
因为DRS本身是解析源库的日志来搬运数据的,而触发器执行也会产生日志。如果目标库的触发器也生效,就很容易出现“搬运一次,触发器又生成一次”的重复操作,导致主键冲突或者数据翻倍。所以,为了确保同步的数据和源库严格一致,DRS 默认会屏蔽目标端触发器的执行。
#双向同步中如果遇到序列同步无限增长的情况,需要在/data/dmdrs/bin/drs.xml文件中加入用户ID,两个源端都需要添加。
这个参数的作用是用来过滤添加用户的所有序列值同步操作
文章
阅读量
获赞
