centos7环境下:基于dmhs 实现异构ORACLE 12C->DM8双向实时同步

1、什么是DMHS 异构双向实时同步?

    目前DMHS不仅支持达梦之间的同步,也能支持常用的通用数据库的数据同步,达梦DMHS支持 DM、MySQL、PostgreSQL、DB2、SQLServer、Oracle9i 及以上版本;双向实时同步即源端可以实时同步到目标端,目标端也可以实时同步到源端。

                                 DMHS通过网络,可实现实时备份、异地容灾等功能

2、源端及目标端相关检查

2.1、检查系统信息

    用户在安装 DMHS 前,需要检查当前操作系统的相关信息,确认 DMHS 安装程序与当
前操作系统匹配,以保证 DMHS 能够正确安装和运行。可以使用以下命令检查操作系
统基本信息。

#获取系统位数

getconf LONG_BIT

[oracle11g@oracle11g ~]$ getconf LONG_BIT   

64  ---表示64位

#查询操作系统 release 信息

lsb_release -a

--centos 7
cat /etc/centos-release

CentOS Linux release 7.4.1708 (Core)

#查询系统信息

cat /etc/issue

Kernel \r on an \m

---centos
[root@multiview ~]# cat /proc/version

Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 201

#查询系统名称

uname -a

Linux oracle11g 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2.2、检查系统内存与存储空间


2.2.1、检查内存

   为了保证 DMHS 的正确安装和运行,要尽量保证操作系统至少 1GB 的可用内存(RAM)。
如果可用内存过少,可能导致 DMHS 安装或启动失败。用户可以使用以下命令检查操作内
存:

#获取内存总大小
grep MemTotal /proc/meminfo

[oracle11g@oracle11g ~]$ grep MemTotal /proc/meminfo -h
MemTotal:        8009724 kB

#获取交换分区大小
grep SwapTotal /proc/meminfo

[oracle11g@oracle11g ~]$ grep SwapTotal /proc/meminfo
SwapTotal:       8388604 kB

#获取内存使用详情(可以直接使用这种查看内存)
free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        827M        5.2G        292M        1.6G        6.3G
Swap:          8.0G          0B        8.0G

2.2.2、检查存储空间

DMHS 完全安装需要 1GB 的存储空间,用户需要提前规划好安装目录,预留足够
的存储空间。用户可使用以下命令检查存储空间:
#查询目录/mount_point/dir_name 可用空间
 df -h / #查看根目录下的存储:因为本次我是装在更目录下
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   72G   19G   54G  26% /


#DMHS 安装程序在安装时将产生临时文件,临时文件需要 1GB 的存储空间,临时
#查询目录/tmp 可用空间
df -h /tmp
[oracle11g@oracle11g ~]$ df -h /tmp
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   72G   19G   54G  26% /

3、源端安装DMHS及配置参数

3.1、DMHS软件安装

#官网要求
安装 ORACLE 端 DMHS 同步软件
ORACLE 端操作系统上建立 dmhs 同步软件存放目录,并修改目录属主为 oracle 用
户,增加程序执行权限;修改目录属主为 oracle 用户

3.1.1源库安装DMHS软件及配置

1)安装前oracle字符集检查:

#oracle服务端字符集
select userenv('language') from dual ;

SQL> select userenv('language') from dual ;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

#oracle客户段字符集
echo $NLS_LANG
[oracle12c@oracle12c bin]$ echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8

#NEED_LIB_PATH环境配置依赖路径:
cd $ORACLE_HOME/BIN
pwd

/u01/app/oracle12c/product/12c/db_1/bin:/usr/local/lib

2)安装DMHS

[oracle12c@oracle12c dm8]$ ./dmhs_V4.2.96_oracle12c_rev114308_rh6_64_veri_20220906.bin -i
Extract install files..........

