注册
DMHS 安装与初始同步(DM8 到 DM8 单向)
专栏/技术分享/ 文章详情 /

DMHS 安装与初始同步(DM8 到 DM8 单向)

科技不收敛 2026/09/11 27 0 0
摘要

DM8 到 DM8 单向 DMHS 安装与初始同步

最近在测试环境搭了一套 DM8 到 DM8 的单向 DMHS。搭建过程中碰到了几个问题,包括 COPY 时加密模块加载失败、dmhs_server 启动段错误,以及执行 start exec 后没有正常响应。

把整个过程重新整理后,DMHS 的搭建主线其实比较清楚:先准备源库日志环境和两端网络,再安装 DMHS、配置源端 CPT 和目标端 EXEC;服务启动后先完成历史数据装载,再启动 CPT 接增量日志,最后通过 INSERT、UPDATE、DELETE 验证整条链路。

文中的 IP、端口、用户名和安装目录,实际使用时换成自己的环境。


目录

  1. 搭建前先看完整流程
  2. DMHS 架构和数据流
  3. 环境规划和数据库准备
  4. 安装 DMHS 和准备运行环境
  5. 开启DMHS服务
  6. 装载初始数据
  7. 开始同步和验证
  8. 安装中遇到的几个问题
  9. 参考资料

1. 搭建前先看完整流程

正式部署之前,可以先把整个搭建过程过一遍。后面每一个命令基本都能在这条流程里找到对应的位置。

                  DM8 → DM8 单向 DMHS

┌──────────────────────────────┐
│ 1. 准备源端和目标端 DM8      │
│                              │
│ 确认数据库正常运行           │
│ 确认 DM8 / DMHS 版本         │
│ 确认操作系统和 CPU 架构      │
└──────────────┬───────────────┘
               │
               ▼
┌──────────────────────────────┐
│ 2. 准备源端数据库日志环境        │
│                              │
│ 开启归档                      │
│ 配置 RLOG_APPEND_LOGIC                            │
│ 准备同步数据库账号              │
└──────────────┬───────────────┘
               │
               ▼
┌──────────────────────────────┐
│ 3. 两端安装 DMHS             │
│                              │
│ 检查安装目录                 │
│ 检查运行用户权限             │
│ 检查动态库                   │
│ 配置运行库路径               │
└──────────────┬───────────────┘
               │
               ├──────────────────────────┐
               ▼                          ▼
┌──────────────────────┐       ┌──────────────────────┐
│ 4. 配置源端 CPT       │        │ 5. 配置目标端 EXEC      │
│                      │       │                      │
│ 连接源端 DM8          │        │ 连接目标端 DM8          │
│ 配置 dmhs.hs         │        │ 配置 dmhs.hs.          │
└──────────┬───────────┘       └──────────┬───────────┘
           │                              │
           └──────────────┬───────────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 6. 启动目标端 DMHS     │
             │                        │
             │ dmhs_server            │
             │ start exec             │
             └────────────┬───────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 7. 启动源端 DMHS       │
             │                        │
             │ dmhs_server            │
             │ CPT 暂时保持停止       │
             └────────────┬───────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 8. 初始化并装载数据       │
             │                        │
             │ COPY CREATE / INSERT   │
             └────────────┬───────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 9. 核对初始数据         │
             │                        │
             │ 表结构                  │
             │ 行数                    │
             │ 关键字段                │
             └────────────┬───────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 10. 启动 CPT            │
             │                        │
             │ start cpt              │
             └────────────┬───────────┘
                          │
                          ▼
             ┌────────────────────────┐
             │ 11. 验证增量同步         │
             │                        │
             │ INSERT                 │
             │ UPDATE                 │
             │ DELETE                 │
             └────────────────────────┘

部署过程可以分成三个阶段。

第一阶段是准备环境。 部署源端目标端数据库,及做相应配置。

第二阶段是部署dmhs。 配置参数文件,测试启动服务和连接。

第三阶段是数据衔接。 COPY 负责已有数据,CPT 负责 COPY 之后继续产生的数据变化。


2. DMHS 架构和数据流

DMHS 的数据同步分成初始装载和增量同步两部分。

