一、前言
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 = 1RLOG_APPEND_LOGIC = 1FAST_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 functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATHexport DMHS_HOME=/opt/dmhsexport 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 functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/.local/bin:$HOME/binexport PATH#Use for oracle12c install added by jt&&yzjPS1=[`whoami`@`hostname`:'$PWD]$ '; export PS1TMP=/tmp; export TMPTMPDIR=$TMP; export TMPDIRORACLE_BASE=/u01/app/oracle; export ORACLE_BASEORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1; export ORACLE_HOMEORACLE_SID=orcl; export ORACLE_SIDORACLE_TERM=xterm; export ORACLE_TERMPATH=/usr/sbin:/usr/local/bin:$PATH:$ORACLE_HOME/bin:$PATH; export PATHLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATHCLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATHNLS_LANG=AMERICAN_AMERICA.ZHS16GBK; export NLS_LANG
其中当数据存在中文时,达梦建议:需将 DMHS 运作所在窗口的 NLS_LANG 设置为对应的字符集,建议使用 AMERICAN_AMERICA.ZHS16GBK
三、创建测试用户和测试数据
1.源端创建测试用户和测试数据
1)创建测试用户:yuanzj
[dmdba@yuanzjdm8 ~]$ disql SYSDBA/SYSDBA123open fail! path:./libcrypto.so服务器[LOCALHOST:5236]:处于普通打开状态登录使用时间 : 2.979(ms)disql V8SQL> 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/yuanzj1234open fail! path:./libcrypto.so服务器[LOCALHOST:5236]:处于普通打开状态登录使用时间 : 1.378(ms)disql V8SQL> start utlsampl.sql
2.目标端创建测试用户
1.创建测试用户
[oracle@yuanzjora19c:/home/oracle]$ sqlplus sys/oracle@orclpdb1 as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 28 06:25:18 2021Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle. All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.3.0.0.0SYS@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.zipcreating: 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/dmocilibcrypto.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]# lsbin 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 MDownloading packages:Running transaction checkRunning transaction testTransaction test succeededRunning 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 -junixODBC 2.3.1DRIVERS............: etc/odbcinst.iniSYSTEM DATA SOURCES: etc/odbc.iniFILE DATA SOURCES..: etc/ODBCDataSourcesUSER DATA SOURCES..: root/.odbc.iniSQLULEN Size.......: 8SQLLEN Size........: 8SQLSETPOSIROW Size.: 8
[root@yuanzjora19c ~]# cat /etc/odbc.ini[ORACLE]Description = ORACLE ODBC DSNDriver = OracleSERVER = 127.0.0.1PORT = 1521ServerName = 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 OracleDriver = u01/app/oracle/product/19.0.0/dbhome_1/lib/libsqora.so.19.1Threading = 0
c.验证连通性

2.安装达梦HS
[oracle@yuanzjora19c:/home/oracle/orasoft]$ unzip dmhs_V3.1.3_oracle12c_rev95459_rh6_64_veri_20201124.zip -d u01/app/dmhsArchive: dmhs_V3.1.3_oracle12c_rev95459_rh6_64_veri_20201124.zipcreating: 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]$ lsbin 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.hsMGR[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-01MGR[INFO]: 成功加载配置文件,站点号:1, 管理端口:5345, 轮询间隔:3MGR[INFO]: 管理 服务正在监听管理端口:5345
2.打开新的窗口,启动执行器
[oracle@yuanzjora19c:/home/oracle]$ cd /u01/app/dmhs/bin[oracle@yuanzjora19c:/u01/app/dmhs/bin]$ ./dmhs_consoleDMHS console tool: V3.1.3-Build(2020.11.24-95459trunc)_D64Copyright (c) 2020, DMHS. All rights reserved.DMHS> connectexecute successDMHS> start execexecute successDMHS>
3. 目的端日志显示

4.启动源端数据库(DM数据库)server
[root@yuanzjdm8 bin]# ./dmhs_server dmhs.hsMGR[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-01MGR[INFO]: 成功加载配置文件,站点号:2, 管理端口:5345, 轮询间隔:3MGR[INFO]: 管理 服务正在监听管理端口:5345
5.打开新的窗口,连接源端 DMHS 服务,设置日志捕获模块起始 LSN。
[root@yuanzjdm8 ~]# cd /opt/dmhs/bin[root@yuanzjdm8 bin]# ./dmhs_consoleDMHS console tool: V4.1.1-Build(2021.03.12-98201trunc)_D64Copyright (c) 2020, DMHS. All rights reserved.Type ? or "help" for help, type "quit" to quit console.DMHS> connectexecute successDMHS> clear exec lsnexecute successDMHS>
6.源端日志显示

7.目的端日志显示

8.加载数据字典
DMHS> load 0 "sch.name='YUANZJ'" CLEAR|DICTCSL[WARN]: Detect the CLEAR mask, the mask will empty all dict file, please confirm whether to continue?(Y/N)Ycopy mask is : |CLEAR|DICT|REPexecute finish, please look up log file of exec module to check data load resultDMHS>DMHS> load 0 "sch.name='YUANZJ'" DROP|CREATE|INSERT|DICTCSL[WARN]: Detect the DROP mask, this mask will drop target table, confirm to continue?(Y/N)Ycopy mask is : |CREATE|DROP|INSERT|TABLE|DICT|OBJID|REPexecute finish, please look up log file of exec module to check data load result
9.源端日志显示

10.目的端日志显示

11.打开cpt日捕获
DMHS> startexecute 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表
源端

目的端

日志变化






