注册
Oracle RAC 11g基于DMHS双向同步
技术分享/ 文章详情 /

Oracle RAC 11g基于DMHS双向同步

丁丁 2023/03/26 1235 1 0

Oracle RAC 11g基于DMHS双向同步

1 环境描述

A环境:两节点Oracle RAC版本 11.2.4.0

#pulib
192.168.1.115 rac1
192.168.1.116 rac2
#private
10.0.0.115  rac1-priv
10.0.0.116  rac2-priv
#virtual
192.168.1.117 rac1-vip
192.168.1.118 rac2-vip
#scan
192.168.1.119 rac-scan

image.png
B环境:两节点Oracle RAC版本 11.2.4.0

#public
192.168.1.228 racdb1
192.168.1.229 racdb2
#vip
192.168.1.60  racdb1-vip
192.168.1.61  racdb2-vip
#priv
10.0.0.228  racdb1-priv
10.0.0.229  racdb2-priv
#scan
192.168.1.62 racdb-scan

image.png

2 DMHS 同步软件部署实施

2.1 DMHS ORACLE RAC安装

2.1.1 设置ORACLE 本地链接库路径

DMHS在运行时,需要加载本地ORACLE 动态库libclntsh.so。在部署DMHS 之前,需将libclnsh.so所在目录添加到共享库路径变量中。libclntsh.so通常位于$ORACLE_HOME/lib中。

image.png
在LINUX/UNIX系统中,设置的方法如下:
image.png

2.1.2 A端B端ORACLE RAC 环境准备

DMHS支持源端为ORACLE RAC的数据库,DMHS安装部署在RAC的两个节点上,避免某一个节点异常或故障导致DMHS无法继续同步。
根据RAC存储使用的不同,需进行其他额外的配置:

  1. ASM存储
    当RAC文件存放在ASM中时,DMHS的部署节点必须配置ASM服务监听,可直接修改$ORACLE_HOME\network\admin\tnsname.ora文件,添加ASM监听。配置方法示例如下:
ASM =
(
DESCRIPTION =
(ADDRESS =(PROTOCOL=TCP) (HOST = 192.168.1.115) (PORT=1521))
      (CONNECT_DATA =(SERVER =DEDICATED)(SERVICE_NAME=+ASM))
)

如下:A端
image.png
B端:
image.png

2.1.3 DMHS安装

A端B端共4个节点均安装DMHS for oracle 11g同步工具

[oracle@racdb2~]$chmod +x dmhs_V4.3.00_oracle11g_rev119281_rh6_64_veri_20221124_sp5.bin 
[oracle@racdb2 ~]$ ./dmhs_V4.3.00_oracle11g_rev119281_rh6_64_veri_20221124_sp5.bin -i
Extract install files..........

1.英文(English)
2.简体中文(简体中文)
请选择安装语言[2.简体中文(简体中文)]:
/tmp/DMHSInstall/install.log
1.免费试用达梦数据实时同步
2.使用已申请的Key文件
验证许可证文件[1.免费试用达梦数据实时同步]:
1.精简版
2.完整版(web客户端)
3.自定义
安装类型[1.精简版]:
1.实时同步软件服务器
2.远程部署工具
3.实时同步软件配置助手
4.手册
所需磁盘空间:542 MB
安装目录: [/home/oracle/dmhs]
1.统一部署
2.现在初始化
是否初始化达梦数据实时同步系统[1.统一部署]:
正在安装
default start ...    default finished.
server start ...    server finished.
hs_agent start ...    hs_agent finished.
hsca start ...    hsca finished.
doc start ...    doc finished.
postinstall start ...    postinstall finished.
正在创建快捷方式
安装成功

注意:
DMHS安装完成之后,搭建环境是RAC到RAC双向同步,需要检查4个节点的所有安装模块情况,目录切换到 DMHS软件目录,通过命令 ldd libcpt_ora.so(RAC可通过命令 ldd libcpt_rac.so),查看 DMHS日志CPT模块链接是否正常,通过命令ldd libdmhs_exec.so,查看DMHS日志执行模块链接是否正常。
所有RAC节点检查均如下图:
image.png
image.png