源数据库原来已经存在的数据由 LOAD 负责装载,通过控制台的 COPY 命令触发;后续数据库产生的变化由 CPT 从日志中捕获,再通过 NET 发送到目标端,最后由 EXEC 写入目标数据库。

Pasted image 20260905210224.png

几个模块各自负责的事情如下。

模块 作用
MGR 管理当前 DMHS 服务中的各模块
LOAD 读取并装载历史数据
CPT 读取、解析源数据库日志
NET 在源端和目标端之间传递同步消息
EXEC 在目标数据库执行同步事务
COPY 控制台中的数据装载命令

COPY 和 LOAD 不是一个东西。COPY 是控制台执行的命令,实际的数据装载工作由 LOAD 完成。

假设源库已经有 100 万行数据,目标库是空库。直接启动 CPT 后,目标端只能接收到之后产生的新日志,前面的 100 万行不会自动补过来。因此搭建时先完成历史数据装载,再启动 CPT 接后面的增量。


3. 环境规划和数据库准备

先记录两台服务器的基本信息。

项目 源端 目标端
主机地址 192.168.252.70 192.168.252.71
操作系统 centos7 centos7
CPU 架构 x86_64 x86_64
DMHS 版本 dmhsV4.3.38_ dmhs_V4.3.38
DM8 端口 5236 5236
DM8 安装目录 /home/dmdba/dm/dmdbms/ /home/dmdba/dm/dmdbms/
DMHS 安装目录 /home/dmdba/dm/dmhs/ /home/dmdba/dm/dmhs/

先在源端和目标端安装好数据库,
数据库安装参考以下链接:
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html
使用 mac 本地测试的也可以参考:
https://eco.dameng.com/community/post/20260827145854VARZDZQC151DHVCH5V
安装好后可以使用下面的命令确认两边数据库服务正常,可以正常登录:

ps -ef | grep '[d]mserver' cd /home/dmdba/dm/dmdbms/bin ./disql SYSDBA/passwd

Pasted image 20260906120646.png

3.1 源库配置

开启归档和逻辑日志

1)设置归档标记和逻辑日志标记。打开DM服务器配置文件“dm.ini”,设置如下值:

cd /home/dmdba/dm/dmdbms/bin
vim dm.ini 

## 修改如下值
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1

2)添加归档配置文件。在数据库实例目录下创建文件“dmarch.ini“

## bash单机测试环境的 `dmarch.ini` 可以类似这样:

 vi  /dbdata/dmdata/DAMENG/dmarch.ini   
 
[ARCHIVE_LOCAL1]
ARCH_TYPE     =  LOCAL
ARCH_DEST     =  /dbarch/dmarch
ARCH_FILE_SIZE  = 2048  #单个归档文件大小
ARCH_SPACE_LIMIT = 0 #归档存储上限,0 表示不限制

3)重启DM数据库,使配置参数生效

cd /home/dmdba/dm/dmdbms/bin
./dmserverd restart

Pasted image 20260906120828.png

4)验证配置的正确性

--检查归档配置的正确性,请执行以下SQL命令: SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL' AND ARCH_IS_VALID='Y'; --检查逻辑日志配置的正确性,通过下面的查询: SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC'; -- 检查在线日志,通过如下的查询: SELECT PATH FROM SYS.V$RLOGFILE;

Pasted image 20260906120934.png
如果出现以上的查询结果,表示归档配置、逻辑日志参数、在线日志正常。
5)配置DDL
如果要求DDL同步,那么需要创建DDL触发器和辅助表。创建的脚本参见DMHS安装目录下scripts子目录中“ddl_sql_dm8.sql”或“ddl_sql_dm7.sql”。注意创建时需要使用SYSDBA用户。
检查创建的触发器和辅助表是否有效,检查辅助表的语句:

--创建ddl触发器和辅助表语句执行 SQL>set define off; --set char_code gbk; SQL>start /home/dmdba/dm/ddl_sql_dm8.sql -- 检查辅助表的语句 SQL>select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMHS%' and status = 'VALID'; -- 检查触发器的语句 SQL>select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y';

