注册
达梦V8-DMHS部署运行dm8-dm8
专栏/技术分享/ 文章详情 /

达梦V8-DMHS部署运行dm8-dm8

Think 2026/07/10 347 0 0
摘要

1、概念总结
达梦数据实时同步软件 DMHS 是达梦公司推出的新一代支持异构环境的高性能、高可靠和高可扩展的数据库实时同步系统。该产品基于成熟的关系数据模型和标准接口,跨越多种软硬件平台实现秒级数据实时同步。该产品可广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发和多业务中心等业务领域。
达梦数据实时同步软件 DMHS,通过秒级数据实时同步可以有效避免传统备份系统导致的无法完全满足企业对于信息系统不中断服务的问题;通过变化日志捕捉可以有效降低传统 ETL 工具因创建触发器、影子表等对业务系统带来的性能影响;通过实时的数据同步,构建“双活”的主备系统,解决传统基于数据库自身的主备系统中备机只读而无法对外提供写服务的问题。
DMHS 的基础实现原理如下图所示:

DMHS 的组成原理框图中包含源端数据库、目标端数据库、源端 DMHS 服务以及目标端 DMHS 服务,其中源端 DMHS 服务主要由装载模块(LOAD)、日志捕获分析模块(CPT)以及管理服务模块(MGR)组成;目标端 DMHS 服务则由执行模块(EXEC)和管理服务模块 (MGR)组成。
在源端,DMHS 的 CPT 模块采用优化的日志扫描算法实现增量日志数据的快速捕获分析,并将分析完成后的日志数据转换为内部的消息格式,然后通过网络将消息发送至目标端DMHS 服务;
在目标端, DMHS 服务接收到源端的日志消息后,对消息进行处理,通过多线程并行执行的方式将同步数据应用至目标端数据库,实现数据实时同步。

  1. 系统概述与组件
    •DMHS 是高性能、高可靠性的数据库实时同步系统。
    •系统组件包括:
    ○MGR(管理模块):启动框架,负责加载和启动其他模块。
    ○CPT(捕获模块):捕获源数据库的增量日志。
    ○LOAD(装载模块):负责数据的初始装载和离线字典管理。
    ○NET(传输模块):负责数据传输,包括发送和接收子模块。
    ○EXEC(执行模块):在目标端执行数据入库。

一、前提,已完成源端与目标端实例初始化部署

源端:192.168.159.133创建数据
Bash
切换到dmdba用户执行
su - dmdba
cd /dm8/dminstall/bin
./disql SYSDBA/Dameng123@192.168.58.20:5236

执行下面的命令创建表空间、用户
CREATE TABLESPACE TEST DATAFILE ‘TEST.DBF’ SIZE 256;
CREATE USER APP IDENTIFIED BY “Dameng123” DEFAULT TABLESPACE TEST;
grant “DBA” to “APP”;
exit

使用新建的APP用户登录数据库,创建表和插入数据
./disql APP/Dameng123@192.168.58.20:5236

CREATE TABLE STUDENTS(STUDENT_ID INTEGER PRIMARY KEY IDENTITY(1,1),NAME VARCHAR(50) NOT NULL,BIRTH_DATE DATE NOT NULL,GENDER CHAR(1) CHECK (GENDER IN (‘M’,‘F’)) NOT NULL,EMAIL VARCHAR(100) UNIQUE NOT NULL,PHONE_NUMBER VARCHAR(15));

INSERT INTO STUDENTS (NAME, BIRTH_DATE, GENDER, EMAIL, PHONE_NUMBER) VALUES (‘张三’, ‘2000-03-01’, ‘M’, ‘zhangsan@djl.com’, ‘13243253257’),(‘李四’, ‘1999-05-21’, ‘F’, ‘lisi@djl.com’, ‘13312345678’),(‘王五’, ‘2001-07-11’, ‘M’, ‘wangwu@djl.com’, ‘13423456789’),(‘赵六’, ‘1998-08-15’, ‘F’, ‘zhaoliu@djl.com’, ‘13534567890’),(‘钱七’, ‘2002-12-12’, ‘M’, ‘qianqi@djl.com’, ‘13645678901’),(‘孙八’, ‘2000-10-10’, ‘F’, ‘sunba@djl.com’, ‘13756789012’),(‘周九’, ‘1997-11-22’, ‘M’, ‘zhoujiu@djl.com’, ‘13867890123’),(‘吴十’, ‘2001-04-05’, ‘F’, ‘wushi@djl.com’, ‘13978901234’),(‘郑十一’, ‘1999-06-18’, ‘M’, ‘zhengshiyi@djl.com’, ‘14089012345’),(‘王十二’, ‘1998-09-09’, ‘F’, ‘wangshier@djl.com’, ‘14190123456’);

