文章目录
- 前言
- 1 数据库安装部署(oracle11g 源端)
- 2 数据库安装部署(dm8 目的端)
- 3 规划路径/端口
- 4 安装前准备(oracle11g 源端)
- 4.1 开启归档
- 4.2 开启附加日志
- 4.3 关闭 oracle 的回收机制
- 4.4 检查字符集是否一致
- 4.5 创建同步用户及授权
- 4.6 root 用户安装 odbc
- 5 安装前准备(dm8 目的端)
- 5.1 开启归档
- 5.2 开启逻辑日志
- 5.3 创建同步用户及授权
- 6 DMHS 服务部署(dm8 目的端)
- 6.1 部署 dmhs 服务
- 6.2 配置服务文件
- 6.3 启动服务
- 7 DMHS 服务部署(Oracle11g 源端)
- 7.1 部署 dmhs 服务
- 7.2 配置服务文件
- 7.3 启动服务
- 8 验证同步效果
- 8.1 登录 DM 检查表是否存在
- 8.2 登录 Oracle 创建表及添加数据
- 8.3 登录 DM 验证同步结果
- 9 问题解决
- 9.1 dmhs.key 缺失或失效
- 9.2 目的端 exec 模块加载失败
- 9.3 源端 log analysis 模块加载失败
- 9.4 表数据中文乱码问题
- 9.5 源端 log exec start fail
- 总结
前言
达梦数据同步软件(Heterogeneous database Synchronization for DM,缩写为DMHS)是达梦公司推出的新一代支持异构环境的高性能、高可靠、高可扩展数据库实时同步系统。该产品基于成熟的关系数据模型和标准接口,跨越多种软硬件平台,支持强大而灵活的拓扑结构,能以极少的系统开支实现秒级数据实时同步,可广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发、多业务中心等业务领域。
目前达梦的 DMHS 可以实现多种数据库与达梦数据库之间的数据实时同步。本文则详细介绍了 Oracle 11g 到 dm8 的数据同步安装部署过程。
1 数据库安装部署(oracle11g 源端)
请参考官方文档进行 Oracle11g 安装部署,确保数据库可正常使用。
2 数据库安装部署(dm8 目的端)
请参考官方文档进行 DM8 单机安装部署,确保数据库可正常使用。
达梦数据库 - 单机规范化部署
3 规划路径/端口
IP 地址 | 服务名称 | 版本 | 服务端口 | 部署目录 |
192.168.163.147 | Oracle 11g | Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production | 1521 | /data/oracle |
/ | DMHS 源端 | dmhs_oracle_rh6_ 64_veri_20220301_x86_rh7 | 5345 | /opt/dmhs/release |
192.168.163.148 | DM 8 | DM Database Server 64 V8 | 5236 | /home/dmdba/dmdbms |
/ | DMHS 目的端 | dmhs_dm8_rh6_64_veri_20220301_x86_kylin10 | 5345 | /opt/dmhs/release |
4 安装前准备(oracle11g 源端)
4.1 开启归档
切换用户(尽量使用以下带 - 的方式切换用户)
su – oracle
创建目录
mkdir /data/oracle/oradata/orcl/archlog
连接数据库
sqlplus / as sysdba
# 关闭数据库服务
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=’/data/oracle/oradata/orcl/archlog’;
# 恢复为 open 状态
SQL> alter database open;
# 再次检查归档
SQL> archive log list;
4.2 开启附加日志
附加日志(supplemental log)指数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,进行数据的分析。
检查附加日志
SQL> 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;
开启数据库最小附加日志级全列日志
SQL> 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;
4.3 关闭 oracle 的回收机制
检查 oracle 回收机制 on/off
SQL> show parameter recyclebin;
# 如果是on,需要关闭oracle回收机制
SQL> alter system set recyclebin=off deferred;
需要重启数据库后才生效。
4.4 检查字符集是否一致
先查询 oracle 数据库的字符集:(AMERICAN_AMERICA.ZHS16GBK)
SQL> select userenv(‘language’) from dual;
再查询系统字符集
echo $NLS_LANG
# 如果该变量值为空或者与查询结果不一致,则将该变量设置为查询结果的值
vi ~/.bash_profile
# 增加 export NLS_LANG=”sql查询结果”
source ~/.bash_profile
4.5 创建同步用户及授权
启动 oracle 数据库。
SQL> 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;
4.6 root 用户安装 odbc
查看是否安装 odbc
rpm -qa|grep unixODBC
添加 odbc 环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
安装 odbc
yum -y install unixODBC unixODBC-devel
安装完成后,执行以下命令:
odbcinst -j
配置 unixODBC
新增 odbc.ini 文件
vim /etc/odbc.ini
写入以下内容:
[ORACLE]
Description = Oracle ODBC driver for Oracle 11g
Driver= Oracle in OraDb11g_home1
SERVER = 192.168.163.147
ServerName = orcl
UserID = DMHS
Password = DMHS
Port = 1521
配置 odbcinst.ini 文件
vim /etc/odbcinst.ini
增加以下内容:
[Oracle in OraDb11g_home1]
Description = ODBC DRIVER FOR ORACLE
Driver = /ora/oracle/product/11.2.0/db_1/lib/libsqora.so.11.1
Threading = 0
查看是否缺少依赖:
ldd /data/oracle/product/11.2.0/lib/libsqora.so.11.1
发现缺少依赖 libodbcinst.so.1 文件。
查找系统其他位置是否存在依赖文件:
find / -name libodbcinst*
复制相应文件到依赖路径下:
cp /usr/lib64/libodbcinst.so.2 /lib64/libodbcinst.so.1
ldd /data/oracle/product/11.2.0/lib/libsqora.so.11.1
再次查看发现所有依赖都可被找到。
配置完成之后,可使用 isql 命令测试配置是否正确。
注意要用 oralce 用户测试。
isql -v ORACLE DMHS DMHS
5 安装前准备(dm8 目的端)
5.1 开启归档
连接数据库
disql SYSDBA/SYSDBA@localhost:5236
查询归档是否开启,Y/N
SQL> select arch_mode from v$database;
开启归档
alter database mount;
alter database archivelog;
alter database add archivelog ‘TYPE=LOCAL,DEST=/home/dmdba/dmdbms/data/DAMENG/arch,FILE_SIZE=1024,SPACE_LIMIT=10240’;
alter database open;
再次查询归档是否开启,Y/N
select arch_mode from v$database;
5.2 开启逻辑日志
执行数据库后重启数据库服务生效
SQL> SP_SET_PARA_VALUE(2,’RLOG_APPEND_LOGIC’,1);
SQL> exit;
DmServiceDMSERVER restart;
查询逻辑日志是否开启:1/0
SQL> SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME=’RLOG_APPEND_LOGIC’;
dm.ini 配置参数中“FAST_COMMIT”必须为 0,否则会导致逻辑日志不全而影响同步。
SQL> select para_value from v$dm_ini where para_name = 'FAST_COMMIT';
输出为 0 则正常。
5.3 创建同步用户及授权
创建用户
SQL> create user DMHS identified by "DMHS_1234" default tablespace MAIN temporary tablespace TEMP;
给用户授权
SQL> grant resource to DMHS;
SQL> grant select any table to DMHS;
SQL> grant dba to DMHS;
SQL> grant unlimited tablespace to DMHS;
6 DMHS 服务部署(dm8 目的端)
6.1 部署 dmhs 服务
解压安装包
mkdir /opt/dmhs
cd dmhs
unzip dmhs_dm8_rh6_64_veri_20220301_x86_kylin10.zip
修改配置文件
cd /opt/dmhs/release/
vi /opt/dmhs/release/dmhs.hs
文件内容:
<?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.163.148</db_server>
<db_user>DMHS</db_user>
<db_pwd>DMHS_1234</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>
6.2 配置服务文件
将模板文件,复制一份为正式服务并授权
cp TemplateDmhsService DmhsService
chmod +x DmhsService
编辑文件
vi DmhsService
修改DmhsService以下内容:
#set execute environment
#REPLACE DMHS_HOME path
DMHS_HOME=/opt/dmhs/release
#REPLACE program dir
PROG_DIR=/opt/dmhs/release
#REPLACE program config path
CONF_PATH=/opt/dmhs/release/dmhs.hs
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=
HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
6.3 启动服务
dmdba 用户到 /opt/dmhs/release 目录下执行以下命令:
./DmhsService start
./dmhs_console
# 启动 exec 模块
DMHS> start exec
执行完成后,可以在 /opt/dmhs/release/log 目录下查看日志文件:
cd /opt/dmhs/release/log
tail -f dmhs_202207.log
7 DMHS 服务部署(Oracle11g 源端)
7.1 部署 dmhs 服务
root 用户执行以下操作:
解压安装包
mkdir /opt/dmhs
unzip dmhs_oracle_rh6_64_veri_20220301_x86_rh7.zip
修改配置文件
cd /opt/dmhs/release/
vi /opt/dmhs/release/dmhs.hs
文件内容:(注意修改俩 ip 地址)
<?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.163.147: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.163.148</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>
7.2 配置服务文件
将模板文件,复制一份为正式服务并授权
cp TemplateDmhsService DmhsService
chmod +x DmhsService
编辑文件
vi DmhsService
修改DmhsService以下内容:
#set execute environment
#REPLACE DMHS_HOME path
DMHS_HOME=/opt/dmhs/release
#REPLACE program dir
PROG_DIR=/opt/dmhs/release
#REPLACE program config path
CONF_PATH=/opt/dmhs/release/dmhs.hs
#REPLACE need library path, LD_LIBRARY_PATH/LIBPATH
NEED_LIB_PATH=
HS_NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
7.3 启动服务
oracle 用户到 /opt/dmhs/release 目录下执行以下命令:
./DmhsService start
./dmhs_console
DMHS> clear exec lsn
DMHS> COPY 0 "SCH.NAME='DMHS'" CREATE
DMHS> COPY 0 "SCH.NAME='DMHS'" INSERT|THREAD|2
DMHS> start cpt
8 验证同步效果
8.1 登录 DM 检查表是否存在
使用 dmdba 用户登录DM数据库,确认数据表不存在
disql DMHS/DMHS_1234
# 查看此时表数据量
SQL> select table_name from user_tables;
8.2 登录 Oracle 创建表及添加数据
使用 oracle 用户登录 Oracle 数据库,创建数据表,并添加数据。
# 创建表
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;
8.3 登录 DM 验证同步结果
在 dmdba 用户下执行命令,连接数据库
disql dmhs/DMHS_1234
# 查看系统表,确定数据表 "DMHS.TEST" 在达梦数据库中已创建
SQL> select table_name from user_tables;
# 查询表记录,数据跟 Oracle 数据库中数据表记录一致
SQL> select * from DMHS.TEST;
至此,Oracle 11g 到 dm8 的数据同步部署成功!
若要退出,则先于源端执行 stop cpt ,再于目的端执行 stop exec 。
9 问题解决
9.1 dmhs.key 缺失或失效
问题描述:
[dmdba@localhost release]$ ./DmhsService start
Starting DmhsService: [ FAILED ]
MGR[INFO]: DMHS start up, current version: V4.1.3-Build(2022.02.24-106302trunc)_D64 (The beta)(Enterprise Edition)
MGR[WARN]: The beta version used for more than 3 months, please apply for a formal key.
解决办法:
在 /opt/dmhs/release 目录下增加一个在有效使用期限内的 dmhs.key 文件。
9.2 目的端 exec 模块加载失败
问题描述:
DMHS> start exec
CSL[ERROR]: load execute module failure
解决办法:
ldd libdmhs_exec.so
发现缺少 libmoci.so 文件,执行以下命令查找:
find / -name libmoci.so
找到文件后复制到 /home/dmdba/dmdbms/bin 目录下即可。
重新启动控制台,启动 exec 模块成功。
9.3 源端 log analysis 模块加载失败
问题描述:
DMHS> clear exec lsn
CSL[ERROR]: load log analysis module failure
解决办法:
ldd libdmhs_exec.so
发现缺少 libclntsh.so.11.1 文件,root 用户执行以下命令查找:
find / -name libclntsh.so*
找到文件后复制到依赖可以找到的目录下(如 /lib64)即可。
cp /data/oracle/product/11.2.0/lib/libclntsh.so.11.1 /lib64/libclntsh.so.11.1
重新启动控制台,启动 exec 模块成功。
9.4 表数据中文乱码问题
问题描述:
查询数据库DMHS.TEST时,表的中文数据为乱码。
解决办法:
Oracle端
检查环境变量 NLS_LANG ,设置为与数据库一致。
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
DM端
涉及到 Oracle 数据同步的时候,需要配置字符集环境变量。
export LANG=zh_CN. GBK
(DM 数据同步到 DM 不需要配置字符集环境变量)
9.5 源端 log exec start fail
问题描述:
[dmdba@localhost bin]$ ./dmhs_server dmhs.hs
MGR[INFO]:DMHS start up,...
...
EXE[ERROR]: ...NULL SQL_ERROR = SQL:SELECT ...
...
MGR[ERROR]: log exec start fail
解决办法:
SQL> grant dba to DMHS;
总结
Oracle 11g 到 dm8 的数据同步安装部署过程基本如上。其难点主要在于数据库的安装、实验环境的配置(如环境变量和字符集设置)、odbc的配置和相关依赖的缺失解决。还要额外注意的是使用的版本问题和DMHS模块启动关闭顺序问题。
如果报错找不到相关依赖文件,先到 dmhs 的 bin 目录下查看相关文件是否存在。若存在,则是 LD_LIBRARY_PATH 环境变量未配置好,没有添加 dmhs 的 bin 目录为环境变量;若不存在,则执行 find / -name lib*.so,将其中一份复制到 /dmhs/bin 目录下或者系统可读依赖目录下即可。
笔者感觉把 DMHS 部署过程中大部分的坑都踩完了 :),后来发现同事踩的坑更多哈哈哈哈。如果遇到什么奇怪的坑,欢迎评论互相交流。如果文中有误,欢迎指出,大家共同交流进步!