存在以下的查询结果,表明触发器和辅助表创建有效。
Pasted image 20260906125925.png


4. 安装 DMHS 和准备运行环境

源端和目标端安装与操作系统、CPU 架构和 DM8 相匹配的 DMHS。
1.将DMHS软件安装到对应目录下。一般目录命名为/home/dmdba/dm/dmhs。
2.拷贝DM数据库bin目录下对应的.so文件到DMHS下的bin目录下。
3.拷贝完成后检查.so文件权限正确性。

具体的安装步骤如下所示:DMHS安装在/home/dmdba/dm/dmhs目录下,DMHS软件可通过命令行以及图形化的方式进行安装部署,使用命令行的方式安装在安装命令后加“-i”即可,如下所示:

[root@localhost opt]# [root@localhost opt]# ./dmhs_V4.3.14_dm8_xxx.bin -i Extract install files.......... 1.英文(English) 2.简体中文(简体中文) 请选择安装语言[2.简体中文(简体中文)]:2 /tmp/DMHSInstall/install.log 1.免费试用达梦数据实时同步 2.使用已申请的Key文件 验证许可证文件[1.免费试用达梦数据实时同步]:1 1.精简版 2.完整版(web客户端) 3.自定义 安装类型[1.精简版]:1 1.实时同步软件服务器 2.远程部署工具 3.实时同步软件配置助手 4.手册 所需磁盘空间:566 MB 安装目录: [/opt/dmhs]/home/dmdba/dm/dmhs 该路径不为空,是否继续安装?[Y or N]y 安装路径可能存在覆盖安装 1.统一部署 2.现在初始化 是否初始化达梦数据实时同步系统[1.统一部署]:1 正在安装 default start ... default finished. server start ... server finished. hs_agent start ... hs_agent finished. hsca start ... hsca finished. doc start ... doc finished. postinstall start ... postinstall finished. 正在创建快捷方式 安装成功 远程部署工具配置 远程部署工具名称[HsAgent]:HsAgent 主机Ip(外网)[192.168.252.70](192.168.252.70):192.168.252.70 远程部署工具管理端口[5456](1000-65535):5456 内置数据库轮询间隔[3](1-60):3 内置数据库IP[]:192.168.252.70 内置数据库端口[15236](1000-65535):15236 内置数据库用户名[SYSDBA]:SYSDBA 内置数据库密码[*****]:***** 服务脚本环境变量设置 依赖库路径 提示:此配置项供用户配置源或目的数据库依赖库路径和odbc依赖库路径, 多个路径以":"隔开(例:/home/dmdba/dmdbms/bin:/usr/local/lib),此配置项会添加到服务脚本的NEED_LIB_PATH的变量值中。 请配置依赖库路径:/home/dmdba/dmdbms/bin 远程控制服务 1.自动 2.手动 启动方式:[2.手动]2 正在创建远程控制服务 达梦数据实时同步V4.0安装完成 更多安装信息,请查看安装日志文件: /dmhs/log/install.log ## 复制dmdbms下的so到dmhs [root@localhost opt]# cp /home/dmdba/dm/dmdbms/bin/*.so /home/dmdba/dm/dmhs/bin

安装完成后检查:

ls -l /home/dmdba/dm/dmhs/bin

常用文件包括:

dmhs_server
dmhs_console
dmhs.hs
libcpt_dm8.so
libdmhs_exec.so

运行用户需要能够访问 DMHS 安装目录、日志目录和配置文件。

安装完成后可以直接检查模块的动态库依赖。

源端:

ldd -r /home/dmdba/dm/dmhs/bin/libcpt_dm8.so

目标端:

ldd -r /home/dmdba/dm/dmhs/bin/libdmhs_exec.so ## 主要看是否有not found

如果 DM8 的运行库没有找到,再检查:

echo "$LD_LIBRARY_PATH"

例如:

export LD_LIBRARY_PATH="$DMHS_HOME/bin:$DM_HOME/bin:$DM_HOME/bin/dependencies:$DM_HOME/bin/external_crypto_libs:${LD_LIBRARY_PATH}"

dependenciesexternal_crypto_libs 这些目录要看实际安装环境。

4.1 配置源端DMHS配置文件

