一、DMDRS介绍


1.1产品介绍

达梦数据实时同步软件(以下简称 DMDRS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影响,能以极少的系统开销实现秒级数据实时同步复制。

DMDRS基于成熟的关系数据模型和标准接口,支持多种软硬件平台,能够灵活的配置出一对一、一对多、多对一、多对多以及级联等多种形式的复制拓扑结构,可以广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发、多业务中心等业务领域。

DMDRS数据实时同步​软件安装部署_ci


DMDRS原理

DMDRS数据实时同步​软件安装部署_数据库_02

DMDRS的组成原理框图中包含源端数据库、目标端数据库、源端DMDRS服务以及目标端 DMDRS 服务,其中源端DMDRS服务主要由装载模块(LOAD)、日志捕获分析模块(CPT)、传输模块(NET)以及管理服务模块(MGR)组成;

目标端DMDRS服务则由执行模块(EXEC)和管理服务模块(MGR)组成。

在源端DMDRS的CPT模块采用优化的日志扫描算法实现增量日志数据的快速捕获分析,并将分析完成后的日志数据转换为内部的消息格式,然后通过网络将消息发送至目标端DMDRS服务;

在目标端DMDRS服务接收到源端的日志消息后,对消息进行处理,通过多线程并行执行的方式将同步数据应用至目标端数据库,实现数据实时同步。


模块介绍

DMDRS 同步服务主要包括四个模块,分别是捕获模块(CPT)、装载模块(LOAD)、传输模块(NET)以及执行模块(EXEC),这些模块统一由管理模块(MGR)进行管理执行。

DMDRS数据实时同步​软件安装部署_sql_03

管理模块(MGR):MGR模块可以解析配置参数,根据配置参数启动DMDRS的捕获器功能、执行器功能、转发器功能或路由功能。当MGR启动捕获器功能时,MGR会调度CPT模块和NET模块(发送子模块);当启动执行器功能时,会调度NET模块(接收子模块)和EXEC模块;当启动转发器或路由器功能时,会调度NET模块(接收子模块和发送子模块)。

DMDRS数据实时同步​软件安装部署_数据库_04

捕获模块(CPT)对源数据库增量日志进行捕获并完成解析,结合数据字典信息提取其中数据的变化如插入(INSERT)、删除(DELETE)、修改(UPDATE)和对象操作(DDL),然后将这些操作及数据转换为内部的消息格式投递给网络(NET)模块。

装载模块(LOAD)DMDRS 在进行增量数据同步之前,需完成同步表的字典装载和表数据的初始装载。表字典装载将所有同步表的数据字典信息从源库中抽取出来,保存为本地的数据字典文件,用于数据同步过程中提供准确表定义信息。数据初始装载用于将源端数据库的初始数据同步至目标数据库,使得源库和目标库的初始数据保持一致。

传输模块(NET)传输模块NET应用于捕获器CPT、路由器ROUTE、转发器 TRANSFER、执行器 EXEC,分为接收子模块(RECV)与发送子模块(SEND),在同步中承担节点之间数据的收发任务。

1) 日志捕获 CPT 模块需要通过 NET 模块来发送数据。

2) EXEC 模块则需要通过 NET 模块接收数据。

3) ROUTE 通过 NET 模块进行消息转发。

4) TRANSFER 通过 NET 模块进行消息转发。

同步链路中多对一、一对多和多对多的数据传输都是通过 NET 模块来实现的。RECV子模块与 SEND 子模块在 DMDRS 配置文件中的位置如下所示:

DMDRS数据实时同步​软件安装部署_数据库_05

执行模块(EXEC):模块主要的功能是对 CPT 捕获的增量数据进行入库,它目前采用符合 SQL92 标准的 SQL 语句,通过 ODBC 接口和目标端数据库交互(在初始化装载时如果选择快装功能,它需要加载快装模块,快装模块使用了 OCI 接口),所以它可以部署在能够和目标端数据库连通的任意一个节点上。在整个同步链路中,EXEC 模块对整个同步的性能起着决定性的作用,需要根据相应的同步场景配置好 EXEC 模块参数,方可达到最优的同步性能。


