DMHS同步原理与DM8到DM8基础搭建

一、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、网络连接和同步检查点状态,确认同步链路不存在异常或明显延迟。

相关推荐
JckOLF04Z22 分钟前
自动开机调用迅雷下载数据库备份,完成后自动关机
数据库·单片机·嵌入式硬件
霖霖总总30 分钟前
[MongoDB小技巧30]MongoDB 数据生命周期管理完全指南:从 TTL 索引到冷热分离归档
数据库·mongodb
生戎马 平安京策37 分钟前
SQL Transcation的一些总结
数据库·sql·oracle
吃饱了得干活42 分钟前
向量数据库 Milvus:从零搭建 RAG 向量数据库实战
数据库·langchain·agent
jjjava2.01 小时前
MyBatis动态if/trim/where/set标签详解
java·开发语言·数据库
2601_955759621 小时前
企业 Claude API 用量峰值管理实战
数据库
runningshark2 小时前
DeepSeek V4 Flash 0423 实效评测与能力全景
大数据·数据库
施嘉伟2 小时前
KingbaseES V9 Oracle兼容版:SQL 调优实测
sql·oracle
憧憬成为原神糕手2 小时前
Playwright、Selenium、DrissionPage 与 JSON 接口怎么选?
数据库·selenium·json
long3162 小时前
04-MySQL 扩展学习资料
数据库·mysql·adb