1.English(English)
2.Simplified Chinese(简体中文)
Select the language to install[2.Simplified Chinese(简体中文)]:2
/tmp/DMHSInstall/install.log
1.免费试用达梦数据实时同步
2.使用已申请的Key文件
验证许可证文件[1.免费试用达梦数据实时同步]:2
Key文件路径:/dm8/dmhs5301072545.key
Key文件限制信息如下:
有效日期:2022-12-25
用户名称:达梦公司产品试用
服务器颁布类型:试用版
发布类型:企业版
Key类型:企业版
授权用户数:无限制
并发连接数:无限制
1.精简版
2.完整版(web客户端)
3.自定义
安装类型[1.精简版]:2
1.实时同步软件服务器
2.远程部署工具
3.实时同步软件客户端
4.内置数据库
5.实时同步软件配置助手
6.手册
所需磁盘空间:884 MB
安装目录: [/home/oracle12c/dmhs]/dm8/dmhs
该路径不为空,是否继续安装?[Y or N]y
安装路径可能存在覆盖安装
1.统一部署
2.现在初始化
是否初始化达梦数据实时同步系统[1.统一部署]:
正在安装
default start ...    default finished.
server start ...    server finished.
....(省略)
doc start ...    doc finished.
doc start ...    doc finished.
postinstall start ...    postinstall finished.
正在创建快捷方式
安装成功
远程部署工具配置
远程部署工具名称[HsAgent]:
主机Ip(外网)[192.168.122.1](192.168.122.1,192.168.99.2,192.168.100.1):192.168.100.1
远程部署工具管理端口[5456](1000-65535):
内置数据库轮询间隔[3](1-60):
内置数据库IP[192.168.122.1]:192.168.100.1
内置数据库端口[15236]:
内置数据库用户名[SYSDBA]:
内置数据库密码[SYSDBA]:
服务脚本环境变量设置
依赖库路径
提示:此配置项供用户配置源或目的数据库依赖库路径和odbc依赖库路径, 多个路径以":"隔开(例:/opt/dmdbms/bin:/usr/local/lib),此配置项会添加到服务脚本的NEED_LIB_PATH的变量值中。
请配置依赖库路径:/u01/app/oracle12c/product/12c/db_1/bin:/usr/local/lib
Oracle字符集
提示:注意此处配置为ORACLE数据库的NLS_LANG,此配置项由源端数据库字符集编码格式决定,需与源端字符集编码适配。
1.SIMPLIFIED CHINESE_CHINA.ZHS32GB18030
2.SIMPLIFIED CHINESE_CHINA.AL32UTF8
3.TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5
4.TRADITIONAL CHINESE_TAIWAN.AL32UTF8
5.AMERICAN_AMERICA.AL32UTF8
6.AMERICAN_AMERICA.WE8ISO8859P1
7.AMERICAN_AMERICA.WE8ISO8859P15
8.AMERICAN_AMERICA.ZHS16GBK
9.不设置
请配置Oracle字符集[9.不设置]:5
内置数据库服务
1.自动
2.手动
启动方式:[2.手动]
正在创建内置数据库服务
初始化内置数据库
远程控制服务
1.自动
2.手动
启动方式:[2.手动]
正在创建远程控制服务
web服务
1.自动
2.手动
启动方式:[2.手动]
正在创建web服务
达梦数据实时同步V4.0安装完成
更多安装信息,请查看安装日志文件:
/dm8/dmhs/log/install.log

3)配置DMHS

    双向同步源端配置dmhs.hs,通过与单向实时同步配置可以对比出,双向实时同步在源端上也配置上了EXEC执行器;其实也不难理解,源端也可以是目标端,目标端也可以是源端,所以我在这次配置时候不分从目标端开始。

echo '
<?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>
 </base>
 <cpt>
