注册
DMDRS 单向同步部署与使用
专栏/技术分享/ 文章详情 /

DMDRS 单向同步部署与使用

wwhhdd 2026/10/10 179 2 0
摘要

DMDRS 单向同步部署与使用:DM8 到 DM8

两台 DM8 数据库通过 DMDRS 进行单向同步:源端 CPT 捕获并发送变更,目标端 EXEC 接收并执行。部署采用服务脚本,不使用 DMDFM。

1. 同步架构与环境

实验环境拓扑:

源端 DM8(192.0.2.10)+ CPT  ────>  目标端 DM8(192.0.2.11)+ EXEC
       捕获、发送变更                         接收、执行变更

两端数据库端口均为 5236,DMDRS Manager 端口均为 15515;源端 siteid=1,目标端 siteid=2。目录和配置文件路径如下:

用途 路径
DM8 安装目录 /home/dmdba/dmdbms
DMDRS 安装目录 /home/dmdba/dmdrs5
源端配置 /home/dmdba/dmdrs5/bin/cpt.xml
目标端配置 /home/dmdba/dmdrs5/bin/exec.xml

两台机器使用 dmdba 安装、运行 DMDRS。部署前确认数据库正常运行,5236 已监听,15515 未被占用,两端网络互通;源端还要能连接目标端的 15515 端口。DMDRS 安装包需与操作系统架构匹配,按授权情况选择许可证。

2. 准备源库和测试对象

先在源库检查归档与逻辑日志:

SELECT ARCH_MODE FROM V$DATABASE; SELECT PARA_NAME, PARA_VALUE, SESS_VALUE, FILE_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('ARCH_INI', 'RLOG_APPEND_LOGIC'); SELECT ARCH_TYPE, ARCH_DEST, ARCH_STATUS FROM V$ARCH_STATUS;

源库应已启用本地归档和逻辑日志。RLOG_APPEND_LOGIC 已为 1 或 2 时保留原配置;为 0 时再按当前环境要求启用。例如:

CALL SP_SET_PARA_VALUE(1, 'RLOG_APPEND_LOGIC', 1);

两端创建同步用户和测试模式。实验环境给同步用户授予 DBA 权限:

CREATE USER DMDRS IDENTIFIED BY "REPLACE_WITH_PASSWORD"; GRANT DBA TO DMDRS; CREATE USER SYNC_TEST IDENTIFIED BY "REPLACE_WITH_TEST_PASSWORD"; GRANT PUBLIC, RESOURCE TO SYNC_TEST;

只在源库创建表并写入初始数据,目标库暂不创建同名表:

CREATE TABLE SYNC_TEST.T_DEMO (ID INT PRIMARY KEY, NAME VARCHAR(50), NOTE VARCHAR(100)); INSERT INTO SYNC_TEST.T_DEMO VALUES (1, 'first', 'initial data'); INSERT INTO SYNC_TEST.T_DEMO VALUES (2, 'second', 'initial data'); COMMIT;

3. 安装 DMDRS,并准备源端辅助对象

将安装包上传到两台机器,以 dmdba 运行安装程序:

chmod 700 /home/dmdba/dmdrs-install.bin /home/dmdba/dmdrs-install.bin -i

安装目录设为 /home/dmdba/dmdrs5,数据库驱动路径设为 /home/dmdba/dmdbms/bin。DMDRS 直接部署在服务器上,不安装 DMDFM 和代理。安装后检查 bin/drsvr、bin/drcsl 和 bin/service_template/TemplateService 是否存在。

本次使用的 DMDRS 版本在启动 CPT 时会检查 DRS 辅助触发器。首次部署前,在源库检查安装目录中的脚本:

ls -l /home/dmdba/dmdrs5/bin/scripts/ddl_sql_dm8.sql

以 SYSDBA 连接源库,先检查是否已有 DRS 辅助对象;确认是首次部署且对象不存在后,再执行脚本:

SELECT OWNER, TRIGGER_NAME, STATUS FROM DBA_TRIGGERS WHERE OWNER = 'SYSDBA' AND TRIGGER_NAME LIKE 'DRS_$%'; SELECT OWNER, TABLE_NAME, STATUS FROM DBA_TABLES WHERE OWNER = 'SYSDBA' AND TABLE_NAME LIKE 'DRS_$%'; SET DEFINE OFF; START /home/dmdba/dmdrs5/bin/scripts/ddl_sql_dm8.sql

执行后重新查询,检查 4 个 DRS_$DDL_TRIGGER_* 触发器及辅助表。此脚本只在源库执行,目标库不执行。

4. 配置目标端 EXEC

在目标端编辑 /home/dmdba/dmdrs5/bin/exec.xml:

<?xml version="1.0" encoding="GB18030"?> <drs> <base> <mgr_port>15515</mgr_port> <siteid>2</siteid> </base> <exec> <name>exec_dm8</name> <login> <dbtype>dm8</dbtype> <server>192.0.2.11</server> <user>DMDRS</user> <pwd>REPLACE_WITH_PASSWORD</pwd> <port>5236</port> </login> </exec> </drs>

保存后限制配置文件权限:

chmod 600 /home/dmdba/dmdrs5/bin/exec.xml

5. 配置源端 CPT

在源端编辑 /home/dmdba/dmdrs5/bin/cpt.xml:

<?xml version="1.0" encoding="GB18030"?> <drs> <base> <mgr_port>15515</mgr_port> <siteid>1</siteid> </base> <cpt> <name>cpt_dm8</name> <login> <dbtype>dm8</dbtype> <server>192.0.2.10</server> <user>DMDRS</user> <pwd>REPLACE_WITH_PASSWORD</pwd> <port>5236</port> </login> <send> <ip>192.0.2.11</ip> <port>15515</port> <target_name>exec_dm8</target_name> <map> <item>SYNC_TEST.T_DEMO==SYNC_TEST.T_DEMO</item> </map> </send> </cpt> </drs>
chmod 600 /home/dmdba/dmdrs5/bin/cpt.xml

两端 siteid 不能相同;target_name 必须与目标端 EXEC 的名称一致。&lt;send> 中的 15515 是目标端 Manager 端口,不是数据库端口。

6. 配置服务并启动模块

两端分别复制服务模板:

cp /home/dmdba/dmdrs5/bin/service_template/TemplateService /home/dmdba/dmdrs5/bin/DrsService vim /home/dmdba/dmdrs5/bin/DrsService

两端除 CONF_PATH 外,其余配置相同:

INSTALL_HOME=/home/dmdba/dmdrs5 PROG_DIR=/home/dmdba/dmdrs5/bin NEED_LIB_PATH=/home/dmdba/dmdbms/bin EXEC_PROG_NAME=drsvr SERVICE_TYPE_NAME="drs server"

目标端另设 CONF_PATH=/home/dmdba/dmdrs5/bin/exec.xml;源端设 CONF_PATH=/home/dmdba/dmdrs5/bin/cpt.xml。保存后检查每项配置只出现一次,尤其不能留下 EXEC_PROG_NAME=_REPLACE_SELF_PROG_NAME:

grep -nE '^(INSTALL_HOME|PROG_DIR|CONF_PATH|NEED_LIB_PATH|EXEC_PROG_NAME|SERVICE_TYPE_NAME)=' /home/dmdba/dmdrs5/bin/DrsService chmod 700 /home/dmdba/dmdrs5/bin/DrsService

先在目标端启动服务并检查端口:

/home/dmdba/dmdrs5/bin/DrsService start ss -lntp | grep ':15515'

目标端正常后,在源端执行相同的启动和端口检查命令。两端服务均已启动,再到目标端控制台启动 EXEC:

/home/dmdba/dmdrs5/bin/drcsl /home/dmdba/dmdrs5/bin/exec.xml
connect
show mode
start exec_dm8
show mode

然后在源端控制台装载并启动 CPT:

/home/dmdba/dmdrs5/bin/drcsl /home/dmdba/dmdrs5/bin/cpt.xml
connect
show mode
alter cpt_dm8 set lsn
alter cpt_dm8 add table "sch.name='SYNC_TEST' and tab.name='T_DEMO'" CREATE|INSERT|INDEX
show cpt_dm8 dict all
start cpt_dm8
show mode

set lsn 设置源库当前日志位置为解析起点;add table 装载指定表的字典和数据,并在目标端建表、插入数据及创建索引。首次装载完成后再检查目标端数据,不要在装载过程中重复执行 add table。

7. 验证同步

先在目标库查询初始数据,再在源库执行一组增、改、删操作:

SELECT * FROM SYNC_TEST.T_DEMO ORDER BY ID;
INSERT INTO SYNC_TEST.T_DEMO VALUES (3, 'third', 'insert test'); UPDATE SYNC_TEST.T_DEMO SET NOTE = 'updated' WHERE ID = 1; DELETE FROM SYNC_TEST.T_DEMO WHERE ID = 2; COMMIT;

在目标库再次执行 SELECT * FROM SYNC_TEST.T_DEMO ORDER BY ID;。预期剩余 ID=1、3,其中 ID=1 的 NOTE 为 updated。同时检查两端 show mode 和日志:

grep -RniE 'ERROR|WARN|失败|错误' /home/dmdba/dmdrs5/bin/log | tail -n 50

上述 SQL 是验证方法。源端服务启动已验证,全量装载和 DML 同步结果尚未实测。

8. 常用操作

8.1 查看服务与模块状态

目标端查看服务状态并连接控制台:

/home/dmdba/dmdrs5/bin/DrsService status /home/dmdba/dmdrs5/bin/drcsl /home/dmdba/dmdrs5/bin/exec.xml

源端使用 cpt.xml:

/home/dmdba/dmdrs5/bin/DrsService status /home/dmdba/dmdrs5/bin/drcsl /home/dmdba/dmdrs5/bin/cpt.xml

控制台中执行:

connect
show mode

服务状态、模块状态和目标表数据需一起核对;日志路径为 /home/dmdba/dmdrs5/bin/log。

8.2 暂停与恢复同步

源端控制台暂停或恢复 CPT:

stop cpt_dm8
start cpt_dm8

停止整条链路时,先停源端 CPT,再停源端、目标端服务。恢复时先启动目标端服务及 EXEC,再启动源端服务及 CPT。两端服务命令相同:

/home/dmdba/dmdrs5/bin/DrsService stop /home/dmdba/dmdrs5/bin/DrsService start

8.3 新增同步表

源库建表并提交后,在源端控制台装载新表:

alter cpt_dm8 add table "sch.name='SYNC_TEST' and tab.name='T_NEW'" CREATE|INSERT|INDEX

目标库不提前创建同名表。装载完成后核对两端行数,再通过源端 DML 检查增量同步。

参考资料

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服