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

相关推荐
Hardworking6662 小时前
第6章 数据工程
运维·服务器·数据库·数据工程
Elastic 中国社区官方博客2 小时前
4 个英伟达人工智能任务,1 个 Elasticsearch 接口:嵌入、聊天、completion 和重排序
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
G.O.G.O.G3 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
其实防守也摸鱼3 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
不能只会打代码3 小时前
Day 002 — Python 工程化 & FastAPI & 数据库速通
数据库·redis·python·docker·fastapi·测试
Rsun045514 小时前
MySQL 中什么是回表?
数据库·mysql
Sylvia33.4 小时前
足球数据接口开发实战:如何用火星数据API盘活赛事应用
java·服务器·开发语言·数据库·python
ruleslol5 小时前
Mybatis11-不同的数据库连接池的配置
数据库·mybatis
苏州邦恩精密5 小时前
蔡司3D扫描仪厂家如何应用于航空航天制造
大数据·数据库·人工智能·3d·自动化·制造