二、DMDRS安装部署


2.1DMDRS部署规划

节点

操作系统

IP地址

数据库类型

源端

Centos 6.4

192.168.0.10

DM8单机(已安装)

目标端

Centos 6.4

192.168.0.11

DM8单机(已安装)


2.2DMDRS的安装

  1. 安装文件准备源端和目标端都要安装DMDRS,上传DMDRS的安装包到/opt目录,使用dmdba用户进行安装包:dmhs_V4.3.28_dm8_rev153239_rh6_64_20240301_sp8.bin[root@DM01 opt]# ll
    总用量
    -rw-r--r-- 1 root root 492294786 4月 25 14:12 dmhs_V4.3.28_dm8_rev153239_rh6_64_20240301_sp8.bin
  2. 修改可执行文件后执行安装程序

[root@DM01 opt]# chmod +x dmhs_V4.3.28_dm8_rev153239_rh6_64_20240301_sp8.bin

##切换到dmdba用户下

[dmdba@DM01 opt]$ ./dmhs_V4.3.28_dm8_rev153239_rh6_64_20240301_sp8.bin -i

DMDRS数据实时同步​软件安装部署_ci_06

DMDRS数据实时同步​软件安装部署_sql_07

DMDRS数据实时同步​软件安装部署_ci_08

DMDRS数据实时同步​软件安装部署_sql_09

至此DMHS安装完成,我们环境安装路径为/dm/dmdbms/dmhs,源端虚机和目的端虚机环境都需要安装

DMDRS数据实时同步​软件安装部署_sql_10


2.3安装ODBC(两台主机)

root用户执行以下安装命令

yum -y install unixODBC

odbcinst -j #查看配置文件路径

DMDRS数据实时同步​软件安装部署_数据库_11

修改这两个配置文件,添加下列内容:

vi /etc/odbcinst.ini

[DM8 ODBC DRIVER]

Description = ODBC DRIVER FOR DM8

Driver = /dm/dmdbms/bin/libdodbc.so

DMDRS数据实时同步​软件安装部署_sql_12


vi /etc/odbc.ini

[DM8]

Description = DM ODBC DSN

Driver = DM8 ODBC DRIVER

SERVER = localhost

UID = SYSDBA

PWD = SYSDBA

TCP_PORT = 5237

DMDRS数据实时同步​软件安装部署_数据库_13

测试连接,使用dmdba用户执行isql测试连接是否正常

isql dm8 -v

DMDRS数据实时同步​软件安装部署_数据库_14


三、数据库准备工作

接下来要对DM8单机数据库进行一些参数配置,以便DMHS软件分析逻辑日志进行数据同步(两个节点都需要执行以下步骤)


3.1开启归档模式

disql SYSDBA/SYSDBA:5237 #连接数据库

ALTER DATABASE MOUNT;

ALTER DATABASE ADD ARCHIVELOG 'DEST=/dm/dmarch,TYPE=LOCAL,FILE_SIZE=1024,SPACE_LIMIT=0';

ALTER DATABASE ARCHIVELOG;

ALTER DATABASE OPEN;

select para_value from v$dm_ini where para_name in ('ARCH_INI');

DMDRS数据实时同步​软件安装部署_数据库_15


3.2开启逻辑日志

SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);

select para_value from v$dm_ini where para_name in ('RLOG_APPEND_LOGIC');

DMDRS数据实时同步​软件安装部署_ci_16


3.3配置DDL辅助表和触发器

使用SYSDBA连接登录数据库执行DMHS安装目录下script子目录的“ddl_sql_dm8.sql”脚本。(如果使用disql工具执行,需要先执行set define off和set char_code utf8来设置关闭本地变量和设置字符集编码,然后使用"start /xx/xx.sql"执行该脚本,如果是使用DM管理工具连接的数据库,可以直接复制SQL脚本内容到查询框执行即可)

