DMDRS 用于在不同数据库之间进行数据复制。本笔记围绕两类数据库链路展开:DM8 到 DM8,以及 Oracle 到 DM8。学习重点包括 DMDRS 服务部署、源端和目标端配置、一次性全量数据迁移、持续单向数据同步,以及迁移与同步在操作方式和使用场景上的区别。
DMDRS 访问不同数据库需要加载对应的数据库驱动。DM8 使用 DMDPI 驱动;Oracle 10g 及以上版本使用 OCI 驱动。因此 DM→DM 场景的源端和目标端均需要 DMDPI,Oracle→DM 场景的源端需要 OCI,目标端需要 DMDPI。
chown -R <dmdba>:<dinstall> /data/dmdrs5
chmod -R u+rwX /data/dmdrs5
DM8 环境需要将 DMDPI 驱动目录加入 LD_LIBRARY_PATH:
vi ~/.bash_profile
export LD_LIBRARY_PATH=<DMDPI驱动路径>:$LD_LIBRARY_PATH
source ~/.bash_profile
echo $LD_LIBRARY_PATH
Oracle 源端则需要 OCI 驱动:
export LD_LIBRARY_PATH=<OCI驱动路径>:$LD_LIBRARY_PATH
source ~/.bash_profile
echo $LD_LIBRARY_PATH
持续同步依赖源数据库的归档日志和逻辑日志。DM8 源库至少要开启
ARCH_INI,并配置 RLOG_APPEND_LOGIC。
-- 检查参数
SELECT PARA_NAME, PARA_VALUE, SESS_VALUE, FILE_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('ARCH_INI', 'RLOG_APPEND_LOGIC');
动态配置示例:
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG
'DEST=<归档目录>,TYPE=LOCAL,FILE_SIZE=512,SPACE_LIMIT=10240';
ALTER DATABASE OPEN;
CALL SP_SET_PARA_VALUE(1, 'RLOG_APPEND_LOGIC', 1);
说明:RLOG_APPEND_LOGIC=1 时,有主键表的 UPDATE/DELETE 逻辑日志主要记录主键列信息;无主键表则记录所有列。
当需要同步 CREATE/ALTER/DROP 等 DDL 操作,直接执行 DMDRS 自带的 ddl_sql_dm8.sql:
set define off;
start /data/dmdrs5/bin/scripts/ddl_sql_dm8.sql
执行后可检查 DRS 触发器和辅助表是否存在:
SELECT OWNER, TRIGGER_NAME
FROM DBA_TRIGGERS
WHERE OWNER='SYSDBA'
AND TRIGGER_NAME LIKE 'DRS_$%'
AND STATUS='Y';
SELECT OWNER, TABLE_NAME
FROM DBA_TABLES
WHERE OWNER='SYSDBA'
AND TABLE_NAME LIKE 'DRS_$%'
AND STATUS='VALID';
源库和目标库均使用独立同步用户 DMDRS。
CREATE USER DMDRS IDENTIFIED BY "Dmdrs@2026";
GRANT DBA TO DMDRS;
目标端 EXEC 负责连接目标 DM8 并执行源端发送来的数据。当前目标数据库为 192.168.192.11:5236,Manager 端口 5346,站点号 2。
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5346</mgr_port>
<siteid>2</siteid>
</base>
<exec>
<name>exec_dm8</name>
<login>
<dbtype>dm8</dbtype>
<server>192.168.192.11</server>
<user>DMDRS</user>
<pwd>Dmdrs@2026</pwd>
<port>5236</port>
</login>
</exec>
</drs>
源端 CPT 负责连接源 DM8、捕获/装载数据并发送到目标 EXEC。
<?xml version="1.0" encoding="GB18030"?>
<drs>
<base>
<mgr_port>5345</mgr_port>
<siteid>1</siteid>
</base>
<cpt>
<name>cpt_dm8</name>
<ddl_mask>OBJ:OP</ddl_mask>
<login>
<dbtype>dm8</dbtype>
<server>192.168.168.11</server>
<user>DMDRS</user>
<pwd>Dmdrs@2026</pwd>
<port>5237</port>
</login>
<send>
<ip>192.168.168.11</ip>
<port>5346</port>
<target_name>exec_dm8</target_name>
<map>
<item>DMDRS.*==DMDRS.*</item>
</map>
</send>
</cpt>
</drs>
手册使用 service_template 中的 TemplateService 管理 drsvr。原则是先启动目标 EXEC 服务,再启动源 CPT 服务。
cd /data/dmdrs5/bin/service_template
cp TemplateService ../DrsService
cd /data/dmdrs5/bin
# 目标端脚本核心参数
INSTALL_HOME=/data/dmdrs5
PROG_DIR=/data/dmdrs5/bin
CONF_PATH=/data/dmdrs5/bin/exec.xml
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME="drs server"
./DrsService start
源端脚本把 CONF_PATH 改为 cpt.xml:
INSTALL_HOME=/data/dmdrs5
PROG_DIR=/data/dmdrs5/bin
CONF_PATH=/data/dmdrs5/bin/cpt.xml
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME="drs server"
./DrsService start
数据迁移用于一次性把源端已有数据全量复制到目标端。手册的 DM8→DM8 示例通过 CPT 的 cp 命令完成全量迁移,迁移功能本身不需要先启动 CPT 的持续日志捕获模块。
cd /data/dmdrs5/bin
./drcsl cpt.xml
CSL> connect
迁移单表:
CSL> alter cpt_dm8 cp "sch.name='DMDRS' and tab.name='表名'"
迁移整个模式时,可按对象过滤条件扩大范围:
CSL> alter cpt_dm8 cp "sch.name='DMDRS'"
-- 源端
SELECT COUNT(*) FROM DMDRS.<表名>;
-- 目标端
SELECT COUNT(*) FROM DMDRS.<表名>;
单向同步的目标不仅是复制已有数据,还要持续捕获源端后续的 INSERT、UPDATE、DELETE,必要时还包括 DDL,使目标端持续跟随源端变化。
cd /data/dmdrs5/bin
./drcsl cpt.xml
CSL> connect
CSL> alter cpt_dm8 set lsn
set lsn
将数据库当前最新日志位置设置为日志解析起点。这一步决定持续增量捕获从哪里开始。
CSL> start
此时 CPT 开始按照配置解析源数据库日志并向目标 EXEC 发送变化。
同步整个 DMDRS 模式:
CSL> alter cpt_dm8 add table "sch.name='DMDRS'"
同步单表:
CSL> alter cpt_dm8 add table "sch.name='DMDRS' and tab.name='表名'"
说明:手册中的 add table 不只是登记后续增量对象,还会在开始持续同步前把源端该对象的全量数据装载到目标端。
在源端进行 DML:
INSERT INTO DMDRS.<表名>(...) VALUES (...);
COMMIT;
UPDATE DMDRS.<表名>
SET ...
WHERE ...;
COMMIT;
DELETE FROM DMDRS.<表名>
WHERE ...;
COMMIT;
然后在目标端检查对应记录是否自动出现、修改或删除。
若配置了 DDL 同步,可再测试:
ALTER TABLE DMDRS.<表名> ADD TEST_COL VARCHAR(50);
文章
阅读量
获赞
