两台 DM8 数据库通过 DMDRS 进行单向同步:源端 CPT 捕获并发送变更,目标端 EXEC 接收并执行。部署采用服务脚本,不使用 DMDFM。
实验环境拓扑:
源端 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 安装包需与操作系统架构匹配,按授权情况选择许可证。
先在源库检查归档与逻辑日志:
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;
将安装包上传到两台机器,以 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_* 触发器及辅助表。此脚本只在源库执行,目标库不执行。
在目标端编辑 /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
在源端编辑 /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 的名称一致。<send> 中的 15515 是目标端 Manager 端口,不是数据库端口。
两端分别复制服务模板:
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。
先在目标库查询初始数据,再在源库执行一组增、改、删操作:
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 同步结果尚未实测。
目标端查看服务状态并连接控制台:
/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。
源端控制台暂停或恢复 CPT:
stop cpt_dm8
start cpt_dm8
停止整条链路时,先停源端 CPT,再停源端、目标端服务。恢复时先启动目标端服务及 EXEC,再启动源端服务及 CPT。两端服务命令相同:
/home/dmdba/dmdrs5/bin/DrsService stop /home/dmdba/dmdrs5/bin/DrsService start
源库建表并提交后,在源端控制台装载新表:
alter cpt_dm8 add table "sch.name='SYNC_TEST' and tab.name='T_NEW'" CREATE|INSERT|INDEX
目标库不提前创建同名表。装载完成后核对两端行数,再通过源端 DML 检查增量同步。
文章
阅读量
获赞