<db_type>oracle12c</db_type>
<db_server>192.168.100.1</db_server>
<db_user>DMHS</db_user>
<db_pwd>DMHS</db_pwd>
<db_port>1521</db_port>
<db_ssl_path></db_ssl_path>
<db_ssl_pwd></db_ssl_pwd>
<parse_thr>1</parse_thr>
<ddl_mask>OBJ:OP</ddl_mask> <!--DDL 配置项-->
<arch><!--归档清理配置项-->
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send><!-- 发送模块配置 -->
<ip>192.168.100.2</ip>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<trigger>0</trigger><!-- 是否忽略触发器,默认为 0,限定值 0,1 -->
<constraint>0</constraint><!-- 是否忽略约束,默认为 0,限定值 0,1 -->
<identity>1</identity>
<net_turns>0</net_turns>
<filter><!--过滤配置项-->
<enable><!-- 白名单,所有允许同步的表 -->
<item>DMHS.*</item>
</enable>
</filter>
<map><!--映射配置项-->
<item>DMHS.*==DMHS.*</item>
</map>
</send>
</cpt>
<exec>
 <recv>
 <data_port>5346</data_port>
 </recv>
 <db_type>oracle12c</db_type>
 <db_server>192.168.100.1</db_server>
 <db_user>DMHS</db_user>
 <db_pwd>DMHS</db_pwd>
 <driver>ORACLE ODBC DRIVER</driver>
 <db_port>1521</db_port>
 <db_name>orcl</db_name>
 <exec_thr>4</exec_thr>
 <exec_sql>1024</exec_sql>
 <exec_trx> 5000 </exec_trx>
 <exec_rows>1000</exec_rows>
 </exec>
</dmhs>
'>/dm8/dmhs/bin/dmhs.hs


4)、oracle 12数据库配置与修改

1)检查归档日志:如果没有打开需要关闭数据库打开
登陆oracle 12c,并检查归档情况

sqlplus / as sysdba  #操作系统认证登陆
archive log list;


SQL> archive log list; 
Database log mode              No Archive Mode   #归档没有打开
Automatic archival             Disabled             
Archive destination            /u01/app/oracle12c/product/12c/db_1/dbs/arch
Oldest online log sequence     6
Current log sequence           8

2)打开归档   ---一般生产库都是开了归档的
mkdir -p /oracle/arch
SQL> shutdown immediate ;                              #关闭数据库
SQL> startup mount ;                                   #开启数据库至mount状态
SQL> alter database archivelog;                        #开启归档
SQL> alter system set db_recovery_file_dest='';        #默认的指定闪回恢复区路径,不指定就是默认
SQL> alter system set log_archive_dest='/oracle/arch';  #设置归档路径
SQL> shutdown immediate;                               #重启让归档生效
SQL> startup;                                          #设置归档路径
SQL> archive log list;                                 #查看归档信息

SQL> archive log list;
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /oracle/arch
Oldest online log sequence     296
Next log sequence to archive   298
Current log sequence           298


3)检查附加日志:
select supplemental_log_data_min, supplemental_log_data_all from v$database;

SUPPLEME SUP      
-------- ---
NO       NO

--开启数据库最小附加日志及全列日志
alter database add supplemental log data ;  #在oracle open状态下修改

SQL>   alter database add supplemental log data ;
Database altered.

SQL>   alter database add supplemental log data (ALL) columns ;
Database altered.

--再次检查附加日志:
select supplemental_log_data_min, supplemental_log_data_all from v$database;

SUPPLEME SUP
-------- ---
YES      YES

#检查回收站:回收站是开的,为啥要检查这步还没搞懂

show parameter recycle;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle                  string
db_recycle_cache_size                big integer 0
recyclebin                           string      on

12c之前需要关闭回收站,12c之后不用
SQL> alter system set recyclebin=off deferred;
System altered;

#检查同步用户权限
create user DMHS identified by DMHS;

--在 DMHS 捕获器中用于连接源端数据库管理系统的数据库用户,若没有 DBA 权限,则
至少应被赋予以下权限(SQL 执行):
Oracle 业务用户需要权限:
grant resource to dmhs;
grant select any dictionary to dmhs;
grant create session to dmhs;
grant create trigger to dmhs;
grant connect to dmhs;
grant select any table to dmhs;
grant select any dictionary to dmhs;
grant create table to dmhs;
grant create session to dmhs;
grant lock any table to dmhs;
grant execute on dbms_flashback to dmhs;
grant administer database trigger to dmhs;
grant create trigger to dmhs;
grant select on sys.obj$ to dmhs;
grant select on sys.user$ to dmhs;