在dmhs安装目录下的bin目录中编辑dmhs.hs文件。

vi /home/dmdba/dm/dmhs/bin/dmhs.hs

添加下面内容

<?xml version="1.0" encoding="utf-8"?> <dmhs> <base> <lang>ch-utf8</lang> <mgr_port>5345</mgr_port> <chk_interval>3</chk_interval> <ckpt_interval>60</ckpt_interval> <siteid>1</siteid> </base> <cpt> <db_type>dm8</db_type> <db_server>127.0.0.1</db_server> <db_user>SYSDBA</db_user> <db_pwd>passwd</db_pwd> <db_port>5236</db_port> <idle_time>10</idle_time> <ddl_mask>TABLE:VIEW:PROCEDURE:FUNCTION:TRIGGER:INDEX:CHECK:SEQUENCE:PACKAGE:TYPE:SYNONYM:OP</ddl_mask> <parse_thr>1</parse_thr> <arch> <clear_interval>600</clear_interval> <clear_flag>0</clear_flag> </arch> <send> <ip>192.168.252.71</ip> <mgr_port>5345</mgr_port> <data_port>5346</data_port> <level>0</level> <trigger>1</trigger> <constraint>1</constraint> <identity>1</identity> <net_turns>0</net_turns> <filter> <enable> <item>*.*</item> </enable> <disable></disable> </filter> <map> <item/> </map> </send> </cpt> </dmhs>

4.2 配置目的端DMHS配置文件

在dmhs安装目录下的bin目录中编辑dmhs.hs文件。

vi /home/dmdba/dm/dmhs/bin/dmhs.hs

配置参考如下:具体密码、IP等按实际修改。

<?xml version="1.0" encoding="GB2312"?> <dmhs> <base> <lang>ch</lang> <mgr_port>5345</mgr_port> <chk_interval>2</chk_interval> <ckpt_interval>45</ckpt_interval> <siteid>2</siteid> </base> <recv> <data_port>5346</data_port> <exec> <check_index>0</check_index> <db_type>dm8</db_type> <db_server>127.0.0.1</db_server> <db_user>SYSDBA</db_user> <db_pwd>passwd</db_pwd> <db_port>5236</db_port> <db_name></db_name> <exec_mode>1</exec_mode> <exec_thr>16</exec_thr> <exec_sql>512</exec_sql> <exec_trx>5000</exec_trx> <exec_rows>250</exec_rows> <exec_policy>2</exec_policy> <msg_col_size>8000</msg_col_size> <level>0</level> <affect_row>0</affect_row> </exec> </recv> </dmhs>

4.3 配置服务脚本

配置 dmhs_serverd 服务脚本:(两边)

[root@oppen bin]# cd /home/dmdba/dm/dmhs/bin [root@oppen bin]# cp ./service_template/DmhsService ./dmhs_serverd [root@oppen bin]# vim ./dmhs_serverd ## 修改以下内容 #REPLACE DMHS_HOME path DMHS_HOME=/home/dmdba/dm/dmhs #REPLACE program dir PROG_DIR=/home/dmdba/dm/dmhs/bin #REPLACE program config path CONF_PATH=/home/dmdba/dm/dmhs/bin/dmhs.hs #REPLACE need library path, LD_LIBRARY_PATH/LIBPATH NEED_LIB_PATH=/home/dmdba/dm/dmdbms/bin:/home/dmdba/dm/dmhs/bin:/home/dmdba/dm/dmdbms/bin/dependencies:/home/dmdba/dm/dmdbms/bin/external_crypto_libs

5. 开启DMHS服务

1)开启目的端dmhs服务

[root@localhost bin]#./dmhs_serverd start [root@localhost bin]#./dmhs_console DMHS >connect DMHS >start exec

Pasted image 20260906214648.png

2)开启源端的dmhs服务:

[root@localhost bin]#./dmhs_serverd start

6. 装载初始数据

装载一般有两种选择,一是备份还原,二是从配置好时开始同步。在初次搭建过程中,需要将源端数据加载到目的端,有多种操作方法:

1)如果需要保证目的端数据和源端数据完全一致,搭建时选择将源数据库停止对应用程序访问,并对源数据库进行物理备份,并在目的端数据库进行还原。还原操作需要放到启动dmhs_server之前。

此种情况下,源端装载,执行命令:

[root@localhost bin]# ./dmhs_console CSL[INFO]: DMHS控制台工具: V3.0.2.01-Build(2015.10.09) DMHS >connect CSL[UNKNOW]: 执行成功 DMHS >COPY 0 "SCH.NAME IS NOT NULL" DICT|LSN

这种装载方法,只会进行字典信息及LSN值的装载,启动同步后会从COPY时刻记录的LSN值开始进行数据同步。
2)另外针对一些特殊情况(例如源端磁盘紧张,且两端数据需要完全相同,无法备份的情况),在以上方法均不能适用时可采取直接copy的方法。

[root@localhost bin]# ./dmhs_console CSL[INFO]: DMHS控制台工具: V3.0.2.01-Build(2015.10.09) DMHS >connect CSL[UNKNOW]: 执行成功 DMHS >COPY 0 "SCH.NAME IS NOT NULL " DROP|CREATE|INSERT|INDEX|DICT |THREAD|8

Pasted image 20260906215214.png


7. 开始同步和验证

初始装载完成后,则可以开启同步:
源端DMHS:

[root@localhost bin] ./dmhs_console DMHS >start cpt

CPT 启动以后开始持续解析源数据库日志,把新的事务送到目标端 EXEC。

准备一张测试表,例如:

CREATE TABLE DMHS_TEST ( ID INT PRIMARY KEY, NOTE VARCHAR(100) );

先做 INSERT:

INSERT INTO DMHS_TEST VALUES (10001, 'dmhs-insert-test'); COMMIT;

目标端查询:

SELECT * FROM DMHS_TEST WHERE ID = 10001;

能看到:

10001    dmhs-insert-test

再修改:

UPDATE DMHS_TEST SET NOTE = 'dmhs-update-test' WHERE ID = 10001; COMMIT;

最后删除:

DELETE FROM DMHS_TEST WHERE ID = 10001; COMMIT;

目标端:

SELECT * FROM DMHS_TEST WHERE ID = 10001;

结果应为空。
测试时顺便记录两端时间。如果源端已经提交很久,目标端仍没有变化,再结合 CPT 和 EXEC 日志判断是没有捕获、没有发送,还是目标端执行失败。


8. 安装中遇到的几个问题

1)COPY 报 -70089

这次执行 COPY 时,日志先出现:

加密模块加载失败
-70089

开始检查当前终端:

echo "$LD_LIBRARY_PATH"

路径已经包含 DM8 相关目录,但错误没有变化。

后来发现服务进程实际使用的运行库路径里缺少 DM8 加密相关目录。
把实际需要的 DM8 运行库目录补进去,重新启动 DMHS解决。

2) dmhs_server 启动段错误

另一次执行:

./dmhs_server

直接出现:

Segmentation fault

内核日志中也能看到:

dmesg -T | grep -iE 'segfault|dmhs'

先执行:

ldd -r

没有发现明显缺库。

继续回查服务实际加载的 dmhs.hs,发现配置内容存在问题。修正以后,dmhs_server 可以正常启动。
调试期间改 dmhs.hs 前先保留一份:

cp dmhs.hs dmhs.hs.bak_$(date +%Y%m%d_%H%M%S)

服务脚本也一样。

排错时一次尽量只改一个方向。

如果同时怀疑 XML 和动态库,可以先修动态库、重启并验证;没有解决再继续改配置。几项一起改完以后,即使服务恢复了,也很难确定真正原因。


9. 参考资料

  1. 达梦技术社区:DMHS 概述与模块说明
    https://eco.dameng.com/community/training/41ea4631bc8ff2d97fb2916e4d3a65fb
  2. 达梦技术文档:DMHS 常见问题
    https://eco.dameng.com/document/dm/zh-cn/faq/FAQ_DMHS_NEW
  3. 达梦技术社区:DM8 到 DM8 的 DMHS 部署案例
    https://eco.dameng.com/community/post/20221221162103LX655O1WTFKL93HLZ5
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服