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

相关推荐
薛晓刚1 小时前
国产化深水区:正在被重构的DBA价值与第三方服务格局
oracle·重构·dba
敲上瘾2 小时前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
2401_894915536 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
正儿八经的少年11 小时前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存
xrandzj11 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉11 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
denggun1234511 小时前
yield
前端·数据库·python
ltl12 小时前
SQLite Rollback Journal:写前拷贝与提交点
数据库
ltl12 小时前
TiFlash Learner:Raft 日志如何进列存
数据库
ltl12 小时前
BM25 与 Lucene Similarity:公式如何落到 postings
数据库