Oracle12C 则还需要加:
grant select on sys.user$ to dmhs; 
grant select on sys.obj$ to dmhs;
grant select on sys.tab$ to dmhs;

#查询用户的系统权限 
select * from dba_sys_privs where grantee='DMHS';  
DMHS    SELECT ANY DICTIONARY    NO
DMHS    CREATE SESSION    NO
DMHS    SELECT ANY TABLE    NO
DMHS    LOCK ANY TABLE    NO

 #查询用户的对象权限 
select * from dba_tab_privs where grantee='DMHS'; 
DMHS    SYS    DBMS_FLASHBACK    SYS    EXECUTE    NO    NO

4)开启 DDL 同步配置
 (1)登录数据库在 DMHS 用户下执行:
_system_trig_enabled 为 true 或者未设置(select parameter "_system_trig_enabled";
进行查询)
#修改为true
alter system set "_system_trig_enabled"=true;

#查询是否为true
show parameter _system_trig_enabled
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_system_trig_enabled                 boolean     TRUE


(2)源端创建 ddl 触发器和辅助表。
(3)对 ddl_mask 掩码进行设置。
可选择含触发器的 DDL 同步方式,也可是选择不含触发器 DDL 的同步方式:
SQL>@/dm8/dmhs/scripts/ddl_sql_ora.sql;  #使用DMHS执行

#注意一定要将原始的ddl_sql_ora.sql分开执行,否者会报错,建议使用在sqlplus里运行
第一步:将此部分在建一个SQL文件,然后通过sqlplus @
create table dmhs_ddl_sql (
        objid                        NUMBER,
        dataobj                    NUMBER,
    op_type         varchar2(32),
    obj_schname     varchar2(128),
    obj_name        varchar2(128),
    obj_type        varchar2(32),
    op_sql                    varchar(4000),
    op_sql2         clob,
    ddl_time        date,
    resvd1                    NUMBER, 
    resvd2                    NUMBER, 
    resvd3                    NUMBER, 
    resvd4                    NUMBER, 
    resvd5                    varchar2(1000),
    resvd6                    varchar2(1000)
);

create or replace trigger dmhs_trigger
before ddl
on database
declare    
     e1                    exception;
   sql_text    ora_name_list_t;
   ddl_sql     clob;
   op_no       number := NULL;
   objid       number := NULL;
   dataobj     number := NULL;
   v_num             number;
   sql_item         varchar(8000);
   sql_temp         varchar(8000);
begin

-----省略中间的
end dmhs_trigger;
/

#执行效果
SQL> @/dm8/1.sql;

Table created.

 67  /
Trigger created.


第二步:将剩余部分粘贴在sqlplus 运行就行了
SQL>grant flashback any table to dmhs;
 Grant succeeded.
....省略


5)Oracle 服务名(TNS Service Name)配置
vi  $ORACLE_HOME/network/admin/tnsnames.ora

echo '
orcl =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.1)(PORT = 1521))
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = orcl)))
'>>$ORACLE_HOME/network/admin/tnsnames.ora
cat  $ORACLE_HOME/network/admin/tnsnames.ora
 
6)前台启动dmhs:用于配置排查错误
cd /dm8/dmhs/bin
./dmhs_server

3.2、DMHS软件安装:oracle 12c配置unixodb

#查询源端没有数据安装ODBC,接下来进行M目标端的数据库

----既然是双向同步,那就要保证源端也能成为目标端,所以需要配置ODBC
[root@oracle12c ~]# find / -name odbc.ini

#达梦官方文档推荐安装 unixodbc2.3.2 版本的 odbc:(使用root用户安装)
1) 下载 unixodbc2.3.2 源码 unixODBC-2.3.2.tar.gz。
2) 解压 unixodbc 源码
mkdir /unixodbc #将安装包放在这里,同时也解压到这里
tar -zxvf unixODBC-2.3.2.tar.gz


