一、DMHS简介
DMHS是达梦数据实时同步软件,主要用于同构或异构数据库之间的数据实时复制。它通过解析源数据库日志获取INSERT、UPDATE、DELETE和DDL等操作,再将这些变化发送到目标端执行,不需要通过业务表触发器持续捕获DML数据。
DMHS可以配置一对一、一对多、多对一和级联等同步结构,常用于数据迁移、实时备份、容灾和数据分发。DMHS系统组成说明
二、DMHS同步原理
DMHS主要由以下模块组成:
| 模块 | 作用 |
|---|---|
| MGR | 管理DMHS服务和其他模块 |
| LOAD | 完成表结构及存量数据的初始装载 |
| CPT | 解析源数据库日志,捕获增量变化 |
| NET | 过滤、映射并传输同步消息 |
| EXEC | 将接收到的数据变化写入目标数据库 |
一次完整的数据同步通常包括全量装载和增量同步两个阶段。
全量装载由LOAD模块读取源端表结构和现有数据,在目标数据库中创建对应对象并写入存量数据。增量同步由CPT模块持续解析源数据库日志,再通过NET模块将变化发送到目标端,最后由EXEC模块还原并执行相应操作。
text
源数据库
→ LOAD全量装载
→ CPT捕获增量日志
→ NET传输
→ EXEC执行
→ 目标数据库
三、环境规划
本文使用两个DM8实例完成单向同步。
| 节点 | 地址 | 作用 |
|---|---|---|
| 源端 | 192.168.159.133:5236 | 提供APP模式下的源数据 |
| 目标端 | 192.168.159.130:5236 | 接收APP模式下的数据 |
| DMHS管理端口 | 5345 | 接收控制台管理命令 |
| DMHS数据端口 | 5346 | 接收源端同步消息 |
源端和目标端均需安装与操作系统、硬件架构和数据库类型匹配的DMHS软件,并准备对应的libdmoci.so动态库。
bash
export DMHS_HOME=/dm8/dmhs
export PATH=$DMHS_HOME/bin:$PATH
export LD_LIBRARY_PATH=$DMHS_HOME/bin:$DM_HOME/bin:$LD_LIBRARY_PATH
可以使用ldd检查DMHS模块是否缺少动态库。
bash
ldd $DMHS_HOME/bin/libcpt_dm8.so
ldd $DMHS_HOME/bin/libdmhs_exec.so
四、数据库准备
1. 开启源数据库归档
sql
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG
'DEST=/dm8/arch,TYPE=LOCAL,FILE_SIZE=512,SPACE_LIMIT=10240';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
2. 开启逻辑日志
sql
CALL SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
检查参数是否生效:
sql
SELECT PARA_NAME,PARA_VALUE,SESS_VALUE,FILE_VALUE
FROM V$DM_INI
WHERE PARA_NAME='RLOG_APPEND_LOGIC';
3. 配置DDL同步
如果需要同步建表、修改表结构等DDL操作,需要在源数据库执行DMHS安装目录中提供的DDL脚本,并在CPT配置中设置ddl_mask。
4. 准备同步用户
源端用户需要具有源表查询和日志读取权限,目标端用户需要具有建表及数据写入权限。本文使用源端和目标端已有的APP用户进行同步。
五、配置目标端DMHS
在目标端编辑dmhs.hs:
xml
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<data_port>5346</data_port>
</recv>
<db_type>dm8</db_type>
<db_server>192.168.159.130</db_server>
<db_user>APP</db_user>
<db_pwd>Dameng123</db_pwd>
<db_port>5236</db_port>
<exec_thr>4</exec_thr>
</exec>
</dmhs>
mgr_port是DMHS管理端口,data_port用于接收源端数据,siteid是同步节点的唯一标识,exec_thr表示目标端数据执行线程数。
六、配置源端DMHS
在源端编辑dmhs.hs:
xml
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<db_type>dm8</db_type>
<db_server>192.168.159.133</db_server>
<db_user>APP</db_user>
<db_pwd>Dameng123</db_pwd>
<db_port>5236</db_port>
<parse_thr>1</parse_thr>
<ddl_mask>op:obj</ddl_mask>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send>
<ip>192.168.159.130</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<filter>
<enable>
<item>APP.*</item>
</enable>
</filter>
<map>
<item>APP.*==APP.*</item>
</map>
</send>
</cpt>
</dmhs>
filter用于设置同步对象白名单,map用于设置源端对象与目标端对象的映射关系。这里表示将源端APP模式下的对象同步到目标端APP模式。
七、启动数据同步
先启动目标端DMHS服务:
bash
cd $DMHS_HOME/bin
./dmhs_server
进入控制台并启动EXEC模块:
text
DMHS> start exec
然后启动源端DMHS服务并进入控制台:
bash
cd $DMHS_HOME/bin
./dmhs_server
./dmhs_console
清理目标端原有同步起点:
text
DMHS> clear exec lsn
执行APP模式的全量装载:
text
DMHS> copy 0 "SCH.NAME='APP'" CREATE|INSERT|INDEX|COMMENT
全量数据装载完成后启动CPT模块:
text
DMHS> start cpt
CPT启动后会持续解析源数据库日志,将新的数据变化发送到目标端。DM8到DM8部署示例
八、同步验证
在源端插入一条测试数据并提交:
sql
INSERT INTO APP.STUDENTS
VALUES (1001,'TEST USER',SYSDATE);
COMMIT;
在目标端查询:
sql
SELECT * FROM APP.STUDENTS WHERE ID=1001;
如果目标端能够查询到新增数据,说明增量同步已经正常运行。实际使用时还应检查源端CPT、目标端EXEC、网络连接和同步检查点状态,确认同步链路不存在异常或明显延迟。