commit;
exit

目标端:192.168.159.130
执行下面的命令创建表空间、用户
CREATE TABLESPACE TEST DATAFILE ‘TEST.DBF’ SIZE 256;
CREATE USER APP IDENTIFIED BY “Dameng123” DEFAULT TABLESPACE TEST;
grant “DBA” to “APP”;
exit

环境模拟完成

二、源端、目的端部署DMHS工具

/dm8/dmhs_V4.3.20_dm8_rev140201_rh6_64_20230916.bin -i

图片1.png

图片2.png

三、源端需要导入DDL,否则进行增量复制的时候会报错

另外,需要通过管理工具进行sql导入,实测通过disql导入会使得RENAME无法导入。文件路径位于/dm8/dmhs/script下面
图片3.png

四、目标端配置并启动

Bash
su - dmdba
cd /dm8/dmhs
复制一份bin目录,单独配置,当同一个服务上需要部署多个dmhs,可以方便区分
cp -r bin exec01
cd exec01
如果是测试dmhs,在使用的过程中可能会缺少libdmoci.so动态库文件报错,执行下面的命令复制一份到数据库的bin目录下,如果是生产中,需要去达梦官方申请
cp -r stat/libdmoci.so /dm8/dminstall/bin

vim dmhs.hs
内容如下:
<?xml version=“1.0” encoding=“GB2312”?>
<dmhs>
<base>
<lang>en</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>
<char_code>PG_GB18030</char_code>
<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_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
</exec>
</dmhs>

启动dmhs,并启动exec模块
./dmhs_server

启动exec模块

start exec
图片4.png

五、源端配置并启动

Bash
su - dmdba
cd /dm8/dmhs
复制一份bin目录,单独配置,当同一个服务上需要部署多个dmhs,可以方便区分
cp -r bin cpt01
cd cpt01
如果是测试dmhs,在使用的过程中可能会缺少libdmoci.so动态库文件报错,执行下面的命令复制一份到数据库的bin目录下,如果是生产中,需要去达梦官方申请
cp -r stat/libdmoci.so /dm8/dminstall2/bin

vim dmhs.hs
内容如下:
<?xml version=“1.0” encoding=“GB2312”?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<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>
<trigger>1</trigger>
<constraint>1</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<filter>
<enable>
<item>APP.</item>
</enable>
</filter>
<map>
<item>APP.
==APP.*</item>
</map>
</send>
</cpt>
</dmhs>

启动dmhs,并装载数据,也就是把源端的数据同步到目的端,源APP–>>目的APP
./dmhs_server
clear exec lsn
COPY 0 “SCH.NAME=‘APP’” CREATE|INSERT|INDEX|COMMENT

执行完上面的装载操作后,去目的端的APP模式里面看看是否有源端同步过来的STUDENTS表

图片5.png

六、目标端查看同步过来的数据

Select * from APP.STUDENTS
图片6.png

七、执行增量复制

启动cpt模块
start cpt
图片7.png
源端插入一条数据后,目标端验证
INSERT INTO APP.STUDENTS (NAME, BIRTH_DATE, GENDER, EMAIL, PHONE_NUMBER) VALUES (‘帅哥’, ‘2001-11-09’, ‘M’, ‘shuaige@djl.com’, ‘13243253252’);
COMMIT;
图片8.png

八、配置服务启动

目的端配置
Plain Text
su - dmdba
cd /dm8/dmhs/exec01
cp service_template/DmhsService ./DmhsServiceexec01

修改配置
vim DmhsServiceexec01

DMHS_HOME=_REPLACE_SELF_DMHS_HOME 修改成 DMHS_HOME=/dm8/dmhs
PROG_DIR=_REPLACE_SELF_DMHS_PROG_DIR 修改成 PROG_DIR=/dm8/dmhs/exec01
CONF_PATH=_REPLACE_SELF_DMHS_CONF_PATH 修改成 CONF_PATH=/dm8/dmhs/exec01/dmhs.hs

启动dmhs
./DmhsServiceexec01 start

进入dmhs_console中启动dmhs实例的exec模块

./dmhs_console
start exec
图片9.png

源端配置
Bash
su - dmdba
cd /dm8/dmhs/cpt01
cp service_template/DmhsService ./DmhsServicecpt01

修改配置
vim DmhsServicecpt01