3) 进入 unixodbc 源码目录,编译源码
 cd unixODBC-2.3.2/
#export CC=gcc
./configure 
make&&make install

#卸载ODBC make uninstall

#odbc.ini 配置:
echo '[ORACLE]
Description = ORACLE ODBC DSN          
Driver =ORACLE ODBC DRIVER
SERVER = 192.168.100.1
UserID = DMHS
Password = DMHS
Servername = orcl
PORT = 1521
'>/usr/local/etc/odbc.ini
cat /usr/local/etc/odbc.ini

#odbcinst.ini 配置:
vi /usr/local/etc/odbcinst.ini
echo '[ORACLE ODBC DRIVER]
Description = ODBC DRIVER FOR ORACLE
Driver = /u01/app/oracle12c/product/oracle12c/db_1/lib/libsqora.so.12.1
Threading = 0
'>/usr/local/etc/odbcinst.ini
cat /usr/local/etc/odbcinst.ini

export LD_LIBRARY_PATH=/u01/app/oracle12c/product/oracle12c/db_1/lib/:/usr/lib

export LD_LIBRARY_PATH=$ORACLE_HOME/lib
cd $ORACLE_HOME/lib
4)、查看odbc的版本
[root@oracle12c unixODBC-2.3.2]# odbc_config --version 2.3.2

5)、查看odbc配置文件路径
[root@oracle12c unixODBC-2.3.2]#  odbcinst -j 

unixODBC 2.3.2
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

6)测试ORACLE源端成功登陆到ISQL
[oracle@develop lib]$ cd /usr/local/bin/
[oracle@develop bin]$ /usr/local/bin/isql -v ORACLE system/m123
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>

------------------------//源端配置到此结束//---------------------------

4、目标端安装DMHS及配置参数

4.1、DMHS软件安装

----这里不再赘述

4.1.1源库安装DMHS软件及配置

1)、DMHS参数配置
echo '
<?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> 
 </base> 
 <cpt>
        <db_type>dm8</db_type>
        <db_server>192.168.100.2</db_server>
        <db_user>DMHS</db_user>
        <db_pwd>ADMIN123456</db_pwd>
        <db_port>5236</db_port>
        <db_ssl_path></db_ssl_path>
        <db_ssl_pwd></db_ssl_pwd>
        <parse_thr>1</parse_thr>
        <ddl_mask>OBJ:OP</ddl_mask> <!--DDL 配置项--> 
        <arch><!--归档清理配置项-->
            <clear_interval>600</clear_interval>
            <clear_flag>0</clear_flag>
        </arch>
        <send><!-- 发送模块配置 -->
        <ip>192.168.100.1</ip>
        <mgr_port>5345</mgr_port>
        <data_port>5346</data_port>
        <trigger>0</trigger><!-- 是否忽略触发器,默认为 0,限定值 0,1 -->
        <constraint>0</constraint><!-- 是否忽略约束,默认为 0,限定值 0,1 -->
        <identity>1</identity>
        <net_turns>0</net_turns>
        <filter><!--过滤配置项-->
            <enable><!-- 白名单,所有允许同步的表 -->
                <item>DMHS.*</item>
            </enable>
        </filter>
        <map><!--映射配置项-->
        <item>DMHS.*==DMHS.*</item>
        </map>
        </send>
    </cpt>
<exec> 
     <recv> 
     <data_port>5346</data_port> 
     </recv> 
     <db_type>dm8</db_type> 
     <db_server>192.168.100.2</db_server>  
     <db_user>SYSDBA</db_user> 
     <db_pwd>ADMIN123456</db_pwd> 
     <db_port>5236</db_port> 
     <db_name>DMDATA</db_name> 
     <exec_thr>4</exec_thr>  
     <exec_sql>1024</exec_sql> 
     <exec_trx> 5000 </exec_trx> 
     <exec_rows>1000</exec_rows> 
 </exec> 
</dmhs>
'>/dm8/dmhs/bin/dmhs.hs
cat /dm8/dmhs/bin/dmhs.hs

2)、目标端DM8开启归档模式

