本次模拟DMHS同一进程双向同步部署验证及同步测试。
1.环境准备
1.1软件及系统版本
数据库: V7 安全 05117834104-20220901-168542-20012
DMHS: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
DMHS源端系统: NKylin V6.0 2.6.32-220.el6.x86_64
DMHS目的端系统: 银河麒麟V10 4.19.90-24.4.v2101.ky10.x86_64
1.2 源端主机+目的端主机
IP 数据库 端口
源端主机:172.26.8.211 5236
目的主机:172.26.8.89 5236
1.3系统配置及数据库部署
注意操作系统需调整关闭防火墙及关闭自启、关闭SELINUX、创建数据库用户及组、开启CORE功能、文件最大打开数、IO调度算法、环境变量、数据库部署及初始化实例等,DM云适配中心有很多详细案例,这里不做过多赘述。
2. 源端数据库配置
2.1 开启源端归档
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG /dbdata/xha2/dmarch,TYPE=local,FILE_SIZE=256,SPACE_LIMIT= 4096';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
2.2 开启逻辑日志
SQL> SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';
行号 PARA_VALUE
---------- ----------
1 0
SQL> select * from v$dm_ini where para_name like '%RLOG_APPEND_LOGIC';
行号 PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE
---------- ----------------- ---------- --------- --------- ------- ---------- ---------- ------------------------------------------- ---------
1 RLOG_APPEND_LOGIC 0 0 2 N 1 1 Whether to write logic records in redo logs SYS
注意:逻辑日志参数PARA_TYPE列如果是SYS类型,可通过系统函数动态修改,如果是IN FILE类型需修改配置文件后重启数据库服务,这里我们可以动态修改。
SQL> call sp_set_para_value(1,'RLOG_APPEND_LOGIC',1);
DMSQL 过程已成功完成
已用时间: 22.649(毫秒). 执行号:11.
SQL> select * from v$dm_ini where para_name like '%RLOG_APPEND_LOGIC';
行号 PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE
---------- ----------------- ---------- --------- --------- ------- ---------- ---------- ------------------------------------------- ---------
1 RLOG_APPEND_LOGIC 1 0 2 N 1 1 Whether to write logic records in redo logs SYS
注意:分别开启两侧数据库逻辑日志;此处列举一个;
2.3 检查在线日志
SQL> SELECT PATH FROM SYS.V$RLOGFILE;
行号 PATH
---------- -------------------------------------
1 /dbdata/xha2/data/DAMENG/DAMENG01.log
2 /dbdata/xha2/data/DAMENG/DAMENG02.log
已用时间: 1.262(毫秒). 执行号:13.
注意:分别检测两侧数据库在线日志;此处列举一个;
2.4 源端、目的端DMHS部署
[dmdba@NKylinV6/opt]$./V4.3.12_dm7_132175trunc_kylin3.0_64_veri_20230607_sp3.bin -i
3 .配置目标和源端及启动DMHS
3.1 修改dmhs_serverd
修目标端DMHS启动脚本:
[dmdba@8-rwc89-node1]$vim dmhs_serverd
prog=dmhs_server_b2a2
prog_old=dmhs_server_b2a2
export DMHS_HOME=/dbdata/xhb2/dmhs_sx_b2toa2
prog_path=$DMHS_HOME
path=/dbdata/xhb2/dmhs_sx_b2toa2/dmhs.hs
修改源端DMHS启动脚本:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$ vim dmhs_serverd
dmhs_serverd
prog=dmhs_server_a2b2
prog_old=dmhs_server_a2b2
export DMHS_HOME=/dbdata/xha2/dmhs_sx_a2tob2
prog_path=$DMHS_HOME
path=/dbdata/xha2/dmhs_sx_a2tob2/dmhs.hs
3.2 编辑dmhs.hs配置文件
修改目的端DMHS配置文件:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_b2toa2]$vim dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>7345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<siteid>18</siteid>
</base>
<cpt>
<db_type>dm7</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>
<idle_time>300</idle_time>
<dict_dir>/dbdata/xhb2/dmhs_dict_b2toa2</dict_dir>
<ddl_mask>obj:op</ddl_mask>
<parse_thr>1</parse_thr>
<parse_policy>8</parse_policy>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
<bak_dir></bak_dir>
</arch>
<send>
<ip>172.26.8.211</ip>
<mgr_port>8345</mgr_port>
<data_port>8346</data_port>
<trigger>1</trigger>
<constraint>1</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<filter>
<enable>
<item>DMDBA.T3_SX</item>
<item>DMDBA.T4_SX</item>
<item>SYSDBA.DMHS_TRXID_TABLE</item>
</enable>
<disable>
<item>SYSJOB.*</item>
</disable>
</filter>
<map>
<item></item>
</map>
</send>
</cpt>
<recv>
<data_port>7346</data_port>
<exec>
<db_type>DM7</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>
<exec_mode>0</exec_mode>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx>5000</exec_trx>
<exec_rows>250</exec_rows>
<case_sensitive>1</case_sensitive>
<toggle_case>0</toggle_case>
<exec_policy>0</exec_policy>
<COMMIT_policy>1</COMMIT_policy>
<enable_merge>1</enable_merge>
<level>65535</level>
</exec>
</recv>
</dmhs>
修改源端DMHS文件:
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>8345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<siteid>16</siteid>
</base>
<cpt>
<db_type>dm7</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>
<idle_time>300</idle_time>
<dict_dir>/dbdata/xha2/dmhs_dict_a2tob2</dict_dir>
<ddl_mask>obj:op</ddl_mask>
<parse_thr>1</parse_thr>
<parse_policy>8</parse_policy>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
<bak_dir></bak_dir>
</arch>
<send>
<ip>172.26.8.89</ip>
<mgr_port>7345</mgr_port>
<data_port>7346</data_port>
<trigger>1</trigger>
<constraint>1</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<filter>
<enable>
<item>DMDBA.T3_SX</item>
<item>DMDBA.T4_SX</item>
<item>SYSDBA.DMHS_TRXID_TABLE</item>
</enable>
<disable>
<item>SYSJOB.*</item>
</disable>
</filter>
<map>
<item></item>
</map>
</send>
</cpt>
<recv>
<data_port>8346</data_port>
<exec>
<db_type>DM7</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>
<exec_mode>0</exec_mode>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx>5000</exec_trx>
<exec_rows>250</exec_rows>
<case_sensitive>1</case_sensitive>
<toggle_case>0</toggle_case>
<exec_policy>0</exec_policy>
<COMMIT_policy>1</COMMIT_policy>
<level>65535</level>
<enable_merge>1</enable_merge>
</exec>
</recv>
</dmhs>
注意:同一进程的双向同步,目的端和源里既要配置cpt模块,还要配置exec模块,配完请核对参数的正确性。新建字典存目录,如果数据库是HA架构的话,需将字典目录创建在存储分区上。
3.3 启动DMHS服务
双向同步中,装载字典前,一定要先将两端的执行器启动,创建好执行端的辅助表后再装载字典。
启动执行端服务,此处一定要用exec和cpt分别启动,不能用start命令,start命令后不跟cpt或exec会根据配置文件同时启动cpt和exec。
源端启动:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$./dmhs_console
DMHS console tool: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
Copyright (c) 2020, DMHS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
连接到DMHS:127.0.0.1:8345
执行成功
Dameng HS Server V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
DMHS> state
MGR: do not run any module
执行成功
DMHS> start exec
执行成功
DMHS>
目的端启动:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_sx_b2toa2]$./dmhs_console
DMHS console tool: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
Copyright (c) 2020, DMHS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
连接到DMHS:127.0.0.1:7345
执行成功
Dameng HS Server V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
DMHS> state
MGR: do not run any module
执行成功
DMHS> start exec
执行成功
DMHS>
3.4 装载字典
如下举例测试环境里2表数据以源端基准起始数据COPY(也可能相关表从两侧当前数据开始双向同步,根据实际需求选择COPY方式)。
源端COPY操作:
DMHS>COPY 0 "SCH.NAME='DMDBA' AND TAB.NAME IN ('T3_SX','T4_SX')" DICT|LSN|TRUNCATE|INSERT|THREAD|2|REG
CSL[WARN]: 检测到TRUNCATE掩码,该掩码会清空目标表数据(多对一架构时含其他站点数据)!请确认是否继续?(Y/N)
Y
CSL[WARN]: 检测到LSN掩码,该掩码会忽略日志中小于当前LSN的所有操作,请确认是否继续?(Y/N)
Y
copy mask is : |TRUNCATE|INSERT|THREAD|TABLE|DICT|REG|LSN|PARTITION|OBJID|REP
执行完成,请查看执行模块日志,检查数据装载是否成功
DMHS>
目的端操作:
DMHS> COPY 0 "SCH.NAME='DMDBA' AND TAB.NAME IN ('T3_SX','T4_SX')" DICT|LSN|THREAD|2
CSL[WARN]: 检测到LSN掩码,该掩码会忽略日志中小于当前LSN的所有操作,请确认是否继续?(Y/N)
Y
copy mask is : |THREAD|DICT|LSN|PARTITION|REP
Y
执行完成,请查看执行模块日志,检查数据装载是否成功
DMHS>
注意:数据表的COPY是需在一侧进行,另一侧只是进行同步表字典同步;而且DMHS源端和目的端辅助表不做相关操作,DMHS内部机制全局共用自动同步。在搭建了双向同步或是成环的同步环境中装载数据,必须使用REG掩码。在对端事务表中登记装载的事务,否则数据会回流回来。具体解释见DMHS手册。
3.5 启动CPT模块
    分别启动两侧CPT模块, xha2侧:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$./dmhs_console