2.2 UNIXODBC安装

因为目的端是通过ODBC将源端数据库的操作同步到目的数据库,我们搭建环境双向同步所有部署DMHS ORACLE 目的端的服务器都需要安装ODBC驱动及ORACLE 动态链接库。

2.2.1 UNIXODBC 安装

达梦官方推荐安装unixodbc2.3.2版本的odbc。

1)	下载unixodbc2.3.2源码unixODBC-2.3.2.tar.gz。
2)	解压unixodbc源码
tar -zxvf unixODBC-2.3.2.tar.gz
3)	进入unixodbc源码目录,编译源码
cd unixodbc-2.3.2
export CC=gcc
./configure --enable-drivers=no --with-iconv-char-enc=GB18030 --enable-gui=no --enable-iconv=yes
make
make install

注意:
当服务器系统为UNIX/LINUX 64bits时,在./configure之前需执行
export CFLAGS=“-maix64 -DBUILD_REAL_64_BIT_MODE”
export OBJECT_MODE=64

4)	配置UNIXODBC
将操作系统当前目录切换到“/usr/local/etc”目录,修改 odbc.ini 和odbcinst.ini 参数。

A端odbc.ini 参数内容如下所示:
[ORACLE]
Description = ORACLE ODBC DSN
Driver = Oracle in OraDb11g_home1
SERVER = 192.168.1.119
UserID = ems
Password = ems
Servername = DM
PORT = 1521
odbcinst.ini参数内容如下所示:
[Oracle in OraDb11g_home1]
Description = ODBC DRIVER FOR ORACLE
Driver = /oracle/app/oracle/product/11.2.0/lib/libsqora.so.11.1
Threading = 0
B端odbc.ini 参数内容如下所示:
[ORACLE]
Description = ORACLE ODBC DSN
Driver = Oracle in OraDb11g_home1
SERVER = 192.168.1.62
UserID = ems
Password = ems
Servername = ORCL
PORT = 1521
odbcinst.ini参数内容如下所示:
[Oracle in OraDb11g_home1]
Description = ODBC DRIVER FOR ORACLE
Driver = /oracle/app/oracle/product/11.2.0/lib/libsqora.so.11.1
Threading = 0

验证:配置完成之后,可使用isql命令测试配置是否正确。
例如:isql -v ORACLE DMHS DMHS
A端测试:
image.png
B端测试:
image.png

3 ORACLE/RAC数据库环境设置

建议客户现场DBA配合下操作,或直接由数据库管理员操作。

3.1 A/B端数据库配置数据库服务网络服务名

DMHS 装载历史数据时,需要通过数据库网络服务名来抽取数据库的数据。配置ORACLE/RAC数据库的网络服务名可通过ORACLE NCA 工具进行配置,也可直接修改$ORACLE_HOME\network\admin\tnsname.ora文件。直接修改tnsname.ora创建数据库服务监听:

A端:
DM =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dm)
    )
  )

B端:
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = racdb-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

验证:
配置完成之后,可使用oracle客户端工具sqlplus测试配置是否正确。
例如: sqlplus dmhs/dmhs@ORCL
如果配置正确,则可成功登陆数据库

3.2 开启A/B端数据库的归档及附加日志