--1) 设置归档标记和逻辑日志标记。打开 DM8 服务器配置文件“dm.ini”,设置如下值:
ARCH_INI = 1 
RLOG_APPEND_LOGIC = 1 
 注意:dm.ini 配置参数中“FAST_COMMIT”必须为 0,否则会导致逻辑日志不全而影响DMHS 达梦数据实时同步系统搭建手册同步。
 
sed -i "s/ARCH_INI.*=.*/ARCH_INI                       = 1/g"                      /dm8/dmdbms/DMDATA/dm.ini;     
sed -i "s/RLOG_APPEND_LOGIC.*=.*/RLOG_APPEND_LOGIC                       = 1/g"    /dm8/dmdbms/DMDATA/dm.ini;     

#查询修改情况:
cat /dm8/dmdbms/DMDATA/dm.ini | grep -E "ARCH_INI|RLOG_APPEND_LOGIC" 

--2) 添加归档配置文件。在“dm.ini”同目录下创建文件“dmarch.ini”,示例内容如下:
[ARCHIVE_LOCAL1] 
ARCH_TYPE = LOCAL 
ARCH_DEST = /dm8/dmdbms/arch   #归档目录
ARCH_FILE_SIZE = 128           #归档文件大小,单位 MB 
ARCH_SPACE_LIMIT = 0           #空间大小限制,0 表示不限制
 
#新增文件dmarch.ini
vi /dm8/dmdbms/DMDATA/dmarch.ini
#新增如下内容
mkdir -p /dm8/dmdbms/arch
echo '           
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL 
ARCH_DEST = /dm8/dmdbms/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
'>/dm8/dmdbms/DMDATA/dmarch.ini
cat  /dm8/dmdbms/DMDATA/dmarch.ini

#(注意:配置完后,重启数据库)

#查看归档情况:
SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL' AND ARCH_IS_VALID='Y'; 
 ARCH_DEST         ARCH_FILE_SIZE
------------    ------------
/dm8/archivelog        128

已用时间: 128.384(毫秒). 执行号:3. 

3)检查逻辑日志配置的正确性,通过下面的查询:
SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC'; 

行号         PARA_VALUE 
---------- ---------- 
1              1 

已用时间: 20.685(毫秒). 执行号:4. 

#注意在配置双向同步的时候,需要把RLOG_APPEND_SYSTAB_LOGIC设置为0
CPT[INFO]: DM8 RLOG_APPEND_SYSTAB_LOGIC = 0, then using DMHS auxiliary table and triggers for DDL sync.
SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_SYSTAB_LOGIC'; 

4)检查在线日志,通过如下的查询:
SELECT PATH FROM SYS.V$RLOGFILE; 

---------- ---------------------------------------- 
1 /opt/dmdbms/arch/src_db01.log 
2 /opt/dmdbms/arch/src_db02.log 


5)检查 FAST_COMMIT 参数是否为 0 
 select para_value from v$dm_ini where para_name = 'FAST_COMMIT'; 
查询结果如下:
行号          PARA_VALUE 
---------- ---------- 
1               0 
已用时间: 8.691(毫秒). 执行号:585. 
 

6)配置 DDL:注意注意注意,一定要管理工具运行,否则可能会报错
/*如果要求 DDL 同步,那么需要创建 DDL 触发器和辅助表。创建的脚本参见 DMHS 安
装目录下 scripts 子目录中“ddl_sql_dm8.sql”。注意创建时需要使用 SYSDBA 用户。
检查创建的触发器和辅助表是否有效,检查辅助表的语句:*/

select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMHS%' and status = 'VALID'; 
查询结果如下:(实测有9条)
行号 OWNER TABLE_NAME 
---------- ------ --------------- 
1 SYSDBA    DMHS_DDL_COL
2 SYSDBA    DMHS_DDL_SQL
3 SYSDBA    DMHS_DDL_CONS
4 SYSDBA    DMHS_DDL_IDX
5 SYSDBA    DMHS_DDL_RENAME
6 SYSDBA    DMHS_DDL_SEQ
7 SYSDBA    DMHS_DDL_PART
8 SYSDBA    DMHS_DDL_COMMENT
9 SYSDBA    DMHS_DDL_LOG
9 rows got 
已用时间: 197.302(毫秒). 执行号:7. 