DMHS_HOME=_REPLACE_SELF_DMHS_HOME 修改成 DMHS_HOME=/dm8/dmhs
PROG_DIR=_REPLACE_SELF_DMHS_PROG_DIR 修改成 PROG_DIR=/dm8/dmhs/cpt01
CONF_PATH=_REPLACE_SELF_DMHS_CONF_PATH 修改成 CONF_PATH=/dm8/dmhs/cpt01/dmhs.hs

启动dmhs
./DmhsServicecpt01 start

进入dmhs_console中启动dmhs实例的cpt模块,开启增量同步
./dmhs_console
start cpt
图片10.png
源端再插入一条数据后,查看目标端
图片11.png
这个同步貌似有一些时间延迟,大概在1-2分钟

配置讲解

目的端:
Bash
<?xml version=“1.0” encoding=“GB2312”?> # 文件头,这个是XML文件的声明,用来指定文档使用的XML版本和字符编码。
<dmhs> # 根元素,表示dmhs配置文件的开始。
<base> # MGR的配置,配置同步服务的 DMHS 服务器管理模块,如同客户端通讯的监听端口、语言项、站点号等基本配置信息的元素
<lang>en</lang> # 语言选项,ch 代表 gb18030 编码简体中文,ch-utf8 代表 utf8 编码简体中文;en 代表英文,默认值 ch,说明:该参数不仅会影响 dmhs_server 的输出,同样会影响到 dmhs_console 客户端的语言输出。
<mgr_port>5345</mgr_port> # dmhs的管理端口,说明:同步服务起动以后,会监听该端口上的连接,用于执行客户端工具发过来的命令和接收统计信息。
<ckpt_interval>60</ckpt_interval> # 检查点间隔时间,说明:当同步服务中存在 EXEC 模块时,该参数表示 EXEC 模块检查点刷新的时间间隔,单位为秒,默认为60秒。
<siteid>2</siteid> # 同步节点站点号,说明:站点号是同步节点在同步链路中的唯一标识,配置时请确保它的唯一性,如果重复,那会造成链路中数据同步的混乱。
<version>2.0</version> # 配置文件的版本号,可选 1.0 或 2.0,默认值 1.0。说明:如果指定为 1.0,兼容旧版本配置格式。如果指定为 2.0,则按最新的配置格式解析。旧版本配置格式仅支持网络直连模式下源端到目标端的同步配置,如果要使用高级功能,如一对多、转发和路由等,则需要使用 2.0 的版本格式。
</base>
<exec> # 执行模块配置
<recv> # 数据来源配置,说明:路由功能的数据来源只能通过网络端口,所以该 RECV 配置项只允许指定 mgr_port 和 data_port 参数。
<data_port>5346</data_port> # 数据来自本地监听的数据端口号,说明:远端的 CPT 模块通过它自身的 NET 模块发送消息到该端口,路由服务收到消息以后再根据映射配置发到远端的 NET 模块,实现数据路由。
</recv>
<char_code>PG_GB18030</char_code> # 连接数据库的客户端字符集,说明:该参数在目标库为 MYSQL 时起作用,表明 CPT 解析出来的日志数据字符集编码。目标库为 Kafka 时,表示当前客户端数据的字符集编码,用于大字段数据的转码,默认为 GB18030。
<db_type>dm8</db_type> # 数据入库的数据库类型,说明:该参数指明了 EXEC 模块关联的数据库类型。
<db_server>192.168.58.21</db_server> # 数据库的服务名,说明:该参数会被填入 ODBC 连接串,用来跟数据库建立连接。ORACLE 数据库要填服务名、SQL SERVER 需要填机器名、DM 则需要填服务名或 IP、ORACLE 需要监听地址端口实例名“<HOST>: <PORT>/<SID_NAME>”。
<db_user>APP</db_user> # 登录数据库的用户名,说明:该参数会被填入 ODBC 连接串,用来跟数据库建立连接。DM6 同步时目标端必须使用 SYSDBA 登录。
<db_pwd>Dameng123</db_pwd> # 登录数据库的用户口令,说明:该参数跟 db_user 对应,如果配置了 pwd_encipher 参数,则需要填写加密后的口令。
<db_port>5236</db_port> # 登录数据库的端口号,说明:如果数据库是以默认端口号启动的,则不用配置该参数,否则请配置相应的端口号。
<exec_thr>4</exec_thr> # EXEC 模块用来数据入库的工作线程数,说明:数据入库是由工作线程来完成的,每个工作线程对应一个事务,单个工作线程时,事务按提交顺序先后入库,如果配置了多个工作线程,那么需要按照提交策略来决定事务之间如何并行入库。
<exec_sql>1024</exec_sql> # EXEC 模块缓存事务 SQL 语句的内存大小,说明:EXEC 模块从 NET 接收模块中获取到 CPT 模块发送过来的消息以后,按事务ID 对这些消息进行归类,缓存到本机内存中。如果是提交的事务,则交给工作线程进行入库处理,而没有提交的事务则一直会在内存中缓存。当缓存的内存总数达到该参数的设定值时,EXEC 模块会对没有提交的事务存盘,以便释放内存空间来接收新的消息。存盘操作就涉及到大量的 IO,从而影响同步的性能,所以需要合理的配置该参数,以适应当前的同步环境。
<exec_trx> 5000 </exec_trx> # 允许缓存事务的个数,说明:EXEC 模块缓存事务个数的最大限制,当超过这个限制值时将不再接收消息,需要等现有的事务入库完毕后,事务个数降到限定值以下时才会重新开始接收。当停止消息接收时,整个同步链路会处在阻塞状态,通过查看统计信息可以获取到这一状态。
<exec_rows>1000</exec_rows> # 数据入库时允许的最大批量行数,说明:工作线程在对事务进行入库时,采取的是参数批量绑定的方式,这个参数指定了批量的最大行数,该参数对性能会有一定影响。取值小时,可以减少 EXEC 模块对内存的占用,但是会降低入库性能;取值大时虽然有助于提升入库性能,但是会加剧 EXEC 模块对内存的消耗。
</exec>
</dmhs>
源端:
Bash
<?xml version=“1.0” encoding=“GB2312”?> # 文件头,这个是XML文件的声明,用来指定文档使用的XML版本和字符编码。
<dmhs> # 根元素,表示dmhs配置文件的开始。
<base> # MGR的配置,配置同步服务的 DMHS 服务器管理模块,如同客户端通讯的监听端口、语言项、站点号等基本配置信息的元素
<lang>en</lang> # 语言选项,ch 代表 gb18030 编码简体中文,ch-utf8 代表 utf8 编码简体中文;en 代表英文,默认值 ch,说明:该参数不仅会影响 dmhs_server 的输出,同样会影响到 dmhs_console 客户端的语言输出。
<mgr_port>5345</mgr_port> # dmhs的管理端口,说明:同步服务起动以后,会监听该端口上的连接,用于执行客户端工具发过来的命令和接收统计信息。
<ckpt_interval>60</ckpt_interval> # 检查点间隔时间,说明:当同步服务中存在 EXEC 模块时,该参数表示 EXEC 模块检查点刷新的时间间隔,单位为秒,默认为60秒。
<siteid>1</siteid> # 同步节点站点号,说明:站点号是同步节点在同步链路中的唯一标识,配置时请确保它的唯一性,如果重复,那会造成链路中数据同步的混乱。
<version>2.0</version> # 配置文件的版本号,可选 1.0 或 2.0,默认值 1.0。说明:如果指定为 1.0,兼容旧版本配置格式。如果指定为 2.0,则按最新的配置格式解析。旧版本配置格式仅支持网络直连模式下源端到目标端的同步配置,如果要使用高级功能,如一对多、转发和路由等,则需要使用 2.0 的版本格式。
</base>
<cpt> # 日志分析模块配置
<db_type>dm8</db_type> # 捕获源端的数据库类型,说明:目前源端支持的数据库有 DM6、DM7、ORACLE9i 以上版本、MYSQL、POSTGRES、DB2、SQLSERVER、ORACLE RAC、DM7 MPP。
<db_server>192.168.58.20</db_server> # 源端数据库的服务名,如果数据库不支持服务名,也可以填写 IP,说明:通常源为 ORACLE 数据库时,需要配置服务名,其它类型的数据库可以配置实际的 IP。当 DM6 或 DM7 作为源时,如果数据库的启动端口不是默认端口,可以使用服务名的方式进行配置。
<db_user>APP</db_user> # 连接源端数据库的登录名或用户名,说明:当源是 DM6 或 SQLSERVER 时,该参数需要配置为相应的登录名,其它类型数据库请配置用户名。由于 CPT 分析时需要查询系统表或系统提供的动态视图,请确保配 置的登录或用户拥有相关的权限。当搭建同步工具的主备时(比如 DM7 主备或是ORACLE RAC 主备),该用户还需要对 DMHS_DICT 表拥有 CREATE、INSERT、DELETE 和 UPDATE 权限, ORACLE 需要对连接用户表空间的配额权限。
<db_pwd>Dameng123</db_pwd> #源端数据库登录口令,说明:db_user 参数对应的口令,默认为明文,如需配置密文,请配合 pwd_encipher 参数。
<db_port>5236</db_port> # 源端数据库的监听端口号,说明:如果配置为 0,则忽略该参数,使用默认的端口号登录。DM6 和 DM7 也可以在服务名中指定端口号,不用在此配置。
<parse_thr>1</parse_thr> # 日志分析线程数,说明:该参数仅对源端数据为 DM7、DM8 和 Oracle 时有效。CPT 允许使用多线程对日志进行解析,从而提升日志解析的速度。
<ddl_mask>op:obj</ddl_mask> # DDL 操作功能掩码,说明:如果需要同步 DDL 操作,那么就需要配置该掩码,该掩码默认值为TABLE:OP。该配置项以掩码自由组合的方式进行配置,以:号作为分隔符。
<arch> # 归档信息配置,该标签是一个功能标签,需要配置它的子项,说明:该标签用来指定 CPT 如何处理归档日志。
<clear_interval>600</clear_interval> # 归档日志清理间隔,说明:每次清理归档的时间间隔,如果归档不需要清理,可以把该值设置大些。
<clear_flag>0</clear_flag> # 单节点同步时,dmhs4.0 中间层数据库的清理标志,说明:配置为 0 时,不清理数据;为 1 时,清理缓存库的数据。如同步配置为多节点时,log_db 下 clear_flag 应配置为 0,不清理;同时 arch 标签下的 clear_flag 设置为默认值0,不清理;由 dmhs_log_db_clear 工具综合各个节点的最小 LSN 来清理(hs4)缓存库。
</arch>
<send> # CPT 投递信息配置,该标签是一个功能标签,需要配置它的子项,说明:CPT 分析出的日志需要投递到下一级,投递时需要对数据进行过滤,对象进行映射,以及一些属性约束,需要在它的子项里进行设置,该功能的实现依赖于 NET 模块。
<ip>192.168.58.21</ip> # 投递到下一级的 ip 地址。说明:DMHS 下一级数据接收的备用 IP 地址,下一级可以为远程机器,也可以是本地机器。
<mgr_port>5345</mgr_port> # 下一级的管理端口
<data_port>5346</data_port> # 下一级的 NET 模块监听端口
<trigger>1</trigger> # 是否忽略触发器,默认为 0,限定值 0,1
<constraint>1</constraint> # 是否忽略约束,默认为 0,限定值 0,1
<identity>1</identity> # 指示下一级数据入库时,自增列处理方式,0(启用)或 1(忽略),默认值为0。
<net_turns>0</net_turns> # 是否启用网闸模式,0(禁用)或 1(启用)。
<filter> # 归档过滤条件,NET 模块对投递消息的过滤配置,该标签是一个功能标签,需要配置它的子项,说明:NET 模块可以针对待投递的消息进行一系列的筛选过滤。该功能标签包含 enable 和 disable 子标签,分别对应白名单和黑名单。
<enable> # 白名单,说明:过滤规则白名单设置,只有符合该标签中某个条件的,数据才允许被投递。
<item>APP.</item> # NET 模块过滤规则白名单设置项,支持模糊匹配符“”和“%”,其中通配符 “”用在最后进行模糊匹配;“%”通配符用在表名之前或之间,每项仅支持一个模糊匹配符的使用。对于模式名或者对象名本身包含特殊的“.”点字符,在配置过滤时,需要将对象名称使用双引号括起来,以支持正确的对象名称解析。说明:白名单设置项,它的格式为:模式名.对象名,每项支持且仅支持一个模糊匹配符。
</enable>
</filter>
<map> # NET 模块对投递对象名进行映射,该标签是一个功能标签,需要配置它的子项,说明:NET 模块在把对象消息投递到下一级时,允许对消息中的模式名和表名进行映射,比如把 A 模式映射成 B 模式,A 表映射到 B 表等,这些条件设置是在这里设置,但真正的映射操作则是由 EXEC 模块完成。映射配置这些配置以后,NET 模块会把这些配置发送给 EXEC 模块,由它来完成映射操作。除了模式名和表名的映射,NET 模块还支持列名映射,列名映跟表名映射不同,它是在 NET 模块自身完成的,具体配置方式请参考相关章节。如果同步不需要映射,那么不用配置该项参数
<item>APP.
APP.</item> # NET 模块对象名进行映射项,支持模糊匹配符。说明:NET 模块基本的模式名和表名映射配置格式为:模式名.表名模式名.表名,左边是 CPT 分析出的表名,右边则是 EXEC 模块入库时需要映射成的表名。例如 SYSDBA.==TEST.,源库 SYSDBA 模式下的表都映射到了目标 TEST 模式下。
</map>
</send>
</cpt>
</dmhs>

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服