DMHS通过分析ORACLE 数据库的归档/在线日志来捕获数据库的增量数据,DMHS运行之前,必须将数据库设置为归档模式,同时开启最小附加日志及全列日志。修改数据库为归档模式需重启数据库服务,在操作只需,需确认工作环境能停机维护。具体操作过程如下:修改数据库归档模式。如果数据库已经为归档模式,则跳过本步骤。
a) sqlplus 登录到源端数据库
b) 关闭数据库服务:srvctl stop database –d dm
c) 以mount方式启动ORACLE 数据库服务: startup mount;
d) 开启数据库归档,并设置归档文件路径:
alter system set log_archive_format =‘arch%t_%s_%r’ scope=spfile;
alter system set log_archive_dest_1=‘location=+DATA’;
alter database archivelog;
e) 将数据库切换到正常的工作状态,打开数据库: alter database open;

  1. 开启数据库最小附加日志及全列日志。
    image.png
    如果日志已开启,则跳过本步骤:
    alter database add supplemental log data;
    alter database add supplemental log data (ALL) columns;
    –补充日志记录的权限,需要在开启数据库允许REPLICATION的参数。
    ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION = TRUE SCOPE=BOTH;

3.3 设置A/B端ORACLE客户端字符集

当数据库数据包含中文字符时,需将DMHS运作所在窗口的NLS_LANG设置为对应的字符集,建议使用AMERICAN_AMERICA.ZHS16GBK。
LINUX平台设置客户端字符集:

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

3.4 A/B端配置DDL 支持

DMHS支持源端DDL的同步。源端DDL同步必须满足一下三个条件:

  1. 源端数据库必须允许DDL触发器的触发动作,即数据库参数_system_trig_enabled为TRUE或者未设置。查看该参数的命令如下:
    image.png
  2. 需要在源端数据库以sys用户,在sys模式下创建DDL触发器及DDL记录表,详细参照dmhs_ddl.sql脚本。
    image.png
  3. 需要日志捕获模块对ddl_mask进行设置。例如<ddl_mask>op:obj<ddl_mask>。ddl_mask可对同步对象进行过滤,详细参数请参照ddl_mask参数说明。
    A端配置:
    image.png
    B端配置:
    image.png

3.5 DMHS数据库用户

DMHS源端数据库用户,必须具有以下数据库操作权限:

SELECT ON SYS.V_$DATABASE 
SELECT ON SYS.V_$SESSION 
SELECT ON SYS.GV_$PARAMETER 
SELECT ON SYS.GV_$INSTANCE 
SELECT ON SYS.GV_$ARCHIVE_DEST 
SELECT ON SYS.GV_$ARCHIVE 
SELECT ON SYS.GV_$LOG 
SELECT ON SYS.GV_$LOGFILE 
SELECT ON SYS.DBA_TABLES 
SELECT ON SYS.V_$INSTANCE 
SELECT ON SYS.OBJ$ 
SELECT ON SYS.USER$ 
SELECT ON SYS.COL$ 
SELECT ON SYS.DBA_CONS_COLUMNS 
SELECT ON SYS.DBA_CONSTRAINTS 
SELECT ON SYS.LOB$  
SELECT ON SYS.TABPART$ 
SELECT ON SYS.TAB$ 
SELECT ON SYS.TABSUBPART$ 
SELECT ON SYS.TABCOMPART$ 
EXECUTE ON DBMS_FLASHBACK 
LOCK ANY TABLE 
SELECT ANY TABLE

DMHS执行端数据库用户必须具有同步对象的操作权限及操作用户下建表的权限。

4 配置启动ORACLE RAC双向数据同步

4.1 方案1 数据量较小

  1. RAC所有节点启动日志执行模块,控制台管理工具中执行如下DMHS命令:
[oracle@rac1 bin]$ ./dmhs_server
start exec
[oracle@rac2 bin]$ ./dmhs_server
start exec 
[oracle@racdb1 ~]$ ./dmhs_server
start exec
[oracle@racdb2 ~]$ ./dmhs_server
start exec

A端两节点中任意节点的控制台管理工具中执行如下DMHS命令:

clear exec  lsn  0
copy 0 "sch.name='EMS'" CREATE|INSERT|INDEX|DICT|REG|LSN

B端两节点中任意节点的控制台管理工具中执行如下DMHS命令:

COPY 0 "sch.name='EMS'" DICT|LSN

A端两节点的控制台管理工具中执行如下DMHS命令:

start cpt

B端两节点的控制台管理工具中执行如下DMHS命令:

start cpt

A端模拟数据:
image.png
B端检查:
image.png

B端模拟数据清理:
image.png
A端检查:
image.png

4.2 方案2 数据量较大

  1. RAC所有节点启动日志执行模块,控制台管理工具中执行如下DMHS命令:
 [oracle@rac1 bin]$ ./dmhs_server
start exec
[oracle@rac2 bin]$ ./dmhs_server
start exec 
[oracle@racdb1 ~]$ ./dmhs_server
start exec
[oracle@racdb2 ~]$ ./dmhs_server
start exec

A端两节点中任意节点查询数据库当前SCN号:

SQL> select current_scn from v$database;
CURRENT_SCN
-----------
7466673
SQL> col DIRECTORY_PATH for a50
SQL> select * from dba_directories;create directory ems as '/home/oracle';
SQL>create directory ems as '/home/oracle';
[oracle@rac1 ~]$ expdp ems/ems DIRECTORY=ems DUMPFILE=ems.dmp LOGFILE=ems.log  FLASHBACK_SCN=7466673

image.png
B端两节点中任意节点进行数据灌入:

在导入前,如果系统有job,先把目标库的:job_queue_processes设置成0
SQL>alter system set job_queue_processes=0 spfile=scope;
[oracle@racdb2 ~]$ impdp ems/ems DIRECTORY=ems DUMPFILE=ems.dmp LOGFILE=ems.log  cluster=no transform=segment_attributes:n table_exists_action=replace
Import: Release 11.2.0.4.0 - Production on Wed Mar 22 20:18:34 2023
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Master table "EMS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "EMS"."SYS_IMPORT_FULL_01":  ems/******** DIRECTORY=ems DUMPFILE=ems.dmp LOGFILE=ems.log cluster=no transform=segment_attributes:n table_exists_action=replace 
Processing object type SCHEMA_EXPORT/USER
ORA-31684: Object type USER:"EMS" already exists
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "EMS"."DM3"                                 33.45 MB  345272 rows
. . imported "EMS"."DM4"                                 33.45 MB  345272 rows
. . imported "EMS"."DM1"                                 8.370 MB   86323 rows
. . imported "EMS"."DM2"                                 8.370 MB   86318 rows
. . imported "EMS"."TEST2"                               8.640 KB     100 rows
. . imported "EMS"."DMHS_CHECKPOINT_TABLE"               6.382 KB       1 rows
. . imported "EMS"."DMHS_DTYPE_MAP"                      13.47 KB     192 rows
. . imported "EMS"."DMHS_ERROR_TSK_TABLE"                8.710 KB       1 rows
. . imported "EMS"."DMHS_TRXID_TABLE"                    8.929 KB       0 rows
. . imported "EMS"."TEST1"                               6.187 KB       0 rows
. . imported "EMS"."TEST3"                               6.187 KB       0 rows
. . imported "EMS"."DM5"                                     0 KB       0 rows
. . imported "EMS"."DMHS_DPC_SYNC_TABLE"                     0 KB       0 rows
. . imported "EMS"."DMHS_ERROR_TABLE"                        0 KB       0 rows
. . imported "EMS"."DMHS_GROUP_FOR_2"                        0 KB       0 rows
. . imported "EMS"."DMHS_TABLE_SEQID"                        0 KB       0 rows
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "EMS"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Wed Mar 22 20:19:09 2023 elapsed 0 00:00:24

A端指定SCN配置文件启动,dmhs.conf 文件添加如下:
cpt_start_lsn=(7466673)
A端任意节点执行:

copy 0 "sch.name='EMS'" DICT|REG|LSN

B端任意节点执行:

COPY 0 "sch.name='EMS'" DICT|LSN

A端两节点的控制台管理工具中执行如下DMHS命令:

start cpt

B端两节点的控制台管理工具中执行如下DMHS命令:

start cpt