7)检查触发器的语句:
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y'; 
查询结果如下:
行号 OWNER TRIGGER_NAME 
---------- ------ ----------------------- 
1 SYSDBA DMHS_DDL_TRIGGER_AFTER 
2 SYSDBA DMHS_DDL_TRIGGER_BEFORE 
3 SYSDBA DMHS_DDL_TRIGGER_GRANT 
4 SYSDBA DMHS_DDL_TRIGGER_REVOKE 
已用时间: 12.147(毫秒). 执行号:16. 
 

8) 同步连接用户&授权
创建用户 DMHS 作为连接用户,授权若不能以 dba 角色授予以下权限:
dmhs 用户需要权限:
create user DMHS identified by DMHS_1234;
grant PUBLIC to dmhs;
grant select on SYS.V$rlog to dmhs;
grant select on SYS.V$DM_INI to dmhs;
grant select on SYS.V$RLOGFILE to dmhs;
grant select on SYS.V$DM_ARCH_INI to dmhs;
grant select on SYS.V$VERSION to dmhs;
grant select on SYS.V$ARCH_FILE to dmhs;
grant select any table to dmhs;
grant select any dictionary to dmhs;
grant create table to dmhs;
grant create session to dmhs;
grant create trigger to dmhs;
--待装载的表或序列的查询权限:
select 'grant select on '||owner||'.'||table_name||' to "DMHS"' from dba_tables where 
owner='SYSDBA';

9)、DMHS 前台启动
#预先使用前台启动:方便排查问题,注册放在最后一步
cd /dm8/dmhs/bin
./dmhs_server     #不加配置参数路径,因为默认在bin目录中

10)、DMHS 启动 EXEC 模块(这一步启动,主要验证能否登陆成功)
进到/dmhs/bin 目录()
./dmhs_console
DMHS>connect 127.0.0.1:5345
DMHS>start exec

#当出现start exec卡着不动时,极有可能是缺少链接库,但是没报错,可使用root用户登陆看看
cp /dm8/dmhs/db/bin/libdodbc.so  /dm8/dmhs/bin/libdodbc.so

#在dmhs/bin目录中有18个,如果少了总之缺少就要补进去,主要是环境变量没有配置好才导致的问题
[dmdba@dm8 bin]$ ll *.so | wc -l


4、初始化及数据同步

第一步、启动两台的服务(./dmhs_server dmhs.hs)
#目标库启动HS服务
cd /dm8/dmhs/bin
./dmhs_server dmhs.hs
#源库启动HS服务
cd /dm8/dmhs/bin
./dmhs_server dmhs.hs

第二步、启动两台的执行器(./dmhs_console 输入start exec)
#目标库启动执行器
cd /dm8/dmhs/bin
./dmhs_console
DMHS> connect 192.168.100.3:5345
DMHS> START EXEC
#源库启动执行器
./dmhs_server dmhs.hs
DMHS> connect 192.168.100.3:5345
DMHS> START EXEC

#修改软链接:当启动start exec失败时,需修改软链接
ln -s libodbc.so.2.0.0 libodbc.so.1
lrwxrwxrwx 1 root root      16 Sep 26 23:21 libodbc.so.1 -> libodbc.so.2.0.0
lrwxrwxrwx 1 root root      16 Sep 26 20:56 libodbc.so.2 -> libodbc.so.2.0.0

第三步、初始化数据字典及装载数据
--字典的初始化和数据装载(一定要确保映射的目标用户存在,并具有相应的权限,否者初始时会报错)
#源端端执行:
cd /dm8/dmhs/bin
./dmhs_console
DMHS> connect 192.168.100.3:5345
DMHS >CLEAR EXEC LSN(慎用)
DMHS >COPY 0 "SCH.NAME='SYSDBA'" DICT|CREATE|INSERT