DMDRS数据实时同步​软件安装部署_ci_17

SQL> set define off

SQL> set char_code utf8

SQL> start /dm/dmdbms/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';

DMDRS数据实时同步​软件安装部署_sql_18

执行以下SQL语句查询触发器是否创建成功

select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y';

DMDRS数据实时同步​软件安装部署_数据库_19

查询结果如上图所示,共9张辅助表,4个触发器


四、配置源端和目的端

4.1目标端配置

在DMHS安装目录下的bin子目录,新建dmhs.hs配置文件

cd /dm/dmdbms/dmhs/bin

vi dmhs.hs

[dmdba@DM02 bin]$ cat dmhs.hs

<?xml versinotallow="1.0" encoding="GB2312"?>

<dmhs>

<base> <!-- 管理模块的基本配置 -->

<lang>en</lang> <!-- 语言选项,ch 为中文,en 为英文 -->

<mgr_port>5345</mgr_port> <!-- 管理端口号,默认为5345-->

<ckpt_interval>60</ckpt_interval> <!-- 检查点间隔,默认60 -->

<siteid>2</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->

<version>2.0</version>

</base>

<exec> <!-- 执行模块的基本配置 -->

<recv>

<data_port>5346</data_port> <!-- 当数据传递采用网络直连时,需要配置该参数,表明同步数据从该端口号获取。 -->

</recv>

<db_type>dm8</db_type> <!-- 目标端数据库类型 -->

<db_server>192.168.0.11</db_server> <!-- 目标端数据库服务名或IP -->

<db_user>SYSDBA</db_user> <!-- 目标端数据库用户 -->

<db_pwd>SYSDBA</db_pwd> <!-- 用户的密码 -->

<db_port>5237</db_port> <!-- 目标端数据库端口 -->

<db_name>DMDB</db_name> <!-- 默认数据库名,默认为空串(只针对dm6有用)-->

<char_code>PG_GB18030</char_code>

<exec_thr>4</exec_thr> <!-- 执行线程个数,只有当 exec_mode 为 1 时才会生效!默认为1 -->

<exec_sql>1024</exec_sql> <!-- SQL 缓存大小,默认为 512M -->

<exec_trx> 5000 </exec_trx> <!-- 事务缓存个数,默认为 5000 -->

<exec_rows>1000</exec_rows> <!-- 批量绑定行数,默认为 250 -->

</exec>

</dmhs>


启动目的端

./dmhs_server dmhs.hs

start exec

执行start exec报错

MGR[ERROR]: lib libdmhs_exec.so can not found,error code 2, libdmoci.so: cannot open shared object file: No such file or directory

DMDRS数据实时同步​软件安装部署_sql_20

退出DMHS,输入ldd libdmhs_exec.so,发现有文件出现not found的现象;

DMDRS数据实时同步​软件安装部署_数据库_21

切换至root用户,查找文件

[root@DM02 ~]# find / -name libdmoci.so

/dm/dmdbms/dmhs/bin/stat/libdmoci.so

/dm/dmdbms/dmhs/hs_agent/libdmoci.so

/dm/dmdbms/dmhs/db/bin/libdmoci.so

把not found的文件libdmoci.so复制到安装DMHS的bin目录下

[root@DM02 ~]# cp -r /dm/dmdbms/dmhs/db/bin/libdmoci.so /dm/dmdbms/dmhs/bin

赋予文件权限(root用户下执行),问题解决

[root@DM02 bin]# chown dmdba:dinstall /dm/dmdbms/dmhs/bin/libdmoci.so

重新启动目的端

./dmhs_server dmhs.hs

start exec

DMDRS数据实时同步​软件安装部署_ci_22


4.2源端配置

在DMHS安装目录下的bin子目录,新建dmhs.hs配置文件

cd /dm/dmdbms/dmhs/bin

vi dmhs.hs

<?xml versinotallow="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>