5 断点续传

5.1 停止A端两节点的dmhs服务

节点1:
image.png
节点2:
image.png

5.2 A端模拟增量数据

image.png

5.3 清理A端RAC数据库所有归档日志,模拟归档丢失

image.png

5.4 查询当前SCN指定A端dmhs.config配置

image.png

#vi dmhs.config
cpt_start_lsn=(9892262)

5.5 启动当前A端本节点的dmhs服务端

image.png

5.6 启动当前A端另一节点的dmhs服务端

image.png

5.7 查看B端数据同步情况

image.png

5.8 B端清空test1表后,插入数据同步情况

image.png

5.9 A端查看TEST1表同步情况

image.png

6 问题汇总

问题1:
EXE[ERROR]: SITEID:0 SEQID:0 TRXID:0 LAST ROWID:NULL SQL_ERROR = SQL:select 1 AS RS from v$instance where status<>‘OPEN’
EXE[WARN]: SITEID:0 SEQID:0 TRXID:0 STATE:42S02 CODE: 942 ROWID:NULL ERR:[Oracle][ODBC][Ora]ORA-00942: table or view does not exist
SQL:select 1 AS RS from v$instance where status<>‘OPEN’
EXE[ERROR]: 连接数据库失败! 数据库处于MOUNT模式

解决方法:
exec模块配置数据库用户权限问题,最简单解决方式grant dba to ems;

问题2:
EXE[ERROR]: SITEID:0 SEQID:0 TRXID:0 STATE:01000 CODE: 0 ERR:[unixODBC][Driver Manager]Can’t open lib ‘Oracle in OraDb11g_home1’ : file not found
[oracle@racdb1 bin]$ ldd libdmhs_exec.so
linux-vdso.so.1 => (0x00007ffdb8540000)
libc.so.6 => /lib64/libc.so.6 (0x00007f1695837000)
libm.so.6 => /lib64/libm.so.6 (0x00007f1695535000)
librt.so.1 => /lib64/librt.so.1 (0x00007f169532d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1695111000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f1694f0d000)
libdmhs_pub.so => ./libdmhs_pub.so (0x00007f1694c03000)
libdmhs_ucvt.so => ./libdmhs_ucvt.so (0x00007f16946ab000)
libdmhs_dm_obj.so => ./libdmhs_dm_obj.so (0x00007f169449a000)
libdmhs_cvt.so => ./libdmhs_cvt.so (0x00007f169422c000)
libodbc.so.2 => /lib64/libodbc.so.2 (0x00007f1693fc4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1695f73000)
libdmhs_exp.so => ./libdmhs_exp.so (0x00007f1693c35000)
libdmhs_xml.so => ./libdmhs_xml.so (0x00007f1693a28000)
libclntsh.so.11.1 => /oracle/app/oracle/product/11.2.0/lib/libclntsh.so.11.1 (0x00007f1690fc0000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f1690db6000)
libnnz11.so => /oracle/app/oracle/product/11.2.0/lib/libnnz11.so (0x00007f16909e9000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f16907cf000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f16905cd000)
解决方法:
更换Lib库路径到ODBC的安装路径/usr/local/lib/libodbc.so.2

问题3:
OCI模块数据库登录失败,server=ASM;user=sys;password=******
DB:ORA-12514:TNS:listener does not currently know of service requested in connect descriptor
image.png
解决方法:
更换ASM监听IP为物理地址如下

原配置:
ASM =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = +ASM)
    )
  )
更改后:
ASM = 
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.116)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = +ASM)
    )
  )

问题4:
[oracle@rac1 ~]$ isql -v ORACLE
isql: symbol lookup error: /oracle/app/oracle/product/11.2.0/lib/libsqora.so.11.1: undefined symbol: SQLGetPrivateProfileStringW
解决方法:
yum remove unixODBC*
重新安装unixODBC-2.3.0.tar.gz版本或unixODBC-2.3.2.tar.gz版本

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服