最近在测试环境搭了一套 DM8 到 DM8 的单向 DMHS。搭建过程中碰到了几个问题,包括 COPY 时加密模块加载失败、dmhs_server 启动段错误,以及执行 start exec 后没有正常响应。
把整个过程重新整理后,DMHS 的搭建主线其实比较清楚:先准备源库日志环境和两端网络,再安装 DMHS、配置源端 CPT 和目标端 EXEC;服务启动后先完成历史数据装载,再启动 CPT 接增量日志,最后通过 INSERT、UPDATE、DELETE 验证整条链路。
文中的 IP、端口、用户名和安装目录,实际使用时换成自己的环境。
正式部署之前,可以先把整个搭建过程过一遍。后面每一个命令基本都能在这条流程里找到对应的位置。
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 之后继续产生的数据变化。
DMHS 的数据同步分成初始装载和增量同步两部分。
源数据库原来已经存在的数据由 LOAD 负责装载,通过控制台的 COPY 命令触发;后续数据库产生的变化由 CPT 从日志中捕获,再通过 NET 发送到目标端,最后由 EXEC 写入目标数据库。
几个模块各自负责的事情如下。
| 模块 | 作用 |
|---|---|
| MGR | 管理当前 DMHS 服务中的各模块 |
| LOAD | 读取并装载历史数据 |
| CPT | 读取、解析源数据库日志 |
| NET | 在源端和目标端之间传递同步消息 |
| EXEC | 在目标数据库执行同步事务 |
| COPY | 控制台中的数据装载命令 |
COPY 和 LOAD 不是一个东西。COPY 是控制台执行的命令,实际的数据装载工作由 LOAD 完成。
假设源库已经有 100 万行数据,目标库是空库。直接启动 CPT 后,目标端只能接收到之后产生的新日志,前面的 100 万行不会自动补过来。因此搭建时先完成历史数据装载,再启动 CPT 接后面的增量。
先记录两台服务器的基本信息。
| 项目 | 源端 | 目标端 |
|---|---|---|
| 主机地址 | 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
开启归档和逻辑日志
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
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;
如果出现以上的查询结果,表示归档配置、逻辑日志参数、在线日志正常。
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';
存在以下的查询结果,表明触发器和辅助表创建有效。
源端和目标端安装与操作系统、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}"
dependencies、external_crypto_libs 这些目录要看实际安装环境。
在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>
在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>
配置 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
1)开启目的端dmhs服务
[root@localhost bin]#./dmhs_serverd start
[root@localhost bin]#./dmhs_console
DMHS >connect
DMHS >start exec
2)开启源端的dmhs服务:
[root@localhost bin]#./dmhs_serverd start
装载一般有两种选择,一是备份还原,二是从配置好时开始同步。在初次搭建过程中,需要将源端数据加载到目的端,有多种操作方法:
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
初始装载完成后,则可以开启同步:
源端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 日志判断是没有捕获、没有发送,还是目标端执行失败。
-70089这次执行 COPY 时,日志先出现:
加密模块加载失败
-70089
开始检查当前终端:
echo "$LD_LIBRARY_PATH"
路径已经包含 DM8 相关目录,但错误没有变化。
后来发现服务进程实际使用的运行库路径里缺少 DM8 加密相关目录。
把实际需要的 DM8 运行库目录补进去,重新启动 DMHS解决。
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 和动态库,可以先修动态库、重启并验证;没有解决再继续改配置。几项一起改完以后,即使服务恢复了,也很难确定真正原因。
文章
阅读量
获赞
