系列文章目录
文章目录
- 系列文章目录
- 前言
- 环境
- 一、DMHS的安装 (命令行)
- 1、安装文件准备
- 2、修改可执行文件后执行安装程序
- 二、DM8数据库准备工作
- 1、开启归档日志
- 2、开启逻辑日志
- 3、配置 DDL辅助表和触发器
- 4、创建供DMHS软件连接数据库的用户
- 5、准备测试模式、对象
- 三、DMHS双向同步配置
- 节点1 DMHS服务配置
- 节点2 DMHS服务配置
- 四、启动DMHS服务
- 1、启动两端节点的DMHS管理服务
- 2、在节点2的数据库上装载节点1数据库需要进行同步的对象数据
- 3、启动两端节点的CPT采集模块,实现双向同步、单向同步
- 1)节点1服务器执行,初始化远端exec和本地cpt字典
- 2)节点2服务器执行,初始化远端exec和本地cpt字典
- 3)节点1执行,启动本地cpt模块
- 4)节点2执行,启动本地cpt模块
- 五、检查同步效果
- 1、数据简单对比
- 2、在节点1数据库对模式OA11的对象进行DML操作
- 3、在节点2数据库对模式OA12的对象进行DML操作
- 4、DDL同步验证
- 5、单向同步验证
- 正向验证
- 反向验证
- 总结
前言
某项目需要DM8数据库实现灾备,那么先在本地测试实现吧。本次模拟实验主要在本地两台虚拟机上,安装dm8数据库,并通过DMHS软件实现双向同步、单向同步,从而达到双活、灾备效果。(以下主要展开DMHS的安装和配置,dm8数据库的安装略过,可参考另一篇linux环境安装DM8的博文)
达梦数据实时同步软件(以下简称 DMHS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。基于成熟的关系数据模型和标准接口,支持多种软硬件平台,能够灵活的配置出一对一、一对多、多对一、多对多以及级联等多种形式的复制拓扑结构,可以广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发、多业务中心等业务领域。(来自达梦云适配中心-DMHS产品介绍)
环境
本次模拟环境:
dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1.iso
dmhs_V4.2.60_dm8_rev106302_rh6_64_veri_20220225.bin
(DMHS软件安装包可以联系达梦获取试用版)
主机 | 软件 | |
---|---|---|
源端单节点1 | 192.168.19.11(x86 centos7,1核2GB虚拟机) | dm8单机(已安装)dmhs_V4.2.60(待安装) |
目的端节点2(灾备库) | 192.168.19.12(x86 centos7,1核2GB虚拟机) | dm8单机(已安装)dmhs_V4.2.60(待安装) |
以下简称节点1,节点2
一、DMHS的安装 (命令行)
以下内容两个节点都需要执行
1、安装文件准备
通过工具上传DMHS安装包到虚拟机上,使用dmdba用户(在安装dm8数据库时按规范建立的系统用户,如果没有建议单独建立这一个用户用于达梦软件运行)进行安装。
2、修改可执行文件后执行安装程序
chmod +x dmhs_V4.2.60_dm8_rev106302_rh6_64_veri_20220225.bin
./dmhs_V4.2.60_dm8_rev106302_rh6_64_veri_20220225.bin -i
按照提示,选择对应安装项,因为配置需要,没有选择初始化DMHS配置,选择了统一部署时手动配置。
此处为web管理平台的相关安装项,本次模拟暂不用到,默认配置和服务手动启动即可,预留下次使用
至此DMHS安装完成,我们环境安装路径为/home/dmdba/hsdm,源端虚机和目的端虚机环境都需要安装
二、DM8数据库准备工作
接下来要对DM8单机数据库进行一些参数配置,以便DMHS软件分析逻辑日志进行数据同步(两个节点都需要执行以下步骤)。
1、开启归档日志
使用SYSDBA连接登录数据库执行以下语句开启归档日志。其中DEST为归档日志存放目录,需要提前创建好,FILE_SIZE为单个归档文件大小,SPACE_LIMIT为归档目录日志目录大小限制(达到限制大小后自动删除历史归档日志文件):
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'TYPE = LOCAL,DEST = /dm/dmarch/HSDM,FILE_SIZE = 128,SPACE_LIMIT = 1024';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
select para_value from v$dm_ini where para_name in ('ARCH_INI');
检查参数值,以及到归档配置目录下查看,归档日志已经配置成功。
2、开启逻辑日志
使用SYSDBA连接登录数据库执行以下语句:
SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
select para_value from v$dm_ini where para_name in ('RLOG_APPEND_LOGIC');
执行后检查参数值为1,确认逻辑日志已开启。
3、配置 DDL辅助表和触发器
使用SYSDBA连接登录数据库执行DMHS安装目录下script子目录的“ddl_sql_dm8.sql”脚本。(如果使用disql工具执行,需要先执行set define off和set char_code utf8来设置关闭本地变量和设置字符集编码,然后使用"start /xx/"执行该脚本,如果是使用DM管理工具连接的数据库,可以直接复制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';
查询结果如下图,共9个辅助表,4个触发器。
4、创建供DMHS软件连接数据库的用户
使用SYSDBA连接数据库,执行以下语句创建用户(其中HSEXEC为用户名,双引号内为密码,这没有特别要求,只需要后面和配置文件对应上即可,需要注意授权该用户查询、写入其他用户的权限,这里为了方便直接给了DBA权限):
CREATE TABLESPACE HSEXEC DATAFILE '' size 128;
CREATE USER HSEXEC IDENTIFIED by "111111111" DEFAULT TABLESPACE HSEXEC DEFAULT INDEX TABLESPACE HSEXEC;
GRANT VTI TO HSEXEC;
GRANT PUBLIC TO HSEXEC;
GRANT RESOURCE TO HSEXEC;
GRANT DBA TO HSEXEC;
5、准备测试模式、对象
(这里补充一下测试数据的来源,因为看到讨论里有人问到,当然如果自己准备有测试数据,那么这里是可以跳过的,在后面配置项根据自己的模式对象修改里面的白名单和映射就可以了,测试用的模式、模式对象和数据其实在这次实验里是无关紧要的,你也可以用别的测试数据,只要我们最终验证同步成功就可以)
1、在达梦数据库软件安装目录dmdbms/tool目录下,有dbca(DM数据库配置助手),初始化实例的过程勾选示例库就会得到一份模拟测试数据(7个表对象和数据),后面第三大点结构图其实还用到一个T2022表,那其实是随手建的,随便写两个数据就可以了。
选择DMHR模式,右键导出成dmp文件,备用。
导入导出这里不再详细展开,可以参考这篇博文:
达梦数据库DM8-逻辑备份之导入导出
2、在节点1建立模式OA11,同时把DMHR模式的实例库数据导入,映射进来。(这里的节点1和节点2具体代表可以参考后面第三点的结构图,更清晰直观)
CREATE TABLESPACE OA11 DATAFILE '' size 128;
CREATE USER OA11 IDENTIFIED by "111111111" DEFAULT TABLESPACE OA11 DEFAULT INDEX TABLESPACE OA11;
GRANT VTI TO OA11;
GRANT PUBLIC TO OA11;
GRANT RESOURCE TO OA11;
GRANT DBA TO OA11;
3、在节点2建立模式OA12,OA13,不写入任何数据。
CREATE TABLESPACE OA12 DATAFILE '' size 128;
CREATE USER OA12 IDENTIFIED by "111111111" DEFAULT TABLESPACE OA12 DEFAULT INDEX TABLESPACE OA12;
GRANT VTI TO OA12;
GRANT PUBLIC TO OA12;
GRANT RESOURCE TO OA12;
GRANT DBA TO OA12;
CREATE TABLESPACE OA13 DATAFILE '' size 128;
CREATE USER OA13 IDENTIFIED by "111111111" DEFAULT TABLESPACE OA13 DEFAULT INDEX TABLESPACE OA13;
GRANT VTI TO OA13;
GRANT PUBLIC TO OA13;
GRANT RESOURCE TO OA13;
GRANT DBA TO OA13;
三、DMHS双向同步配置
以上准备工作完成后,可以开始DMHS的双向同步配置了。
首先我们先确定同步需求,本次模拟需求为某个项目下的需求简化而来:
节点1的DM8数据库存在模式OA11
节点2的DM8数据库存在模式OA12和OA13,暂时没有数据存放。
现在需要
1、把节点1 中OA11模式下的"DEPARTMENT"、“EMPLOYEE”、“JOB”、“JOB_HISTORY”、“LOCATION”、"REGION"表同步到节点2中OA12模式下,并实现实时双向同步,达到双活效果。
2、把节点1 中OA11模式下"T2022"表同步到节点2中OA13模式下,实时单向同步,达到灾备效果。
节点1 DMHS服务配置
进入到DMHS安装目录下bin子目录,通过修改示例服务脚本,准备当前节点的DMHS服务启动脚本
cd /home/dmdba/hsdm/bin
cp TemplateDmhsService DmhsService
vim DmhsService
在DMHS安装目录下的bin子目录,新建配置文件
cd /home/dmdba/hsdm/bin
vim
配置文件部分内容解读:
其中base模块是本地DMHS管理服务相关配置,需要注意的是siteid必须为唯一,需要和节点2的配置区分开来;
cpt模块则是本地数据采集服务相关配置
1)我们需要采集的是节点1的DM8数据库,所以前部分填写相关连接信息
2)其中ddl_mask配置项是DDL 操作功能掩码,理论上我们双向需要同步所有的DDL操作,所以这里掩码我们配置了所有对象
3)其中send配置项,则是同步到目的端的投递信息配置,该标签是一个功能标签,需要进一步配置它的子项,其中包括目的端DMHS服务的连接信息,以及对象选择配置项filter(支持白名单enable和黑名单disable),本次模拟为指定对象同步,所以配置了白名单,且因为需要同步的目的端模式和本地源端模式名不一样,配置了map映射规则,按需求把指定对象映射到目的端指定模式下。
exec模块则是本地数据接收和执行服务相关配置,相对于节点2来说,本地是节点2的目的端,需要对节点2的DMHS服务cpt模块收集并发送来的数据,执行同步到本地节点1的DM8数据库,因此主要为连接本地节点1的数据库信息,以及执行工作进程的相关配置。其中exec_policy=2表示执行事务出错时,忽略出错的操作后继续执行;ddl_continue=1表示DDL操作同步出错时,继续往下操作。
详细配置项信息说明可以查阅DMHS服务安装目录下doc子目录中的《DMHS参考手册.pdf》
----以下为配置文件具体内容----
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>11</siteid>
<version>2.0</version>
</base>
<cpt>
<name>cpt1911</name>
<db_type>dm8</db_type>
<db_server>192.168.19.11</db_server>
<db_user>HSEXEC</db_user>
<db_ssl_path/>
<db_ssl_pwd/>
<db_pwd>111111111</db_pwd>
<char_code>PG_UTF8</char_code>
<db_port>5239</db_port>
<ddl_mask>op:TABLE:VIEW:PROCEDURE:FUNCTION:TRIGGER:INDEX:CHECK:SEQUENCE:TYPE:PACKAGE:SYNONYM</ddl_mask>
<parse_thr>1</parse_thr>
<arch>
<clear_flag>1</clear_flag>
<clear_interval>600</clear_interval>
</arch>
<send>
<ip>192.168.19.12</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<trigger>1</trigger>
<constraint>1</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<filter>
<enable>
<item></item>
<item></item>
<item></item>
<item></item>
<item>OA11.JOB_HISTORY</item>
<item></item>
<item></item>
<item>OA11.T2022</item>
</enable>
</filter>
<map>
<item>==</item>
<item>==</item>
<item>==</item>
<item>==</item>
<item>OA11.JOB_HISTORY==OA12.JOB_HISTORY</item>
<item>==</item>
<item>==</item>
<item>OA11.T2022==OA13.T2022</item>
</map>
</send>
</cpt>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<enable>1</enable>
<name>exec1911</name>
<db_type>DM8</db_type>
<db_server>192.168.19.11</db_server>
<db_user>HSEXEC</db_user>
<db_pwd>111111111</db_pwd>
<db_port>5239</db_port>
<exec_thr>1</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
<save_mask>EXEC</save_mask>
<exec_policy>2</exec_policy>
<ddl_continue>1</ddl_continue>
</exec>
</dmhs>
节点2 DMHS服务配置
其中DMHS服务启动脚本DmhsService的配置和节点1配置过程相似,这里不再演示。
需要关注的是节点2的配置文件配置内容:
可以看到节点2的配置内容和节点1是类似的,只不过因为cpt模块的采集数据库连接信息和exec的数据库执行信息有差异,其中因为节点2只需要同步数据库中模式OA12的所有表到节点1数据库中的模式OA11,所以在map映射规则中直接使用了模糊匹配。
----以下为配置文件具体内容----
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>12</siteid>
<version>2.0</version>
</base>
<cpt>
<name>cpt1912</name>
<db_type>dm8</db_type>
<db_server>192.168.19.12</db_server>
<db_user>HSEXEC</db_user>
<db_ssl_path/>
<db_ssl_pwd/>
<db_pwd>111111111</db_pwd>
<char_code>PG_UTF8</char_code>
<db_port>5239</db_port>
<ddl_mask>op:TABLE:VIEW:PROCEDURE:FUNCTION:TRIGGER:INDEX:CHECK:SEQUENCE:TYPE:PACKAGE:SYNONYM</ddl_mask>
<parse_thr>1</parse_thr>
<arch>
<clear_flag>1</clear_flag>
<clear_interval>600</clear_interval>
</arch>
<send>
<ip>192.168.19.11</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<trigger>1</trigger>
<constraint>1</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<filter>
<enable>
<item></item>
<item></item>
<item></item>
<item></item>
<item>OA12.JOB_HISTORY</item>
<item></item>
<item></item>
</enable>
</filter>
<map>
<item>OA12.*==OA11.*</item>
</map>
</send>
</cpt>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<enable>1</enable>
<name>exec1912</name>
<db_type>DM8</db_type>
<db_server>192.168.19.12</db_server>
<db_user>HSEXEC</db_user>
<db_pwd>111111111</db_pwd>
<db_port>5239</db_port>
<exec_thr>1</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
<save_mask>EXEC</save_mask>
<exec_policy>2</exec_policy>
<ddl_continue>1</ddl_continue>
</exec>
</dmhs>
四、启动DMHS服务
1、启动两端节点的DMHS管理服务
节点1,进入DMHS软件安装目录下bin子目录,执行配置好的服务脚本
cd /home/dmdba/hsdm/bin
./DmhsService start
ps -ef |grep dmhs
如图DMHS管理服务正常启动成功,可以使用ps命令查看到服务,且在hsdm/log底下的服务启动日志没有报错信息。(如果服务启动失败,或根据日志报错信息检查服务脚本中的配置,以及依赖环境配置,即“节点1 DMHS服务配置”章节中介绍的内容)
节点2同理,进入DMHS软件安装目录下bin子目录,执行配置好的服务脚本
cd /home/dmdba/hsdm/bin
./DmhsService start
ps -ef |grep dmhs
2、在节点2的数据库上装载节点1数据库需要进行同步的对象数据
双向同步是在两端数据保持一致的基础上进行的,当前节点2的数据库上模式OA12和模式OA13没有任何数据,需要先把节点1上的数据进行一次装载到节点2数据库上。
节点1数据库模式OA11数据:
节点2数据库模式OA12、OA13数据:
节点2服务器执行,进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,并启动节点2本地的exec模块:
cd /home/dmdba/hsdm/bin
./dmhs_cosole
DMHS> start exec
节点1服务器执行,进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,启动节点1本地的exec模块,并初始化本地采集服务cpt的字典,最后对节点2目的端数据库进行一次同步数据装载:(操作过程建议在两边节点服务器上,实时打印位于bin/log底下的dmhs_日期.log日志,以便随时发现错误)
cd /home/dmdba/hsdm/bin
./dmhs_cosole
DMHS> start exec
DMHS> clear exec lsn
DMHS> copy 0 " = 'OA11'" CLEAR|DICT
DMHS> copy 0 " = 'OA11'" drop|create|insert|nolock|fast
执行完成后,检查节点2数据库的模式OA12、OA13,数据已成功装载过来。
检查两边节点的日志,也没有发现同步错误提示,drop table提示不存在的错误可忽略。
节点1 DMHS日志
节点2 DMHS日志
3、启动两端节点的CPT采集模块,实现双向同步、单向同步
以下需要按顺序执行(操作过程建议在两边节点服务器上,实时打印位于bin/log底下的dmhs_日期.log日志,以便随时发现错误)
1)节点1服务器执行,初始化远端exec和本地cpt字典
进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,初始化目的端exec模块,初始化本地cpt采集模块的字典。
cd /home/dmdba/hsdm/bin
./dmhs_cosole
DMHS> clear exec lsn
DMHS> copy 0 " = 'OA11'" CLEAR|DICT
2)节点2服务器执行,初始化远端exec和本地cpt字典
进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,初始化目的端exec模块,初始化本地cpt采集模块的字典。
cd /home/dmdba/hsdm/bin
./dmhs_cosole
DMHS> clear exec lsn
DMHS> copy 0 " = 'OA12'" CLEAR|DICT
3)节点1执行,启动本地cpt模块
进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,初始化目的端exec模块,初始化本地cpt采集模块的字典。
DMHS> start cpt
DMHS> state
4)节点2执行,启动本地cpt模块
进入DMHS软件安装目录bin子目录,使用dmhs_cosole工具连接DMHS管理服务,初始化目的端exec模块,初始化本地cpt采集模块的字典。
DMHS> start cpt
DMHS> state
检查两端日志,没有发现任何报错提示:
节点1 DMHS日志
节点2 DMHS日志
五、检查同步效果
1、数据简单对比
节点1数据库模式OA11的对象数据行数统计
create table count_all_tables(tab_owner varchar(100),tab_name varchar(100),tab_count int);
declare
begin
for rec in (select owner,object_name from all_objects where owner in ('OA11') and object_type='TABLE') loop
begin
execute immediate 'insert into count_all_tables select '''|| ||''','''|| rec.object_name ||''',count(*) from '|| || '."' || rec.object_name||'"';
exception when others then
dbms_output.put_line( || '.' || rec.object_name || 'get count error');
end;
end loop;
end;
select tab_owner,tab_name,tab_count from count_all_tables where TAB_OWNER='OA11' order by 3 desc;
节点2数据库模式OA12、OA13的对象数据行数统计
create table count_all_tables(tab_owner varchar(100),tab_name varchar(100),tab_count int);
declare
begin
for rec in (select owner,object_name from all_objects where owner in ('OA13','OA12') and object_type='TABLE') loop
begin
execute immediate 'insert into count_all_tables select '''|| ||''','''|| rec.object_name ||''',count(*) from '|| || '."' || rec.object_name||'"';
exception when others then
dbms_output.put_line( || '.' || rec.object_name || 'get count error');
end;
end loop;
end;
select tab_owner,tab_name,tab_count from count_all_tables where TAB_OWNER in ('OA13','OA12') order by 3 desc;
两边数据一致
2、在节点1数据库对模式OA11的对象进行DML操作
节点1 update、insert操作执行前查询
节点1 update、insert操作执行后查询
节点1 update、insert操作执行后,节点2查询,可以看到节点1的修改已完全同步到节点2:
检查两端DMHS日志无错误提示
节点1 DMHS日志
节点2 DMHS日志
3、在节点2数据库对模式OA12的对象进行DML操作
节点2 delete 操作执行前查询
节点2 delete 操作执行后查询
节点2 delete 操作执行后,节点1查询,可以看到节点2的修改已完全同步到节点1:
4、DDL同步验证
节点1数据库执行drop后查询
节点1数据库执行drop后,节点2数据库查询,可以看到DDL操作也成功同步。
检查两端日志无报错提示
节点1 DMHS日志
节点2 DMHS日志
5、单向同步验证
本次模拟实验的需求中,需要把节点1数据库的模式OA11中T2022表,单向同步到节点2数据库的模式OA13中。在此验证这单向同步需求。
正向验证
节点1 update操作前,查询T2022表
节点1 update操作后,查询T2022表
节点1 update操作后,节点2查询T2022表,数据已成同步
反向验证
节点2 update操作前,查询T2022表
节点2 update操作后,查询T2022表
节点2 update操作后,节点1查询T2022表,可以看到数据没有同步,符合配置预期效果。