目录
DMHS介绍
支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统
支持一对一、一对多广播型、多对一聚合型、多对多以及级联复制等多种数据复制形式
总体架构:单进程多线程架构(dmhs_server)
源端主要线程:日志读、日志分析、日志发送、监听、调度管理
目标端主要线程:日志接收、日志执行、监听、调度管理
扩展功能模块:guard进程守护、stat监控统计、对比工具、web管理平台
工作模式:
捕获器 捕获器在数据实时同步系统中负责读取、解析源端数据库管理系统的归档日志,并发送解析后的数据。
执行器 执行器在数据实时同步系统中负责接收数据,并进行数据映射及事务的入库(目标端数据库)执行。
路由器 路由器适用于捕获器和执行器被网关隔断的环境,捕获器和执行器无法通过NET实现网络直连,需要经过第三台机器中转的情况。
转发器 捕获器和执行器之间存在物理隔离网闸,无法通过网络直连需要通过文件中转的情况捕获器(cpt)转发器 (transfer) 路由器 (route) 执行器 (exec)
DMHS搭建
作为源端的dmhs必须部署在源端数据库所在的机器上(读取归档的需求);
作为目的端的dmhs可以不与目的端数据库部署在同一机器上,但是前提要求是dmhs所在机 器上必须有能够连接目的端数据库的对应的odbc工具。
环境准备:
两节点间需要通信,测试时直接关闭了防火墙
两台虚拟机,Centos7 ,DM8
源端:192.168.89.128 port_num=5236 db_name=hs_src
目标端:192.168.89.129 port_num=5236 db_name=hs_dest
开启归档和逻辑日志
DMHS同步源端数据库需要开启归档模式&附加日志参数
ARCH_INI=1
DM6附加日志参数:ENABLE_LOGICAL_DML_LOG =1
DM7/DM8:
RLOG_APPEND_LOGIC=1
注意:FAST_COMMIT需要为0 批量提交事务的个数
oracle作为源端开启附加日志:
SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
此次测试源端目标端均打开了归档和逻辑日志参数
归档配置:
源库:
[ARCHIVE_LOCAL1]
ARCH_TYPE=LOCAL
ARCH_DEST=/dmdata/hs_src/arch
ARCH_FILE_SIZE=128
ARCH_SPACE_LIMIT=1024
目标库:
[ARCHIVE_LOCAL1]
ARCH_TYPE=LOCAL
ARCH_DEST=/dmdata/hs_dest/arch
ARCH_FILE_SIZE=128
ARCH_SPACE_LIMIT=1024
启动数据库并检查配置:
测试连接
$ disql SYSDBA/SYSDBA
检查归档:SQL> select arch_name,arch_type,arch_dest,arch_is_valid from v$dm_arch_ini;
检查逻辑日志:SQL> select para_name,para_value,sess_value,file_value from v$dm_ini where para_name ='RLOG_APPEND_LOGIC';
检查FAST_COMMIT:SQL> select para_name,para_value,sess_value,file_value from v$dm_ini where para_name ='FAST_COMMIT';
检查在线日志:SQL> select * from sys.v$rlogfile;
DMHS安装配置
Linux环境:
命令行方式: ./dmhs_V3.1.3_dm7_rev90481_rh7_64_veri_20200507.bin -i
图形化方式: ./dmhs_V3.1.3_dm7_rev90481_rh7_64_veri_20200507.bin
作为源端的dmhs必须部署在源端数据库所在的机器上(读取归档的需求),作为目的端的dmhs可以不与目的端数据库部署在同一机器上,但是前提要求是dmhs所在机器上必须有能够连接目的端数据库的对应的odbc工具。
Windows环境:双击exe安装程序文件,根据安装向导提示完成安装过程
上传安装包:
设置权限
# chown -R dmdba:dinstall dmhs_V4.1.2_dm8_rev99922_rh6_64_veri_20210604.bin
# chmod +x dmhs_V4.1.2_dm8_rev99922_rh6_64_veri_20210604.bin
安装:$ dmhs_V4.1.2_dm8_rev99922_rh6_64_veri_20210604.bin -i
根据提示选择完整版、安装路径、统一部署、依赖库路径、内置数据库配置、内置数据库服务自动启动、远程控制服务自动启动、web服务自动启动、根据提示切换到root执行脚本
查看内置数据库版本:select name,instance_name,svr_version from v$instance;
环境变量:
dm8数据库安装路径:/dm8
dmhs安装路径:/home/dmdba/dmhs
[dmdba@dmtest1 log]$ echo $LD_LIBRARY_PATH
:/home/dmdba/dmhs/bin:/home/dmdba/dmhs/db/bin:/dm8/bin
- dmhs配置
- 配置DDL
-
辅助表方式(源端数据库):
如果要求 DDL 同步,那么需要创建 DDL 触发器和辅助表。创建的脚本参见 DMHS安装目录下 scripts 子目录中“ddl_sql_*.sql”。注意创建时需要使用 SYSDBA 用户。(使用管理工具创建不会报错)
-
执行脚本:`/home/dmdba/dmhs/scripts/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';
捕获器cpt&执行器exec
捕获器:
DMHS配置需要设置管理端口号(mgr_port)和数据端口号(data_port),需要提供两个端口号,并确保可以使用。
在配置之前需要明确连接源端数据库的用户(db_user)及密码(db_pwd),该用户需要具有操作待同步表 的权限。
确定是否有DDL同步需求,如果有,确定待同步的对象如表、视图、存储过程、函数、序列等,并且 需要确定对象的操作如创建、删除、修改等。根据此同步需求设置ddl_mask参数值。
确定源端数据库的归档日志是否需要DMHS进行处理如删除、保留或转移。依据此需求设置clear_flag 参数值。
确定需要进行数据同步的用户表(白名单及黑名单)及同步映射关系,并据此需求,完成filter及map 元素项的参数值设置。
执行器:
准备执行器管理端口号(mgr_port)和数据端口号(data_port),需要提供两个端口号,并确保可以使用。
执行器中连接目标数据库的用户(db_user)及密码(db_pwd),该用户需要具有操作待同步表的权限。
在软件安装服务器上(源端):
配置说明:
添加列映射规则:
<map><!-- 列映射规则-->
<!-- 模式名.表名==模式名.表名-->
<tableitem>
<tablename>源表名</tablename>
<type>过滤类型</type>
<colitem>映射规则</colitem>
</tableitem>
</map>
需要DDL同步的配置文件:
在cpt模块添加配置:
<ddl_mask>op:obj</ddl_mask> <!--DDL 配置项-->
在send发送模块添加配置:
<trigger>1</trigger><!-- 是否忽略触发器,默认为 0,限定值 0,1 -->
<constraint>1</constraint><!-- 是否忽略约束,默认为 0,限定值 0,1 -->
<identity>1</identity>
<net_turns>0</net_turns>
siteid 全局唯一,即 DMHS 同步系统涉及的所有节点的 siteid 必须全局唯一,不允 许有重复值
DDL 配置项,如果不需要 DDL 同步,那么就配置为空,即, 相应地 DMHS DDL 触发器和辅助表也不需要创建。
归档清理配置项,clear_flag 为 1 表示清除,即 DMHS 将同步完成的归档文件删除; 为 2,表示将同步完成的归档移到 bak_dir 目录下;为 0,表示不作任何操作。
过滤配置项,本示例配置了白名单,即 enable,也可以配置黑名单,详见 DMHS 用户手册。其过滤的规则是:先判断白名单,然后判断黑名单。如果存在重叠的情况,那么 也是会被过滤的。
映射配置项,表示存在不同模式之间的表同步,例如本示例中源端的 SYSDBA 模 式下的表映射成目的端的 DMHS 模式下同名的表。
$vim /home/dmdba/dmhs/bin/dmhs.hs
源端:
<?xml version="1.0" encoding="GB2312" ?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<db_type>DM8</db_type>
<db_server>127.0.0.1</db_server>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<db_name></db_name>
<idle_time>10</idle_time>
<parse_thr>1</parse_thr>
<ddl_mask>op:obj</ddl_mask> <!--DDL 配置项-->
<arch>
<clear_interval>60</clear_interval>
<clear_flag>1</clear_flag>
<bak_dir></bak_dir>
</arch>
<send>
<ip>192.168.89.129</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<trigger>1</trigger><!-- 是否忽略触发器,默认为 0,限定值 0,1 -->
<constraint>1</constraint><!-- 是否忽略约束,默认为 0,限定值 0,1 -->
<identity>1</identity>
<net_turns>0</net_turns>
<filter><!--配置过滤项-->
<enable><!—白名单-->
<item>SYSDBA.*</item>
</enable>
<disable> </disable><!-- 黑名单 -->
</filter>
<map><!-- 映射规则-->
<!-- 模式名.表名==模式名.表名-->
<item>SYSDBA.*==SYSDBA.*</item>
</map>
</send>
</cpt>
目的端:
<?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>
<version>2.0</version>
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<db_type>DM8</db_type>
<db_server>127.0.0.1</db_server>
<db_port>5236</db_port>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<recv_caches>8</recv_caches>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
</exec>
</dmhs>
启动dmhs:
源端:
目标端:
新开窗口:
源端目的端执行dmhs_console:
目标端:
cd /home/dmdba/dmhs/bin
./dmhs_console
DMHS> connect 192.168.89.129:5345
源端:
cd /home/dmdba/dmhs/bin
./dmhs_console
DMHS> connect 192.168.89.128:5345
目标端执行DMHS> start exec
源端执行:DMHS> copy 0 "sch.name='SYSDBA'" DICT|LSN|CREATE|INSERT|INDEX
源端开启同步:
DMHS> start
创建服务(源端&目标端):
cd /home/dmdba/dmhs/scripts/root/
# ./dmhs_service_installer.sh -t dmhs_server -d /home/dmdba/dmhs/bin/ -p hs -x /home/dmdba/dmhs/bin/dmhs.hs
服务方式启动:
cd /home/dmdba/dmhs/bin
./DmhsServicedmhcpt start
常见错误
1、MGR[ERROR]:库文件libdmhs_exec.so未找到,出错:0
ldd找不到libdmhs_exec.so
[dmdba@ dmtest2 bin]$ cd /home/dmdba/dmhs/bin
[dmdba@dmtest2 bin]$ ldd libdmhs_exec.so
linux-vdso.so.1 => (0x00007ffc429f4000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffb81220000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffb80f1e000)
librt.so.1 => /lib64/librt.so.1 (0x00007ffb80d16000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffb80afa000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffb808f6000)
libdmhs_pub.so => ./libdmhs_pub.so (0x00007ffb805ca000)
libdmhs_ucvt.so => ./libdmhs_ucvt.so (0x00007ffb8006f000)
libdmhs_dm_obj.so => ./libdmhs_dm_obj.so (0x00007ffb7fe5a000)
libdmhs_cvt.so => ./libdmhs_cvt.so (0x00007ffb7fbd1000)
libdodbc.so => /dm8/bin/libdodbc.so (0x00007ffb7f9a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffb8199d000)
libdmhs_exp.so => ./libdmhs_exp.so (0x00007ffb7f5d0000)
libdmhs_xml.so => ./libdmhs_xml.so (0x00007ffb7f3c1000)
libdmoci.so => not found <-------------此处显示not found
libdmdpi.so => /dm8/bin/libdmdpi.so (0x00007ffb7e753000)
libdmfldr.so => /dm8/bin/libdmfldr.so (0x00007ffb7db23000)
libdmelog.so => /dm8/bin/libdmelog.so (0x00007ffb7d91c000)
libdmutl.so => /dm8/bin/libdmutl.so (0x00007ffb7d70a000)
libdmclientlex.so => /dm8/bin/libdmclientlex.so (0x00007ffb7d4d7000)
libdmos.so => /dm8/bin/libdmos.so (0x00007ffb7d2ab000)
libdmcvt.so => /dm8/bin/libdmcvt.so (0x00007ffb7cbcc000)
libdmstrt.so => /dm8/bin/libdmstrt.so (0x00007ffb7c9b8000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007ffb7c6b1000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffb7c49b000)
libdmmem.so => /dm8/bin/libdmmem.so (0x00007ffb7c28e000)
libdmcalc.so => /dm8/bin/libdmcalc.so (0x00007ffb7c009000)
解决办法:
[dmdba@dmtest2 bin]$ cd /home/dmdba/dmhs/bin
[dmdba@ dmtest 2 bin]$ find -name libdmoci.so
./stat/libdmoci.so
[dmdba@dmtest2 bin]$ echo $LD_LIBRARY_PATH
:/home/dmdba/dmhs/bin:/dm8/bin
[dmdba@dmtest2 stat]$ cd /home/dmdba/dmhs/bin/stat/
./stat/libdmoci.so
[dmdba@dmtest2 stat]$ cp libdmoci.so /home/dmdba/dmhs/bin/
[dmdba@dmtest2 bin]$ ldd libdmhs_exec.so
linux-vdso.so.1 => (0x00007ffc9a1f7000)
libc.so.6 => /lib64/libc.so.6 (0x00007f08e62c2000)
libm.so.6 => /lib64/libm.so.6 (0x00007f08e5fc0000)
librt.so.1 => /lib64/librt.so.1 (0x00007f08e5db8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f08e5b9c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f08e5998000)
libdmhs_pub.so => ./libdmhs_pub.so (0x00007f08e566c000)
libdmhs_ucvt.so => ./libdmhs_ucvt.so (0x00007f08e5111000)
libdmhs_dm_obj.so => ./libdmhs_dm_obj.so (0x00007f08e4efc000)
libdmhs_cvt.so => ./libdmhs_cvt.so (0x00007f08e4c73000)
libdodbc.so => /dm8/bin/libdodbc.so (0x00007f08e4a47000)
/lib64/ld-linux-x86-64.so.2 (0x00007f08e6a3f000)
libdmhs_exp.so => ./libdmhs_exp.so (0x00007f08e4672000)
libdmhs_xml.so => ./libdmhs_xml.so (0x00007f08e4463000)
libdmoci.so => ./libdmoci.so (0x00007f08e39f4000) <---- 此处已有内容
libdmdpi.so => /dm8/bin/libdmdpi.so (0x00007f08e2d86000)
libdmfldr.so => /dm8/bin/libdmfldr.so (0x00007f08e2156000)
libdmelog.so => /dm8/bin/libdmelog.so (0x00007f08e1f4f000)
libdmutl.so => /dm8/bin/libdmutl.so (0x00007f08e1d3d000)
libdmclientlex.so => /dm8/bin/libdmclientlex.so (0x00007f08e1b0a000)
libdmos.so => /dm8/bin/libdmos.so (0x00007f08e18de000)
libdmcvt.so => /dm8/bin/libdmcvt.so (0x00007f08e11ff000)
libdmstrt.so => /dm8/bin/libdmstrt.so (0x00007f08e0feb000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f08e0ce4000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f08e0ace000)
libdmmem.so => /dm8/bin/libdmmem.so (0x00007f08e08c1000)
libdmcalc.so => /dm8/bin/libdmcalc.so (0x00007f08e063c000)
2、
源端copy报错:
MGR[ERROR]: 库文件 libcpt_dm8.so 未找到, 出错: 0
环境变量添加:
/home/dmdba/dmhs/db/bin