#目标端执行:
cd /dm8/dmhs/bin
./dmhs_console
DMHS> connect 192.168.100.3:5345
DMHS >COPY 0 "sch.name='SYSDBA'" DICT|CREATE|INSERT 

第四步、、启动两台的CPT日志分析捕获器()
#目标库启动执行器
cd /dm8/dmhs/bin
./dmhs_console
DMHS> START CPT
#源库启动执行器
./dmhs_server dmhs.hs
DMHS> START CPT

5、实时同步测试

测试方法:既然是双向同步,那就在源端和目标端建立数据,看能否同步到对方

1、源端操作:
---创建100个字段的表:用户id、用户姓氏、用户名字、city_id、CIRT_NAME
create table tb_100
(
 USER_ID  INT
,USER_FNAME VARCHAR(100)
,USER_LNAME VARCHAR(100)
,CITY_ID  VARCHAR(100)
,CITY_NAME VARCHAR(100)
,AGE  VARCHAR(100)
);

--插入数据6个字段1百万条记录数据
declare
b int :=1000000;
a int :=1;
begin
    for i in a..b
    loop
            insert into tb_100 values(i,'i'||'yang','i'||'qihua','i'||'851','i'||'贵阳','i'||'-32岁');
    end loop;
    commit;
end;

#结论:在目标端可以查询到数据

2、目标端操作:
---创建100个字段的表:用户id、用户姓氏、用户名字、city_id、CIRT_NAME
create table tb_101
(
 USER_ID  INT
,USER_FNAME VARCHAR(100)
,USER_LNAME VARCHAR(100)
,CITY_ID  VARCHAR(100)
,CITY_NAME VARCHAR(100)
,AGE  VARCHAR(100)
);

--插入数据6个字段1百万条记录数据
declare
b int :=1000000;
a int :=1;
begin
    for i in a..b
    loop
            insert into tb_101 values(i,'i'||'yang','i'||'qihua','i'||'851','i'||'贵阳','i'||'-32岁');
    end loop;
    commit;
end;

#结论:在源端可以查询到数据

6、注册服务

为什么要把注册服务放到最后一步呢???
因为我认为,前台主要的工作都在安装部署排错,其中排错的时间占了50%,环境变量的影响是最大的,经常报错动态链接库找不到(对于新手来说确认很痛苦)

1、源端注册:重启后报错: 
#使用服务脚本直接注册服务:(root用户注册)
/dm8/dmhs/scripts/root/dmhs_service_installer.sh -t dmhs_server -p DMHS_DM_source -x /dm8/dmhs/bin/dmhs.hs -d /dm8/dmhs/bin


#注册完成以后:
cd /home/dmhs/bin
ls -l Dm*

可以查看到相应的注册服务。
服务的启停以及开机自启:
systemctl start/stop/status/restart/enable/disable DmhsServiceDMHS_DM   #操作

systemctl start DmhsServiceDMHS_DM
systemctl status DmhsServiceDMHS_DM
systemctl stop DmhsServiceDMHS_DM


2、目标端注册dmhs_server服务

/dm8/dmhs/scripts/root/dmhs_service_installer.sh -t dmhs_server -p DMHS_DM_target -x /dm8/dmhs/bin/dmhs.hs -d /dm8/dmhs/bin

#注册完成以后:可以查看到相应的注册服务。
cd /home/dmhs/bin
ls -l Dm*

#服务的启停以及开机自启:
systemctl start/stop/status/restart/enable/disable DmhsServiceDMHS_DM   #操作

systemctl start DmhsServiceDMHS_DM
systemctl status DmhsServiceDMHS_DM
systemctl stop DmhsServiceDMHS_DM

7、总结

通过ORACLE 12C <->DM8双向实时同步搭建,再对比单向实时同步,主要的区别是配置上的不同,理解其中的架构意义才能最后搭建成功,至少知道他们怎么工作的

-----------------------------------------本文档到此结束---------------------------------------------

更多内容,请访问达梦社区地址:https:eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值