作为一个达梦的初学者,写这篇文章的目的是为了把学到的新知识做个总结梳理,在整理中查缺补漏,也希望大家看了我的文章能有收获,如有错误的地方欢迎指出。

数据同步工具 (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

mysql 数据迁移达梦数据库 达梦数据库数据同步_数据

然后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