DMHS> start cpt
执行成功
DMHS> state
MGR: Capture Execute
TYPE VID SITEID EXEC/CPT IP PORT DBNAME
------- --- ------ ----------- ---- ------
Capture 0 16 172.26.8.89 7345
Execute 0 18 172.26.8.89 7345
执行成功
DMHS>
DMHS日志显示:
    分别启动两侧CPT模块, xhb2侧:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_sx_b2toa2]$./dmhs_console
DMHS> start cpt
执行成功
DMHS> state
MGR: Capture Execute
TYPE VID SITEID EXEC/CPT IP PORT DBNAME
------- --- ------ ------------ ---- ------
Capture 0 18 172.26.8.211 8345
Execute 0 16 172.26.8.211 8345
执行成功
如下为正常运行后两侧的DMHS日志:
3.6 DMHS_TRXID_TABLE辅助表和LEVEL参数
DMHS_TRXID_TABLE为DMHS目的端辅助表,该表记录了源端事务日志中的事务入库信息,单向同步的时候只存在执行端目的端,双向的时候两侧都存在该表,参数详细解见DMHS手册。
双向同步中事务过滤要如何理解,如双向同步中,数据库 A 的增量数据会同步到数据库 B,数据库 B 的增量操作会同步到数据库 A。为避免同一个事务在数据库 A、B 上重复执行,进入死循环状态,DMHS 必须对接收到的增量数据进行判断,对未执行过的事务,执行模块将增量数据入库;对已经执行过的事务,执行模块将增量数据丢弃。DMHS根据数据操作类型的不同,使用不同的方法判断事务是否已经执行。如果增量数据为 DML 操作,DMHS 在数据入库时,会对该事务打个标记,当此事务传回源端 DMHS时,DMHS 会根据事务标记,过滤该事务。如果增量数据为 DDL 操作时,DMHS 在数据入库时,会对该 DDL 操作打个标记,当此DDL传回源端时,DMHS会根据DDL标记,过滤该事务。
注意:双向同步不能过滤 DMHS_TRXID_TABLE 表的操作,否则事务会死循环。了解到双向不能过滤,要同步,是HS内部机制去处理。单向的时候不同步辅助表,辅助表只有在目的端有。
Level为DMHS参数之一,含义:级联等级,取值为 0 或 65535,默认为 0。
说明:该参数配置在执行端,用于表示同步拓扑架构的级联等级。取值说明如下:
0:对于同步拓扑架构为单向或双向同步时,执行端配置该参数为 0。
65535:对于同步拓扑架构为三节点及以上环形结构,每一个执行端需配置该参数为65535。另外需要注意 siteid 配置不能大于等于 64。
双向同步配置中,需注意,DMHS A及 DMHS B执行模块参数level手册建议配置为 0。实际环境也可以配置成65535,让DMHS自己判断并识别。
4. 双向同步验证
1.双向在xha2侧进行增删改查均可同步到xhb2侧,具体如下图:
2.双向在xhb2侧进行增删改查均可同步到xha2侧,具体如下图:
3.两侧同时操作时,如同时插入相同数据时两侧HS日志提示违反表的唯一性约束,当前入库的同时对端的语句回流过来就会报错,如下图:
4.双向同步系统中,切忌”应避免同时对2个源端数据库同一表同一行数据进行修改操作。”此种操作不会导致HS和数据库运行异常,只会导致2个源端的同一表的数据不一致;处理时要根据实际情况判断处理。因测试环境无法验证同时处理同一条数据,此处不做过多赘述。
5. 遇到问题及处理
问题1:
MGR[ERROR]: 库文件 libdmhs_exec.so 未找到, 出错: 0, libdmoci.so: cannot open shared object file: No such file or directory
MGR[ERROR]: 日志执行启动失败
处理:
DMHS目的端启动执行模块报错,建议使用数据库同版本的libdmoci.so,不建议使用DMHS自带文件。
问题2:
MGR[ERROR]: lib libdmhs_exec.so can not found,error code0
MGR[ERROR]: log exec start fail
处理:
ldd libdmhs_exec.so查看,libdmoci.so => not found,搜索只有DMHS相关路径下有libdmoci.so文件拷贝/lib64或配置DMHS环境变量lib库路径
export DMHS_HOME=/home/dmdba/dm/dmhs
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdba/dm/dmhs/bin
问题3:
EXE[INFO]: 站点号:16, 表(DMDBA.T3_SX)起始LSN:44199025
EXE[ERROR]: SITEID:16 DMDBA.T3_SX(UPDATE):影响行数(0)与预期的行数(1)不一致!SEQID:44199678 TRXID:13489 OP_ID:25
EXE[ERROR]: SITEID:16 DMDBA.T3_SX(UPDATE) 同步失败,里面填充的行数为 1 SEQID:44199678 TRXID:13489 OP_ID:25
EXE[ERROR]: 保存出错的事务,SITEID:16 SEQID:44199678 TRXID:13489 OP_ID:25(DMDBA.T3_SX)
处理:
双向A2或B2侧delete/update数据,对应侧的双向的hs日志会有如上提示;另一侧刷新checkpoint;分别下级级联侧也是正常刷新checkpoint检查点;经前台启用定位报错日志提示"表SYSDBA.DMHS_TRXID_TABLE的同步被过滤规则启用";了解到过滤规则现有版本把事务表过滤加进去了,临时绕过处理就是把辅助表加到白名单里,重启DMHS后就正常了。