</base>

<cpt>

<db_type>dm8</db_type>

<db_server>192.168.0.10</db_server>

<db_user>SYSDBA</db_user>

<db_pwd>SYSDBA</db_pwd>

<db_port>5237</db_port>

<db_ssl_path></db_ssl_path>

<db_ssl_pwd></db_ssl_pwd>

<parse_thr>1</parse_thr>

<ddl_mask>op:obj:TABLESPACE</ddl_mask> <!--DDL 配置项-->

<arch><!--归档清理配置项-->

<clear_interval>600</clear_interval>

<clear_flag>0</clear_flag>

</arch>

<send><!-- 发送模块配置 -->

<ip>192.168.0.11</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>

</filter>

<map><!--映射配置项-->

<item>SYSDBA.*==SYSDBA.*</item>

</map>

</send>

</cpt>

</dmhs>


启动源端之前创建测试表

create table a(

id int,

name varchar(255)

);

insert into a values(1,'john');

commit;

启动源端(bin目录下):

这个时候我们又遇到以下报错

MGR[ERROR]: lib libcpt_dm8.so can not found,error code 2, errmsg:libdmoci.so: cannot open shared object file: No such file or directory

DMDRS数据实时同步​软件安装部署_sql_23

判断错误原因:缺少libdmoci.so

输入ldd libdmhs_exec.so,发现有文件出现not found的现象

DMDRS数据实时同步​软件安装部署_数据库_24

切换至root用户,查找文件

[root@DM02 ~]# find / -name libdmoci.so

/dm/dmdbms/dmhs/bin/stat/libdmoci.so

/dm/dmdbms/dmhs/hs_agent/libdmoci.so

/dm/dmdbms/dmhs/db/bin/libdmoci.so

把not found的文件libdmoci.so复制到安装DMHS的bin目录下

[root@DM02 ~]# cp -r /dm/dmdbms/dmhs/db/bin/libdmoci.so /dm/dmdbms/dmhs/bin

赋予文件权限(root用户下执行),问题解决

[root@DM02 bin]# chown dmdba:dinstall /dm/dmdbms/dmhs/bin/libdmoci.so


重新启动源端

./dmhs_server dmhs.hs

clear exec lsn #为了初始化日志的起始位置。

copy 0 "sch.name='SYSDBA'" DICT|LSN|CREATE|INSERT|INDEX #装载数据,配置同步掩码--一次就行

start cpt

DMDRS数据实时同步​软件安装部署_sql_25

DMDRS数据实时同步​软件安装部署_ci_26

DMDRS数据实时同步​软件安装部署_sql_27

DMDRS数据实时同步​软件安装部署_ci_28

目标端查看:

DMDRS数据实时同步​软件安装部署_数据库_29


五、附录


5.1全库抽取测试

修改源端配置文件

vi /dm/dmdbms/dmhs/bin/dmhs.hs

<map><!--映射配置项-->

<item>*.*==*.*</item><!--*.*是抽取整个库-->

</map>


5.2 schema抽取测试

vi /dm/dmdbms/dmhs/bin/dmhs.hs

<map><!--映射配置项-->

<item>FMS.*==FMS.*</item><!—用户名.*-->

</map>


5.3 表空间抽取测试

vi /dm/dmdbms/dmhs/bin/dmhs.hs

<map><!--映射配置项-->

<item>TS.OMPDB==TS.FMSDB</item><!--源端表空间OMPDB映射到目的端FMSDB表空间-->

</map>


5.4 指定表抽取测试

vi /dm/dmdbms/dmhs/bin/dmhs.hs

<map><!--映射配置项-->

<item>DWD.YEAR_2001==DWD.YEAR_2001</item><!—用户.表名-->

<item>DWD.YEAR_2002==DWD.YEAR_2002</item><!—用户.表名-->

<item>DWD.YEAR_2003==DWD.YEAR_2003</item><!—用户.表名-->

达梦社区: https://eco.dameng.com