作为一个达梦的初学者,写这篇文章的目的是为了把学到的新知识做个总结梳理,在整理中查缺补漏,也希望大家看了我的文章能有收获,如有错误的地方欢迎指出。
数据同步工具 (DMHS),可实现同构、异构数据库间的数据同步,基于此工具,可实现在现应急灾备、多业务中心、异构资源信息整合等多种使用场景。以下是DM数据库之间实现的双向同步过程,这里
一、用dts迁移源端数据到目的端,使源端数据和目的端数据一致(也可直接物理备份还原)
key改名为dmhs.key放到/opt/dmhs/bin下
二、修改两端的dm.ini参数,开启归档,重启数据库使参数生效
1、ARCH_INI参数值设置为1
2、RLOG_APPEND_LOGIC参数的值设置为1
3、dmarch.ini放在实例文件夹下。归档文件如下
[ ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch
ARCH_FILE_SIZE = 512
ARCH_SPACE_LIMIT = 10240
三、安装hs软件--------DDL同步(看情况而定)
两端均在管理工具中的执行/opt/dmhs/scripts/ddl_sql_dm8.sql(DDL同步必要操作)
1、源端dmhs.hs配置文件(放在/opt/dmhs/bin下)
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
<log_size_limit>5</log_size_limit><!-- DMHS的log下的日志文件的总大小单位GB -->
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<db_type>DM8</db_type>
<db_server>192.168.1.1</db_server>
<db_user>SYSDBA</db_user><!-- 入库事务的执行者,如果不需要使用用户过滤,一般都填SYSDBA -->
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<vpool>128</vpool><!--工作线程私有内存池的大小-->
<vpools>13</vpools><!--缓存事务使用内存池的个数-->
<trxid_tables>6</trxid_tables><!--存放事务信息的辅助表个数,分散热点-->
<exec_thr>8</exec_thr><!--EXEC 模块用来数据入库的工作线程数-->
<exec_sql>1024</exec_sql><!--EXEC 模块缓存事务 SQL 语句的内存大小,太小会导致缓存事务刷盘,影响IO-->
<affect_row>0</affect_row><!--是否启用影响行数检查,用于判断数据一致性,但是会影响性能,按需配置-->
<exec_trx>5000</exec_trx><!--允许缓存事务的个数,超过这个个数,同步会停止-->
<exec_rows>1000</exec_rows><!--数据入库时允许的最大批量行数,提高性能,加大内存占用,按需配置-->
<case_sensitive>1</case_sensitive><!--EXEC 模块操作数据库对象时,是否需要保持对象名敏感,大小写敏感的库务必1-->
<toggle_case>0</toggle_case><!--EXEC 模块操作数据库对象时,是否需要把对象名转换为大小写-->
<exec_policy>2</exec_policy><!--事务入库出错时的执行策略,出错丢弃整个事务保持一致性用0,尽可能保持同步容忍不一致用2,出错停止用1-->
<enable_lob_buf>1</enable_lob_buf><!--执行端是否允许大字段缓存-->
<commit_prepare>1</commit_prepare><!--是否启用提交准备功能,可提高效率-->
<commit_policy>1</commit_policy><!--事务入库的事务提交策略,1为关联表的提交按照顺序,非关联事务并行执行-->
<clear_trx_file>1</clear_trx_file><!--是否启用错误事务自动清除功能-->
<recv_caches>16</recv_caches><!--EXEC 模块用来接收 NET 模块消息的缓存个数,提高并行exec效率,增大内存-->
<ddl_continue>1</ddl_continue><!--DDL 出错时是否允许继续同步,按需配置-->
<level>0</level><!--2节点用0,三节点环形用65535-->
</exec>
<cpt>
<db_type>DM8</db_type>
<db_server>192.168.1.1</db_server>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<idle_time>10</idle_time>
<ddl_mask>op:obj</ddl_mask><!--ddl同步策略,不需要ddl同步的话务必置空而不是不写该标签-->
<parse_thr>4</parse_thr><!--日志分析线程数,可提高日志解析速度,旧版dmhs的ddl同步情况下建议保持默认的1-->
<parse_policy>0</parse_policy><!--解析策略,0 表示解析日志出错时,主动 halt;1 表示忽略解析错误,继续解析,按需配置,源端DM8一般配置1-->
<idle_time>300</idle_time><!--日志分析空闲时间,防止dmhs读取速度赶超redo切换复写速度-->
<read_again_interval>255</read_again_interval><!--开启日志读取二次读取校验日志功能,防止dmhs读取速度赶超redo切换复写速度-->
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send>
<ip>192.168.1.2</ip><!-- 对方IP -->
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<net_pack_size>256</net_pack_size>
<vpools>13</vpools><!--NET 模块内存池的个数-->
<vpool_size>128</vpool_size><!--缓存事务使用内存池的个数-->
<case_sensitive>1</case_sensitive><!--NET 模块针对对象名是否大小写敏感,对下面filter过滤有影响,大小写敏感库配置为1-->
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>1</trigger><!--指示下一级数据入库时,是否需要禁用触发器,配置为1,避免同步的数据触发目的端触发器-->
<constraint>1</constraint><!--指示下一级数据入库时,是否需要禁用约束-->
<identity>1</identity><!--1 则表示同步 CPT 中带来的该列值,它的值使用 CPT 中带来的值进行填充;0 则表示启用目标库自增列的属性,目标库自已维护该列的值,按需配置-->
<filter>
<enable>
<item>SYSDBA.*</item><!--同步是白名单排除黑名单的差集-->
</enable>
<disable>
<item>SYSDBA.TEST*</item>
</disable>
</filter>
</send>
</cpt>
</dmhs>
2、目的端dmhs.hs配置文件
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
<log_size_limit>5</log_size_limit><!-- DMHS的log下的日志文件的总大小单位GB -->
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<db_type>DM7</db_type>
<db_server>192.168.1.2</db_server>
<db_user>SYSDBA</db_user><!-- 入库事务的执行者,如果不需要使用用户过滤,一般都填SYSDBA -->
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<vpool>128</vpool><!--工作线程私有内存池的大小-->
<vpools>13</vpools><!--缓存事务使用内存池的个数-->
<trxid_tables>6</trxid_tables><!--存放事务信息的辅助表个数,分散热点-->
<exec_thr>8</exec_thr><!--EXEC 模块用来数据入库的工作线程数-->
<exec_sql>1024</exec_sql><!--EXEC 模块缓存事务 SQL 语句的内存大小,太小会导致缓存事务刷盘,影响IO-->
<affect_row>0</affect_row><!--是否启用影响行数检查,用于判断数据一致性,但是会影响性能,按需配置-->
<exec_trx>5000</exec_trx><!--允许缓存事务的个数,超过这个个数,同步会停止-->
<exec_rows>1000</exec_rows><!--数据入库时允许的最大批量行数,提高性能,加大内存占用,按需配置-->
<case_sensitive>1</case_sensitive><!--EXEC 模块操作数据库对象时,是否需要保持对象名敏感,大小写敏感的库务必1-->
<toggle_case>0</toggle_case><!--EXEC 模块操作数据库对象时,是否需要把对象名转换为大小写-->
<exec_policy>2</exec_policy><!--事务入库出错时的执行策略,出错丢弃整个事务保持一致性用0,尽可能保持同步容忍不一致用2,出错停止用1-->
<enable_lob_buf>1</enable_lob_buf><!--执行端是否允许大字段缓存-->
<commit_prepare>1</commit_prepare><!--是否启用提交准备功能,可提高效率-->
<commit_policy>1</commit_policy><!--事务入库的事务提交策略,1为关联表的提交按照顺序,非关联事务并行执行-->
<clear_trx_file>1</clear_trx_file><!--是否启用错误事务自动清除功能-->
<recv_caches>16</recv_caches><!--EXEC 模块用来接收 NET 模块消息的缓存个数,提高并行exec效率,增大内存-->
<ddl_continue>1</ddl_continue><!--DDL 出错时是否允许继续同步,按需配置-->
<level>0</level><!--2节点用0,三节点环形用65535-->
</exec>
<cpt>
<db_type>DM7</db_type>
<db_server>192.168.1.2</db_server>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<idle_time>10</idle_time>
<ddl_mask>op:obj</ddl_mask><!--ddl同步策略,不需要ddl同步的话务必置空而不是不写该标签-->
<parse_thr>4</parse_thr><!--日志分析线程数,可提高日志解析速度,旧版dmhs的ddl同步情况下建议保持默认的1-->
<parse_policy>0</parse_policy><!--解析策略,0 表示解析日志出错时,主动 halt;1 表示忽略解析错误,继续解析,按需配置,源端DM8一般配置1-->
<idle_time>300</idle_time><!--日志分析空闲时间,防止dmhs读取速度赶超redo切换复写速度-->
<read_again_interval>255</read_again_interval><!--开启日志读取二次读取校验日志功能,防止dmhs读取速度赶超redo切换复写速度-->
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send>
<ip>192.168.1.1</ip><!-- 对方IP -->
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<net_pack_size>256</net_pack_size>
<vpools>13</vpools><!--NET 模块内存池的个数-->
<vpool_size>128</vpool_size><!--缓存事务使用内存池的个数-->
<case_sensitive>1</case_sensitive><!--NET 模块针对对象名是否大小写敏感,对下面filter过滤有影响,大小写敏感库配置为1-->
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>1</trigger><!--指示下一级数据入库时,是否需要禁用触发器,配置为1,避免同步的数据触发目的端触发器-->
<constraint>1</constraint><!--指示下一级数据入库时,是否需要禁用约束-->
<identity>1</identity><!--1 则表示同步 CPT 中带来的该列值,它的值使用 CPT 中带来的值进行填充;0 则表示启用目标库自增列的属性,目标库自已维护该列的值,按需配置-->
<filter>
<enable>
<item>SYSDBA.*</item><!--同步的表示白名单排除黑名单的差集-->
</enable>
<disable>
<item>SYSDBA.TEST*</item>
</disable>
</filter>
</send>
</cpt>
</dmhs>
四、启动同步服务,装字典
1、启动两端的dmhs服务
cd /opt/dmhs/bin
./dmhs_server
2、另打开一个窗口,启动两端的执行服务
./dmhs_console进入后
connect 回车
start exec 回车
clear exec lsn;回车
copy 0 "sch.name in (‘xx’,’xx’,...)" dict 回车
start cpt 回车
3、配置service服务
两端/opt/dmhs/bin/service_template下
修改DmhsService
然后cp /opt/dmhs/bin/service_template/DmhsService /etc/init.d/,然后systemctl enable DmhsService
然后就可以exit退出之前源端和目的端的dmhs_server窗口。
通过service DmhsService start后台启动dmhs
vi /etc/rc.local添加如开机自启
/etc/init.d/DmhsService start