DMHS数据同步工具
本章节主要介绍DM数据同步工具DMHS的使用,通过将oracle11g的数据同步到DM8的过程来理解DMHS的功能和作用。
安装前的准备
端口、服务信息
IP地址 | 服务名称 | 版本 | 端口 | 安装路径 |
---|---|---|---|---|
192.168.19.136 | Oracle | Oracle11.0.2 | 1521 | /opt/oracle |
/ | DMHS源端 | dmhs_V3.3.20_oracle_rev141041_rh6_64_20231010 | 5345 | /opt/dmhs |
192.168.19.133 | DM | DM8 | 5236 | /home/dmdba/dmdbms |
/ | DMHS目的端 | dmhs_V4.3.32_dm8_rev163952_rh6_64_20240710 | 5345 | /home/dmdba/dmhs |
Oracle11g源端的准备
开启归档
-
切换至oracle用户,创建目录
shellmkdir /data/oracle/oradata/orcl/archlog
-
连接数据库,进行归档设置
SQL# 关闭数据库服务 SQL> shutdown immediate # 以 mount 方式启动 oracle 数据库 SQL> startup mount # 开启归档 SQL> alter database archivelog; # 设置归档文件路径(如果使用本地路径存放归档日志,需要将 db_recovery_file_dest 参数置空,然后设置 log_archive_dest 参数 SQL> alter system set db_recovery_file_dest=''; SQL> alter system set log_archive_dest='/opt/oracle/oradata/orcl/archlog'; # 恢复为 open 状态 SQL> alter database open; # 再次检查归档 SQL> archive log list;
开启附加归档
附加日志(supplemental log)指数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,进行数据的分析。
-
检查附加日志
SQLSQL> select SUPPLEMENTAL_LOG_DATA_MIN min,SUPPLEMENTAL_LOG_DATA_PK pk,SUPPLEMENTAL_LOG_DATA_UI ui,SUPPLEMENTAL_LOG_DATA_FK fk, SUPPLEMENTAL_LOG_DATA_ALL "all" from v$database;
-
开启数据库最小附加日志级全列日志
SQLSQL> alter database add supplemental log data; SQL> alter database add supplemental log data (all) columns; # 再次检查附加日志 SQL> select supplemental_log_data_min, supplemental_log_data_all from v$database;
关闭Oracle的回收机制
-
检查Oracle的回收机制
SQLSQL> show parameter recyclebin; # 如果是on,需要关闭oracle回收机制 SQL> alter system set recyclebin=off deferred;
-
重启数据库生效
-
检查字符集是否一致
-
先查询Oracle数据库的字符集
SQLSQL> select userenv('language') from dual;
- Oracle数据库字符集:AMERICAN_AMERICA.WE8MSWIN1252
-
再查询系统字符集
shellecho $NLS_LANG # 如果该变量值为空或者与查询结果不一致,则将该变量设置为查询结果的值 vi ~/.bash_profile # 增加 export NLS_LANG="sql查询结果" source ~/.bash_profile
创建同步用户及授权
-
启动Oracle数据库,进行同步用户的相关创建与授权
SQLSQL> create user DMHS identified by "DMHS" default tablespace USERS temporary tablespace TEMP profile DEFAULT; SQL> grant connect to DMHS; SQL> grant create any table to DMHS; SQL> grant select any table to DMHS; SQL> grant select any dictionary to DMHS; SQL> grant create session to DMHS; SQL> grant lock any table to DMHS; SQL> grant execute on dbms_flashback to DMHS; SQL> grant unlimited tablespace to DMHS;
root用户安装ODBC
-
查看是否安装ODBC
shellrpm -qa|grep unixODBC
-
添加ODBC的环境变量
shellexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
-
安装ODBC
shellyum -y install unixODBC unixODBC-devel
-
这里我已经安装过了
-
如果这里yum报错:
cannot find a valid baseurl for repo-base/7/x86_64
,可以参考这篇文章: -
安装完成后执行命令
shellodbcinst -j
-
-
配置unixODBC
shellvim /etc/odbc.ini
-
写入内容:
shell[ORACLE] Description = Oracle ODBC driver for Oracle 11g Driver= Oracle in OraDb11g_home1 SERVER = 192.168.19.136 ServerName = orcl UserID = DMHS Password = DMHS Port = 1521
-
-
配置odbcinst.ini文件
shellvim /etc/odbcinst.ini
-
增加以下内容:
shell[Oracle in OraDb11g_home1] Description = ODBC DRIVER FOR ORACLE Driver = /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1 Threading = 0
-
-
查看是否缺少依赖项
shellldd /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1
- 缺少libodbcinst.so.1文件
-
查找系统其他地方是否有这个依赖
shellfind / -name libodbcinst*
-
将其他地方有的文件复制到路径下
shellcp /usr/lib64/libodbcinst.so.2 /lib64/libodbcinst.so.1 ldd /opt/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1
- 这里就把依赖的路径给写进去了
-
使用issql进行测试(在oracle用户下进行测试)
shellisql -v ORACLE DMHS DMHS
- 连接成功,说明配置啥的都是可以使用的
DM8目的端的准备
开启归档
-
连接数据库,查询归档是否开启
SQLSQL> select arch_mode from v$database;
-
我这里是开启了归档
-
如果没有开启,需要用下面的命令进行开启归档
SQLalter database mount; alter database archivelog; alter database add archivelog 'TYPE=LOCAL,DEST=/dmdata/arch,FILE_SIZE=1024,SPACE_LIMIT=10240'; alter database open;
-
开启逻辑日志
-
使用SYSDBA连接数据库执行命令
SQLSP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1); select para_value from v$dm_ini where para_name in ('RLOG_APPEND_LOGIC');
-
dm.ini 配置参数中"FAST_COMMIT"必须为 0,否则会导致逻辑日志不全而影响同步
SQLSQL> select para_value from v$dm_ini where para_name = 'FAST_COMMIT';
创建同步用户及授权
-
创建用户
SQLCREATE TABLESPACE HSEXEC DATAFILE 'HSEXEC.DBF' size 128; CREATE USER HSEXEC IDENTIFIED by "1314520dsy" DEFAULT TABLESPACE HSEXEC DEFAULT INDEX TABLESPACE HSEXEC; GRANT VTI TO HSEXEC; GRANT PUBLIC TO HSEXEC; GRANT RESOURCE TO HSEXEC; GRANT DBA TO HSEXEC;
-
授权
SQLSQL> grant resource to HSEXEC; SQL> grant select any table to HSEXEC; SQL> grant dba to HSEXEC; SQL> grant unlimited tablespace to HSEXEC;
DMHS服务部署
DM8目的端的部署
部署dmhs服务
-
修改可执行文件的权限,然后执行安装程序
shellchmod +x /opt/dmhs_V4.3.32_dm8_rev163952_rh6_64_20240710.bin ./dmhs_V4.2.60_dm8_rev106302_rh6_64_veri_20220225.bin -i
-
开始安装,根据提示进行选择
- 至此,DMHS已经安装好了
修改服务配置
-
进入DMHS安装目录下的bin子目录,通过修改示例服务脚本,准备当前的服务启动脚本
shellcd /home/dmdba/dmhs/bin cp TemplateDmhsService DmhsService vim DmhsService
-
需要修改的内容:
shell#set execute environment #REPLACE DMHS_HOME path DMHS_HOME=/home/dmdba/dmhs #REPLACE program dir PROG_DIR=/home/dmdba/dmhs/bin #REPLACE program config path CONF_PATH=/home/dmdba/dmhs/bin/dmhs.hs #REPLACE need library path, LD_LIBRARY_PATH/LIBPATH NEED_LIB_PATH=/home/dmdba/dmhs/bin:/home/dmdba/dmhs/hs_agent:/home/dmdba/dmhs/db/bin HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
-
-
在dmhs的bin目录下,新增dmhs.hs配置文件
shellcd /home/dmdba/dmhs/bin vim dmhs.hs
-
配置内容如下:
XML<?xml version="1.0" encoding="GB2312"?> <dmhs> <base> <lang>en</lang> <mgr_port>5345</mgr_port> <chk_interval>2</chk_interval> <ckpt_interval>45</ckpt_interval> <siteid>4</siteid> <version>2.0</version> </base> <exec> <recv> <data_port>5346</data_port> </recv> <db_type>dm8</db_type> <db_server>192.168.19.133</db_server> <db_user>HSEXEC</db_user> <db_pwd>1314520dsy</db_pwd> <db_port>5236</db_port> <char_code>PG_UTF8</char_code> <db_name></db_name> <exec_thr>8</exec_thr> <exec_sql>1024</exec_sql> <exec_trx>2000</exec_trx> <exec_rows>2000</exec_rows> <msg_col_size>30000</msg_col_size> <ddl_continue>1</ddl_continue> <affect_row>0</affect_row> <exec_policy>2</exec_policy> <enable_rowid>0</enable_rowid> <clear_trx_file>1</clear_trx_file> <trx_max_file>8</trx_max_file> </exec> </dmhs>
-
启动DMHS服务
-
进入dmhs安装的bin子目录,执行配置好了的服务脚本
shell./DmhsService start ./dmhs_console # 启动 exec 模块 DMHS> start exec
- 这里我遇到报错:
(ORACLE NLS_LANG) is not set in this script, starting failed!!!
- 分析原因,是DmhsService的参数没写完整,解决方法:写参数
HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
- 这里我遇到报错:
-
可以在
/home/dmdba/dmhs/log
下看到相关的日志
Oracle源端的部署
部署dmhs服务
root权限下执行操作
-
进入到dmhs的目录下,先赋予安装程序权限,执行安装
shell##赋予权限 chmod a+x dmhs_V4.3.28_oracle_rev152326_rh6_64_20240223_sp7.bin [root@localhost dmhs]# ./dmhs_V4.3.28_oracle_rev152326_rh6_64_20240223_sp7.bin -i
- 操作过程跟上面DM数据库的一样
-
修改配置文件
shellcd /opt/dmhs/bin/ vi /opt/dmhs/bin/dmhs.hs
-
修改内容如下:(注意修改两个IP)
XML<?xml version="1.0" encoding="GB2312"?> <dmhs> <base> <lang>en</lang> <mgr_port>5345</mgr_port> <ckpt_interval>45</ckpt_interval> <siteid>1</siteid> <version>2.0</version> </base> <cpt> <db_type>oracle11g</db_type> <db_server>192.168.19.136:1521/orcl</db_server> <db_user>DMHS</db_user> <db_pwd>DMHS</db_pwd> <ddl_mask>op:obj</ddl_mask> <char_code>PG_UTF8</char_code> <constraint>1</constraint> <arch> <clear_interval>600</clear_interval> <clear_flag>0</clear_flag> </arch> <send> <ip>192.168.19.133</ip> <mgr_port>5345</mgr_port> <data_port>5346</data_port> <filter> <enable> <item>DMHS.*</item> </enable> <disable> </disable> </filter> <map> <item>DMHS.*==DMHS.*</item> </map> </send> </cpt> </dmhs>
-
配置服务文件
-
将模版文件复制一份为正式服务并授权
shellcp TemplateDmhsService DmhsService chmod +x DmhsService
-
编辑文件
shellvi DmhsService
-
编辑内容:
shell#set execute environment #REPLACE DMHS_HOME path DMHS_HOME=/opt/dmhs/bin #REPLACE program dir PROG_DIR=/opt/dmhs/bin #REPLACE program config path CONF_PATH=/opt/dmhs/bin/dmhs.hs #REPLACE need library path, LD_LIBRARY_PATH/LIBPATH NEED_LIB_PATH= HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
-
启动服务器
-
oracle 用户到 /opt/dmhs/bin 目录下执行命令
shell./DmhsService start ./dmhs_console
shellDMHS> clear exec lsn DMHS> COPY 0 "SCH.NAME='DMHS'" CREATE DMHS> COPY 0 "SCH.NAME='DMHS'" INSERT|THREAD|2 DMHS> start cpt
验证同步效果
登录DM检查表是否存在
-
使用dmdba用户登录DM数据库,看数据表情况
SQLdisql HSEXEC/1314520dsy # 查看此时表数据量 SQL> select table_name from user_tables;
- 这里就只有系统表格,没有其他多余的
-
登录Oracle创建表及添加数据
-
使用oracle用户登录,创建数据表,添加数据
SQL# 创建表 SQL> create table dmhs.test(id int,name varchar2(20)); # 添加数据 SQL> insert into dmhs.test values(1,'老吴'); SQL> insert into dmhs.test values (2,'小吴'); SQL> insert into dmhs.test values (3,'小圆'); SQL> commit; # 查看表记录 SQL> select * from dmhs.test;
- 这里oracle出现了乱码(目前来说不是重要问题)
-
-
登录DM验证同步结果
-
在dmdba用户执行命令
shelldisql HSEXEC/1314520dsy
-
查看同步情况
SQL# 查看系统表,确定数据表 "DMHS.TEST" 在达梦数据库中已创建 SQL> select table_name from user_tables; # 查询表记录,数据跟 Oracle 数据库中数据表记录一致 SQL> select * from DMHS.TEST;
- 也能够勉强看出,这是同步过来了
-
总结
- 本次主要搭建DMHS进行Oracle到DM8数据库之间的数据同步,总结上面的安装部署,我踩了很多坑,特别是在oracle数据库上。在完成安装部署后回头一看,上面步骤写的很容易,但自己搭建的时候绝对是问题百出,当然,积极解决问题而不是抱怨问题,最终都会解决。
- 此外还有些小问题,像编码有误等我就没怎么在这里展示,主要还是以DMHS的搭建为主。