1 DMHS简介
达梦自主可控柔性替代方案关键在于达梦实时同步工具(DMHS)。DMHS是一个支持异构环境的高性能、高可靠和高可扩展的数据库实时同步系统。可以在不同的关系数据库之间,完成近乎实时的数据同步功能,保证目的端数据库与源端数据库的数据一致。主要有两种功能:数据装载(copy)和数据实时同步。copy功能可以做类似DTS工具的事情,可以迁移表结构、外键约束、check约束、索引。在部署DMHS时,如果源端数据库一直运行,则需要用DMHS进行初始数据迁移。至于表结构迁移可以使用 DMHS、DTS或者直接使用脚本在目的库创建。
2 环境说明
配置环境说明:
类型 | IP地址 | DM版本 | DMHS版本 |
---|---|---|---|
源端 | 192.168.1.201 | isql V6.0.2.80-Build(2019.10.25) | V3.1.2-Build(2018.08.27-79390trunc)_64 |
目的端 | 192.168.1.202 | isql V6.0.2.80-Build(2019.10.25) | V3.1.2-Build(2018.08.27-79390trunc)_64 |
端口规划:
类型 | 管理端口(mgr_port) | 数据库端口(db_port) | 目的端数据接收端口(data_port) |
---|---|---|---|
源端 | 5345 | 12345 | 5346 |
目的端 | 5345 | 12345 | 5346 |
2.1 源端数据库的配置
1)开启逻辑附加日志
修改DM6中“dm.ini”中的ENABLE_LOGICAL_DML_LOG参数的值设置为1。
2)开始归档日志
![](https://i-blog.csdnimg.cn/blog_migrate/fbf92138d2c9419973fa68ecc7b83c74.png)
2.2 DMHS安装
3)安装目录为/dmdb/dmhs,DMHS源端和目的端都需要进行安装dmhs软件。
[root@Kylin1 ]# mkdir -p /dmdb/dmhs
[root@Kylin1 ]# chmod -R 775 /dmdb/dmhs
[root@Kylin1 ]# 上传dmhs安装包dm6_kyling_dmhs0827.tar至/dmdb目录下,解压缩后利用执行码进行安装:
[root@Kylin1 ]# cd /dmdb
[root@Kylin1 dmdb]# tar –xvf dm6_kyling_dmhs0827.tar
![](https://i-blog.csdnimg.cn/blog_migrate/2ed8bdbc5e913c3bcf027efddd74e110.jpeg)
4)修改启动HS后台脚本:
[root@Kylin1 ]# cd /dmdb/dmhs/bin
[root@Kylin1 bin]# vim dmhs_serverd
[root@Kylin1 bin]# cp /dmdb/dmhs/bin/dmhs_serverd /etc/rc.d/init.d
![](https://i-blog.csdnimg.cn/blog_migrate/d8db4540e9536d628072f6f12d111333.jpeg)
3 配置同步文件
3.1 DDL同步配置(源端执行)
[root@Kylin1 ]# cd /dmdb/dmhs/scripts/
**使用SYSDBA用户执行ddl_sql_dm6_v2.sql(建议使用manager客户端执行脚本),建立DDL同步的触发器和辅助表。**
**注意:有2处需要手动修改成对应数据库名,无论有多少库就要执行多少次。**
![](https://i-blog.csdnimg.cn/blog_migrate/eba92eef406af4cf1742e4ee2f91ce19.jpeg)
3.2 DM6源端DMHS配置文件
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<siteid>1</siteid>
<mgr_port>5345</mgr_port>
<chk_interval>3</chk_interval>
<lang>ch</lang>
</base>
<cpt>
<db_type>dm6</db_type><!-- 数据库类型,默认为dm7,限定值Oracle10g,Oracle11g,dm6,dm7 -->
<db_server>127.0.0.1</db_server><!-- 数据库服务名或IP,默认为127.0.0.1 -->
<db_user>SYSDBA</db_user><!-- 数据库用户名,默认为SYSDBA -->
<db_pwd>SYSDBA</db_pwd><!-- 数据库口令,默认为SYSDBA -->
<db_port>12345</db_port><!-- 数据库端口号,默认为12345 -->
<db_name>SYSTEM</db_name><!-- 数据库名称 -->
<idle_time>300</idle_time><!-- 分析线程空闲睡眠时间,默认值为300ms,最小值0ms,最大值65536ms -->
<ddl_mask>TABLE:INDEX:TRUNCATE:CREATE:DROP:ALTER</ddl_mask><!-- 分析端DDL同步支持的对象和操作,可选项参见手册4.2.1 CPT,需要将安装脚本中对应的DDL脚本在源端执行 --><parse_thr>1</parse_thr><!-- 分析线程个数,默认为1,最小值1,最大值32,多线程分析时,不支持ALTER TABLE操作同步 -->
<dict_dir>/dmdb/dmhs/dict/SYSTEM</dict_dir>
<arch>
<clear_interval>600</clear_interval><!-- 归档文件清理间隔,默认为600s,最小值60s,最大值2000000000s -->
<clear_flag>1</clear_flag><!-- 清除归档日志的方式,可选项0(无动作), 1(删除归档文件), 2(表示移走归档文件) -->
<bak_dir></bak_dir><!-- clear_flag项配置成2时,该配置项可以用来指定归档文件转移的目录,如果未配置这项,则转移到归档路径的log_bak目录下 -->
</arch>
<send><!-- 发送模块配置 -->
<ip>192.168.1.202</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5345</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5346</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
<level>0</level><!-- 复制级别,默认为0,最小值0,最大值65535 -->
<trigger>1</trigger><!-- 是否忽略触发器,默认为0,限定值0,1 -->
<constraint>1</constraint><!-- 是否忽略约束,默认为0,限定值0,1 -->
<identity>0</identity><!-- 是否忽略自增列,默认为0,限定值0(不忽略,插入同步过来的值),1(忽略,插入自增列自身的值)-->
<net_turns>0</net_turns><!-- 是否开启网闸模式,默认为0,限定值0(关闭),1(开启),网匝模式下,主机看不到备机的统计信息 -->
<crc_check>1</crc_check>
<filter>
<enable>
<item>*.*</item>
</enable>
</filter>
</send>
</cpt>
</dmhs>
3.3 检查DM6目的端DMHS运行环境
同源端部署dmhs软件的流程一致部署目的端dmhs软件,目的端数据库不需要开启逻辑追加日志,归档日志可选开启。通过echo $LD_LIBRARY_PATH检查目的端数据库服务器的动态库路径是否包含dm动态库路径,若没有,则执行如下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
3.4 DM6目的端配置文件
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<siteid>2</siteid>
<mgr_port>5345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<lang>ch</lang>
</base>
<recv><!-- 接收模块的基本配置,如果该节点只作为分析端,该节点需要删除 -->
<data_port>5346</data_port><!-- 数据接收端口号,默认为5346,最小值1000,最大值65535 -->
<exec><!-- 执行模块的基本配置 -->
<db_type>dm6</db_type><!-- 数据库类型,默认为dm7,限定值Oracle10g,Oracle11g,dm6,dm7 -->
<db_server>127.0.0.1</db_server><!-- 数据库服务名或IP -->
<db_user>SYSDBA</db_user><!-- 数据库用户名,默认为SYSDBA -->
<db_pwd>SYSDBA</db_pwd><!-- 数据库口令,默认为SYSDBA -->
<db_port>12345</db_port><!-- 数据库端口号,默认为12345 -->
<db_name>SYSTEM</db_name><!-- 默认数据库名,默认为空串(只针对dm6有用) -->
<exec_thr>8</exec_thr><!-- 执行线程个数,只有当exec_mode为1时才会生效!默认为1,最小值1,最大值64 -->
<exec_sql>512</exec_sql><!-- SQL缓存大小,默认为512M,最小值32M,最大值4096M -->
<exec_trx>5000</exec_trx><!-- 事务缓存个数,默认为5000,最小值,1000,最大值10000 -->
<exec_rows>250</exec_rows><!-- 批量绑定行数,默认为250,最小值1,最大值2000 -->
<exec_policy>2</exec_policy>
<case_sensitive>0</case_sensitive>
<toggle_case>0</toggle_case>
<affect_row>0</affect_row>
<disable_lob_interval>1800</disable_lob_interval>
<err_msg_policy>1</err_msg_policy>
<trx_split>1</trx_split>
<enable_merge>1</enable_merge>
<commit_policy>1</commit_policy>
<commit_mode>1</commit_mode>
<save_point_times>20</save_point_times>
</exec>
</recv>
</dmhs>
4 启动DMHS服务
1)首先,启动目的端服务
启动目的端DMHS进程:
[root@Kylin2 ]# cd /etc/init.d/
[root@Kylin2 init.d]# ./dmhs_serverd start
执行如下命令,开启目的端DMHS的执行模块:
[root@Kylin2 ]# cd /dmdb/dmhs/bin
[root@Kylin2 bin]# ./dmhs_console
DMHS> connect 目的端服务器IP:管理端口号
DMHS> start exec
![](https://i-blog.csdnimg.cn/blog_migrate/ea49d720bb464bf1834bc3c440b8f649.jpeg)
**connect连接的是目的端DMHS服务的地址以及目的端DMHS配置文件中的管理端口号(BASE中的MGR_PORT)。**
**start exec后会在dmhs/bin目录下生成dmhs_exec.tmp文件。下次启动dmhs服务会根据该文件判断是否需要启动执行服务,如果存在该文件,则直接启动dmhs执行器;如果该文件不存在,则需要执行start exec命令启动执行器。**
2)启动源端DMHS服务
启动源端DMHS进程:
[root@Kylin1 ]# cd /etc/init.d/
[root@Kylin1 init.d]# ./dmhs_serverd start
第一次搭建DMHS时源端需要进行字典装载,然后再启动DMHS捕获模块:
[root@Kylin1 ]# cd /dmdb/dmhs/bin
[root@Kylin1 bin]# ./dmhs_console
DMHS>connect 源端服务器IP:管理端口号
DMHS>copy 0 "sch.name='SYSDBA'" CREATE|INSERT|DICT|LSN
DMHS>start cpt
![](https://i-blog.csdnimg.cn/blog_migrate/7a98d18f12b0b773716f72b30cbf2d44.jpeg)
**start cpt后会在dmhs/bin目录下生成dmhs_cpt.tmp文件。下次启动dmhs服务会根据该文件判断是否需要启动捕获服务,如果存在该文件,则直接启动dmhs捕获器;如果该文件不存在,则需要执行start cpt命令启动捕获器。**
**装载字典或者装载数据只能在cpt停止的时候进行,因此,hs同步过程中如果需要进行字典或者数据的装载,要先执行stop cpt后再进行copy装载。**
5 总结
DMHS是一个很神奇的同步工具,搭建部署的过程中无法正常启动,会觉得很乏味很烦躁,但是当我们成功搭建起来整个环境并实现了同步,也会从中获得喜悦和收获,所以无论是数据库还是dmhs或者公司其他的产品,都需要多动手实践。