一、前言
DMHS 同步软件可实现以下功能:
1.对 Oracle 类型数据库数据进行抽取、转换、过滤,并映射到其他 Oracle数据库或其他类型数据库。
2.对 Oracle 数据库中的 DML、DDL 操作进行捕获,并同步到其它同构或异构数据库,即目标库。
3.将 Oracle 数据库中的数据操作实时同步到目标库,同步时间能够达到毫秒级。
二、环境准备
2.1实验环境配置基本信息
源端->目标端 | DM8 -> Oracle |
OS版本 | OracleLinux-R7-U9-Server-x86_64-dvd.iso |
CentOS-7-x86_64-DVD-2009.iso | |
达梦 HS版本 | 安装在Oracle用户下:dmhs_oracle12c.zip |
安装在root用户下:dmhs_dm8.zip | |
LINUX.X64_193000_db_home.zip | |
dm8_20210315_x86_rh6_64_ent_8.1.1.190.iso | |
源端IP | 192.168.3.92 |
目标端IP | 192.168.3.12 |
安装用户:Oracle | |
DMHS_HOME=/u01/app/dmhs | |
安装用户:root | |
DM_HOME=/opt/dmhs | |
同步用户 | yuanzj |
2.2.源端数据库基本信息
主机名 | yuanzjdm8 |
数据库版本 | dm8_20210315_x86_rh6_64_ent_8.1.1.190.iso |
DM_HOME | /opt/dmdbms |
簇大小 | 16 |
页大小 | 8K |
字符集 | utf8 |
大小写敏感 | 是 |
是否以字符为单位 | 否 |
是否归档 | 是 |
传输用户 | yuanzj |
2.3.目标端数据库基本信息
主机名 | yuanzjora19c |
数据库版本 | LINUX.X64_193000_db_home.zip |
ORACLE_HOME | /u01/app/oracle/product/19.0.0/dbhome_1 |
db_block_size | 8K |
NLS_CHARACTERSET | AL32UTF8 |
是否归档 | 是 |
接收用户 | yuanzj |
2.4.目标库开启归档和逻辑日志
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1
FAST_COMMIT = 0
复制
注意:dm.ini 配置参数中“FAST_COMMIT”必须为 0,否则会导致逻辑日志不全而影响同步。
2.5.创建安装目录
1)源端
[root@yuanzjdm8 dmsoft]# mkdir -p /opt/dmhs
复制
2)目的端
[oracle@yuanzjora19c:/home/oracle]$ mkdir -p u01/app/dmhs
复制
2.5.上传安装介质
源端、目标库上传dmhs安装介质,步骤略
2.6配置环境变量
源端库:
达梦HS安装在root用户下,所以建议部署在/opt/目录下,其环境配置如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export DMHS_HOME=/opt/dmhs
export LD_LIBRARY_PATH=$DMHS_HOME/bin:$DMHS_HOME/dmoci:$LD_LIBRARY_PATH
复制
目标库:
经过查阅官方文档可知:
DMHS 在运行时,需要加载本地 ORACLE 动态库 libclntsh.so。在部署 DMHS 之前,需 将 libclnsh.so 所 在 目 录 添 加 到 共 享 库 路 径 变 量 中 。libclntsh.so 通 常 位 于$ORACLE_HOME/lib 中。在 LINUX/UNIX 系统中,设置的方法如下:
经过查看可知,动态库 libclntsh.so属于$ORACLE_HOME/lib/libclntsh.so.19.1软链接,所以选择将dmhs部署在oracle操作系统用户下。
oracle操作系统环境配置如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
#Use for oracle12c install added by jt&&yzj
PS1=[`whoami`@`hostname`:'$PWD]$ '; export PS1
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:/usr/local/bin:$PATH:$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
复制
其中当数据存在中文时,达梦建议:需将 DMHS 运作所在窗口的 NLS_LANG 设置为对应的字符集,建议使用 AMERICAN_AMERICA.ZHS16GBK
三、创建测试用户和测试数据
1.源端创建测试用户和测试数据
1)创建测试用户:yuanzj
[dmdba@yuanzjdm8 ~]$ disql SYSDBA/SYSDBA123
open fail! path:./libcrypto.so
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.979(ms)
disql V8
SQL> create user yuanzj identified by yuanzj1234 default tablespace main default index tablespace main;
复制
2)打开oracle兼容性:
SQL> SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
DMSQL 过程已成功完成
已用时间: 10.464(毫秒). 执行号:400.
复制
3)重启数据库生效
[dmdba@yuanzjdm8 ~]$ DmServiceDMSERVER restart
复制
4)创建测试数据
a.编辑元数据 utlsampl.sql
CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;
CREATE TABLE EMP
(EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
(40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
CREATE TABLE BONUS
(
ENAME VARCHAR2(10) ,
JOB VARCHAR2(9) ,
SAL NUMBER,
COMM NUMBER
) ;
CREATE TABLE SALGRADE
( GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;
EXIT
复制
b.执行脚本
[dmdba@yuanzjdm8 ~]$ disql yuanzj/yuanzj1234
open fail! path:./libcrypto.so
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 1.378(ms)
disql V8
SQL> start utlsampl.sql
复制
2.目标端创建测试用户
1.创建测试用户
[oracle@yuanzjora19c:/home/oracle]$ sqlplus sys/oracle@orclpdb1 as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 28 06:25:18 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SYS@orclpdb1> create tablespace yuanzj datafile '/oradata/ORCL/orclpdb1/yuanzj01.dbf' size 500m autoextend on next 50m maxsize 30g extent management local;
Tablespace created.
SYS@orclpdb1> create temporary tablespace yuanzj_temp tempfile '/oradata/ORCL/orclpdb1/yuanzj_temp01.dbf' size 200m reuse autoextend on next 10m maxsize 30g;
Tablespace created.
SYS@orclpdb1> create user yuanzj identified by yuanzj1234 default tablespace yuanzj temporary tablespace yuanzj_temp;
复制
2.授权
SYS@orclpdb1> grant connect, resource, to yuanzj;
SYS@orclpdb1> grant UNLIMITED TABLESPACE to yuanzj;
SYS@orclpdb1> grant CREATE ANY TABLE,CREATE ANY SEQUENCE to yuanzj;
SYS@orclpdb1> grant all on sys.dmhs_ddl_sql to yuanzj;
SYS@orclpdb1> grant all on sys.col$ to yuanzj;
SYS@orclpdb1> grant all on sys.cdef$ to yuanzj;
SYS@orclpdb1> grant all on sys.lobfrag$ to yuanzj;
SYS@orclpdb1> grant all on sys.obj$ to yuanzj;
SYS@orclpdb1> grant all on sys.user$ to yuanzj;
SYS@orclpdb1> grant insert any table to yuanzj;
SYS@orclpdb1> grant update any table to yuanzj;
SYS@orclpdb1> grant delete any table to yuanzj;
复制
四、安装hs
1.配置DDL
如果要求 DDL 同步,那么需要创建 DDL 触发器和辅助表。创建的脚本参见 DMHS 安装目录下 scripts 子目录中“ddl_sql_dm8.sql”。注意创建时需要使用 SYSDBA 用户。
注意:建议使用达梦管理工具执行此脚本,此脚本存在完整版的dmhs
1.源端安装达梦HS
1)源端库安装hs
[root@yuanzjdm8 dmsoft]# unzip dmhs_V4.1.4_dm8_rev98201_rh6_64_veri_20210312.zip -d opt/dmhs/
Archive: dmhs_V4.1.4_dm8_rev98201_rh6_64_veri_20210312.zip
creating: opt/dmhs/debug/
......
inflating: opt/dmhs/debug/stat/libdmhs_api.so
[root@yuanzjdm8 dmsoft]# mkdir -p opt/dmhs/dmoci
[root@yuanzjdm8 dmsoft]# tar -zxvf dmoci.tar.gz -C opt/dmhs/dmoci
libcrypto.so
......
libssl.so
[root@yuanzjdm8 dmsoft]# cd /opt/dmhs/
[root@yuanzjdm8 dmhs]# mv debug/ bin/
[root@yuanzjdm8 bin]# mv hs_agent/ ..
[root@yuanzjdm8 bin]# cd ..
[root@yuanzjdm8 dmhs]# ls
bin dmoci hs_agent
复制
2) 编辑dmhs.hs文件
[root@yuanzjdm8 bin]# pwd
/opt/dmhs/bin
[root@yuanzjdm8 bin]# vim dmhs.hs
复制
3)dmhs.hs如下所示:
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<name>cpt</name>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<enable>1</enable>
<name>cpt</name>
<db_type>DM8</db_type>
<db_server>192.168.3.92</db_server>
<db_user>yuanzj</db_user>
<db_pwd>yuanzj1234</db_pwd>
<char_code>PG_GB18030</char_code>
<db_port>5236</db_port>
<idle_time>300</idle_time>
<ddl_mask>OP:OBJ:REC</ddl_mask>
<cpt_mask/>
<parse_thr>1</parse_thr>
<check_date>0</check_date>
<arch>
<clear_flag>0</clear_flag>
<clear_interval>600</clear_interval>
</arch>
<send>
<max_log_num>2000</max_log_num>
<ip>192.168.3.12</ip>
<mgr_port>5345</mgr_port>
<net_pack_size>256</net_pack_size>
<data_port>5346</data_port>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>1</identity>
<net_turns>0</net_turns>
<timeout>0</timeout>
<case_sensitive>1</case_sensitive>
<filter>
<name_len>255</name_len>
<enable>
<item>YUANZJ.*</item>
</enable>
</filter>
<map/>
</send>
<send_delay_second>0</send_delay_second>
<start_scn>0</start_scn>
<rec_heap_size>16</rec_heap_size>
<vpool_size>8</vpool_size>
<send_lst>2</send_lst>
</cpt>
</dmhs>
复制
2.目标端安装hs
注意:因为hs通过unixODBC连接oracle数据库,所以需要先安装unixODBC
1.安装unixODBC
a.安装unixODBC
[root@yuanzjora19c ~]# yum -y install unixODBC
已加载插件:langpacks, ulninfo
正在解决依赖关系
--> 正在检查事务
---> 软件包 unixODBC.x86_64.0.2.3.1-14.0.1.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=====================================================================================================================================================================================
Package 架构 版本 源 大小
=====================================================================================================================================================================================
正在安装:
unixODBC x86_64 2.3.1-14.0.1.el7 rhel-source 413 k
事务概要
=====================================================================================================================================================================================
安装 1 软件包
总下载量:413 k
安装大小:1.2 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : unixODBC-2.3.1-14.0.1.el7.x86_64 1/1
验证中 : unixODBC-2.3.1-14.0.1.el7.x86_64 1/1
已安装:
unixODBC.x86_64 0:2.3.1-14.0.1.el7
完毕!
复制
b.编辑配置文件
[root@yuanzjora19c ~]# odbcinst -j
unixODBC 2.3.1
DRIVERS............: etc/odbcinst.ini
SYSTEM DATA SOURCES: etc/odbc.ini
FILE DATA SOURCES..: etc/ODBCDataSources
USER DATA SOURCES..: root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
复制
[root@yuanzjora19c ~]# cat /etc/odbc.ini
[ORACLE]
Description = ORACLE ODBC DSN
Driver = Oracle
SERVER = 127.0.0.1
PORT = 1521
ServerName = orclpdb1
复制
[root@yuanzjora19c ~]# cat etc/odbcinst.ini
# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
# Setup from the unixODBC package
[Oracle]
Description = ODBC for Oracle
Driver = u01/app/oracle/product/19.0.0/dbhome_1/lib/libsqora.so.19.1
Threading = 0
复制
c.验证连通性
2.安装达梦HS
[oracle@yuanzjora19c:/home/oracle/orasoft]$ unzip dmhs_V3.1.3_oracle12c_rev95459_rh6_64_veri_20201124.zip -d u01/app/dmhs
Archive: dmhs_V3.1.3_oracle12c_rev95459_rh6_64_veri_20201124.zip
creating: u01/app/dmhs/debug/
......
inflating: u01/app/dmhs/debug/libcpt_ora.so
[oracle@yuanzjora19c:/home/oracle/orasoft]$ cd u01/app/dmhs
[oracle@yuanzjora19c:/u01/app/dmhs]$ mv debug/ bin/
[oracle@yuanzjora19c:/u01/app/dmhs]$ cd bin
[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ mv hs_agent/ ..
[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ cd ..
[oracle@yuanzjora19c:/u01/app/dmhs]$ ls
bin hs_agent
复制
3.编辑dmhs.hs文件
[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ vim dmhs.hs
复制
4)dmhs.hs如下所示:
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<name>exec</name>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<enable>1</enable>
<driver>{Oracle}</driver>
<name>exec</name>
<db_type>ORACLE12C</db_type>
<db_server>orclpdb1</db_server>
<db_user>yuanzj</db_user>
<db_pwd>yuanzj1234</db_pwd>
<db_port>1521</db_port>
<case_sensitive>1</case_sensitive>
<exec_thr>1</exec_thr>
<exec_policy>2</exec_policy>
<exec_sql>512</exec_sql>
<exec_trx>5000</exec_trx>
<exec_rows>250</exec_rows>
<trxid_tables>1</trxid_tables>
<vpool>7</vpool>
<recv_caches>8</recv_caches>
</exec>
</dmhs>
复制
五、启动同步
1.启动目的端(oracle数据库)server
[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ ./dmhs_server dmhs.hs
MGR[INFO]: DMHS start up, current version: V3.1.3-Build(2020.11.24-95459trunc)_D64(Enterprise Edition)
MGR[WARN]: License will expire on 2021-06-01
MGR[INFO]: 成功加载配置文件,站点号:1, 管理端口:5345, 轮询间隔:3
MGR[INFO]: 管理 服务正在监听管理端口:5345
复制
2.打开新的窗口,启动执行器
[oracle@yuanzjora19c:/home/oracle]$ cd /u01/app/dmhs/bin
[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ ./dmhs_console
DMHS console tool: V3.1.3-Build(2020.11.24-95459trunc)_D64
Copyright (c) 2020, DMHS. All rights reserved.
DMHS> connect
execute success
DMHS> start exec
execute success
DMHS>
复制
3. 目的端日志显示
4.启动源端数据库(DM数据库)server
[root@yuanzjdm8 bin]# ./dmhs_server dmhs.hs
MGR[INFO]: DMHS start up, current version: V4.1.1-Build(2021.03.12-98201trunc)_D64(Enterprise Edition)
MGR[WARN]: License will expire on 2021-06-01
MGR[INFO]: 成功加载配置文件,站点号:2, 管理端口:5345, 轮询间隔:3
MGR[INFO]: 管理 服务正在监听管理端口:5345
复制
5.打开新的窗口,连接源端 DMHS 服务,设置日志捕获模块起始 LSN。
[root@yuanzjdm8 ~]# cd /opt/dmhs/bin
[root@yuanzjdm8 bin]# ./dmhs_console
DMHS console tool: V4.1.1-Build(2021.03.12-98201trunc)_D64
Copyright (c) 2020, DMHS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
DMHS> connect
execute success
DMHS> clear exec lsn
execute success
DMHS>
复制
6.源端日志显示
7.目的端日志显示
8.加载数据字典
DMHS> load 0 "sch.name='YUANZJ'" CLEAR|DICT
CSL[WARN]: Detect the CLEAR mask, the mask will empty all dict file, please confirm whether to continue?(Y/N)Y
copy mask is : |CLEAR|DICT|REP
execute finish, please look up log file of exec module to check data load result
DMHS>
DMHS> load 0 "sch.name='YUANZJ'" DROP|CREATE|INSERT|DICT
CSL[WARN]: Detect the DROP mask, this mask will drop target table, confirm to continue?(Y/N)Y
copy mask is : |CREATE|DROP|INSERT|TABLE|DICT|OBJID|REP
execute finish, please look up log file of exec module to check data load result
复制
9.源端日志显示
10.目的端日志显示
11.打开cpt日捕获
DMHS> start
execute success
复制
12.源端和目的端日志显示
六、验证数据
1.目的端同步数据
2.更新源端数据
select * from "YUANZJ"."EMP";
insert into emp values (8890,'Damon','DBA',7788,sysdate,800,100,10);
update emp set ename='yuanzj' where empno=1234;
delete from emp where empno=8888;
复制
3.查看目的端数据相应变化
4.测试DDL语句
a.源端建TEST表
b.目的端查看
c.日志变化
d.删除test表
源端
目的端
日志变化