11.DMHS工具使用-DM对接Oracle

前言

达梦数据实时同步软件(以下简称 DMHS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影响,能以极少的系统开销实现秒级数据实时同步复制,本篇主要讲使用该工具对接使用 ORACLE 迁移 DM 的过程步骤以及遇到的问题

注 : ORACLE 、DM 所需的 DMHS 包为两个不同的包

一、安装部署

1. 环境检查

## 需要源端目的端一致
echo $LANG
## 时间一致
date
## 关闭防火墙
systemctl status firewalld.service  
systemctl stop firewalld.service  
systemctl disable firewalld.service  
## 关闭 SELinux
sed -i 's/^SELINUX.*/SELINUX = disabled/g' /etc/selinux/config

2. dmhs 安装

  • 源端目标端服务器执行安装(安装包需要找社区人员或者销售获取)

3. 存放 DMOCI 以及对应的 key

  • 源端目标端服务器都需要执行
  • key 肯定需要存放,不然会出现配置后无法登录问题,且没有报错
cp -r dmoci/* $DMHS_HOME/bin/
cp dmhs.key $DMHS_HOM/bin/dmhs.key

二、DM 目标端配置

1. dmhs 安装

cp -r dmoci/* $DMHS_HOME/bin/
cp dmhs.key $DMHS_HOM/bin/dmhs.key

2. 安装 ODBC

## 使用 root 用户
yum -y install unixODBC
odbcinst -j  

cat >> /etc/odbcinst.ini << EOF
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /home/dmdba/dmdbms/bin/libdodbc.so
EOF

## 没有需要新增
cat >  /etc/odbc.ini << EOF

[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 30236
EOF

  • 使用 dmdba 用户进行测试
isql dm8 -v

3. 数据库参数配置

  • 开启归档日志
    • 方法一 :
ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmarch/DMHS,TYPE=LOCAL,SPACE_LIMIT=0';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
    • 方法二 :
## 修改 dm.ini 文件的 arch_ini 参数为1
## 在 dm.ini 文件目录新建dmarch.ini 文件,添加以下内容
cat >  /opt/dm/data/DAMENG/dmarch.ini << EOF
ARCH_WAIT_APPLY            = 1   #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE                = LOCAL  #本地归档类型
ARCH_DEST                = /opt/dm/data/DAMENG/arch/  #本地归档存放路径
ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB
EOF
    • 确认归档是否开启
-- ARCH_MODE 为 Y ,表示启用归档;为 N,表示未启用。
SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL' AND ARCH_IS_VALID='Y';
  • 其他数据库参数
-- 开启逻辑追加日志
-- RLOG_APPEND_LOGIC 为 1 ,表示逻辑追加日志启用;为 0 表示未启用。
SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',1);
SP_SET_PARA_VALUE(1,'RLOG_APPEND_SYSTAB_LOGIC',1);
SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';

-- 检查在线日志
SELECT PATH FROM SYS.V$RLOGFILE;

-- 查询值为0即正常
select para_value from v$dm_ini where para_name = 'FAST_COMMIT';

4. 配置 DDL

-- 使用disql工具执行,需要先执行set define off和set char_code utf8来设置关闭本地变量和设置字符集编码,然后使用"start /xx/xx.sql"执行该脚本,如果是使用DM管理工具连接的数据库,可以直接复制SQL脚本内容到查询框执行即可
set define off
set char_code utf8
start /home/dmdba/dmhs/scripts/ddl_sql_dm8.sql

-- 检查
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMHS%' and status = 'VALID';
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y';

5. 目标端配置

  • 目标库配置文件,尽量不要通过上传文件覆盖,会产生权限问题
cd $DMHS_HOME/bin

## dmhs.hs 是默认的配置文件,也可以指定文件进行
cat >> dmhs.hs << EOF
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
 <base>    <!-- 管理模块的基本配置 -->
    <lang>en</lang>    <!-- 语言选项,ch 为中文,en 为英文 -->
    <mgr_port>5345</mgr_port>    <!-- 管理端口号,默认为5345-->
    <ckpt_interval>60</ckpt_interval>    <!-- 检查点间隔,默认60 -->
    <siteid>2</siteid>    <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
    <version>2.0</version>
</base>
<exec>    <!-- 执行模块的基本配置 -->
  <recv>
    <data_port>5346</data_port>    <!-- 当数据传递采用网络直连时,需要配置该参数,表明同步数据从该端口号获取。 -->
  </recv>
  <db_type>dm8</db_type>    <!-- 目标端数据库类型 -->
  <db_server>192.168.30.180</db_server>    <!-- 目标端数据库服务名或IP -->
  <db_user>SYSDBA</db_user>    <!-- 目标端数据库用户 -->
  <db_pwd>SYSDBA</db_pwd>    <!-- 用户的密码 -->
  <db_port>30236</db_port>    <!-- 目标端数据库端口 -->
  <db_name></db_name>    <!-- 默认数据库名,默认为空串(只针对dm6有用)-->
  <char_code>PG_GB18030</char_code>
  <exec_thr>4</exec_thr>    <!-- 执行线程个数,只有当 exec_mode 为 1 时才会生效!默认为1 -->
  <exec_sql>1024</exec_sql>    <!-- SQL 缓存大小,默认为 512M -->
  <exec_trx> 5000 </exec_trx>    <!-- 事务缓存个数,默认为 5000 -->
  <exec_rows>1000</exec_rows>    <!-- 批量绑定行数,默认为 250 -->
 </exec>
</dmhs>
EOF
  • 创建服务脚本
cp service_template/DmhsService .
sed -i 's/^DMHS_HOME.*/DMHS_HOME=$DMHS_HOME/' DmhsService
sed -i 's/^PROG_DIR.*/PROG_DIR=$DMHS_HOME\/bin/' DmhsService
sed -i 's/^CONF_PATH.*/CONF_PATH=$DMHS_HOME\/bin\/dmhs.hs/' DmhsService
sed -i 's/^HS_NLS_LANG.*/HS_NLS_LANG=""/' DmhsService
sed -i 's/^NEED_LIB_PATH.*/NEED_LIB_PATH=$DM_HOME\/bin:$DMHS_HOME\/dmhs\/bin/' DmhsService
## 查看修改
cat DmhsService |grep -E "^DMHS_HOME|^PROG_DIR|^CONF_PATH|^HS_NLS_LANG|^NEED_LIB_PATH"
  • 目标端启动
./DmhsService start
./dmhs_console
start exec

二、ORACLE 源端配置

1. 软件安装

cp -r dmoci/* $DMHS_HOME/bin/
cp dmhs.key $DMHS_HOM/bin/dmhs.key

2. 安装 ODBC

## 使用 dmdba 用户
odbcinst -j  
## 使用 root 用户
cat >> /usr/local/etc/odbcinst.ini << EOF
[Oracle ODBC Driver]
Description     = ODBC for Oracle
Driver          = /opt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1
EOF
## 没有需要新增
cat >>  /usr/local/etc/odbc.ini << EOF
[ORACLE]
Description = ORACLE ODBC DSN
Driver = Oracle ODBC Driver
SERVER = 192.168.30.180
USER = dmhs
PASSWORD = dmhs
Servername = test
PORT = 1521

EOF
  • 使用 dmdba 用户进行测试
isql -v ORACLE dmhs dmhs

3. ODBC 测试报错

3.1 libsqora.so.11.1 : file not found
  • 错误信息
[oracle@sdb1 admin]$ isql -v ORACLE                 
[01000][unixODBC][Driver Manager]Can't open lib '/opt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1' : file not found
[ISQL]ERROR: Could not SQLConnect
  • 处理方式
## 查看方式
ldd /opt/oracle/product/11.2.0/dbhome_1/lib/libsqora.so.11.1
find / -name "*libodbcinst*"
cd /usr/lib64/
ln -s /usr/lib64/libodbcinst.so.2 libodbcinst.so.1 

3.2 centos 7.9 原有 ODBC 版本低导致连接不上
  • centos 7.9 版本原本的 ODBC 比较低,会导致一直连接不上,需要进行升级
## 查看版本,此时版本为 unixODBC-2.3.1
rpm -qa | grep unixODBC
## 下载新的 unixODBC
rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
## 进行升级
yum -y upgrade unixODBC
## 查看版本,此时版本为 unixODBC-2.3.11
rpm -qa | grep unixODBC

4. 编码查看

sqlplus / as sysdba
--  查询字符级 sql AMERICAN_AMERICA.AL32UTF8 
select userenv('language') from dual;
-- 操作系统查看命令
echo $NLS_LANG

5. 数据库配置

-- 开启附加日志
alter database add supplemental log data;
alter database add supplemental log data (all) columns;
select supplemental_log_data_min,supplemental_log_data_all from v$database;

-- 开启归档
archive log list;
shutdown immediate;
startup mount;
alter database archivelog;
alter system set db_recovery_file_dest='';
alter system set log_archive_dest_1='location=/opt/oracle/arch';
alter database open;
archive log list

6. 用户赋权

create user dmhs identified by dmhs default tablespace testspace;
grant connect to dmhs;
grant select any table to dmhs;
grant select any dictionary to dmhs;
grant create session to dmhs;
grant lock any table to dmhs;
grant execute on dbms_flashback to dmhs;
grant all on sys.dmhs_ddl_sql to dmhs;
grant all on sys.col$ to dmhs;
grant all on sys.cdef$ to dmhs;
grant all on sys.lobfrag$ to dmhs;
grant all on sys.obj$ to dmhs;
grant all on sys.user$ to dmhs;
grant all on sys.ntab$ to dmhs;
grant all on sys.external_tab$ to dmhs;
grant all on sys.coltype$ to dmhs;
grant all on sys.tabsubpart$ to dmhs;
grant all on sys.tabcompart$ to dmhs;
grant all on sys.tab$ to dmhs;
grant all on sys.partobj$ to dmhs;
grant all on sys.lob$ to dmhs;
grant all on sys.ccol$ to dmhs;
grant all on sys.con$ to dmhs;
grant all on sys.dba_cons_columns to dmhs;
grant select on sys.V_$instance to dmhs;
grant select on sys.V_$database to dmhs;
grant execute on dbms to CHINALIFE1;

GRANT DBA TO dmhs;

7. 开启DDL

show parameter "_system_trig_enabled";
alter system set "_system_trig_enabled"=true;

8. 关闭回收机制

alter system set recyclebin=off deferred;
-- 查询是否关闭, OFF 即为关闭
show parameter recyclebin;

9. dmhs.hs 的配置

cat > $DMHS_HOME/bin/dmhs.hs << EOF
<?xml version="1.0" encoding="GB2312" ?>
<dmhs>
    <base>
        <lang>en</lang>
        <mgr_port>5345</mgr_port>
        <ckpt_interval>60</ckpt_interval>
        <siteid>180</siteid>
        <version>2.0</version>
    </base>
    <cpt>
        <db_type>ORACLE11g</db_type>
        <db_server>192.168.30.180/test</db_server>
        <db_user>dmhs</db_user>
        <db_pwd>dmhs</db_pwd>
        <char_code>PG_UTF8</char_code>
        <db_port>1521</db_port>
        <check_date>1</check_date>
        <ddl_mask>TABLE:PROCEDURE:FUNCATION:CHECK:SEQUENCE:PACKAGE:TYPE:USER:ROLE:TRUNCATE:CREATE:DROP:ALTER:OPERATITION:COMMENT:DELETE:TIME:PARTITION:FOREIGN</ddl_mask>
        <arch>
            <clear_flag>0</clear_flag>
            <clear_interval>600</clear_interval>
        </arch>
        <send>
            <ip>192.168.30.179</ip>
            <mgr_port>5345</mgr_port>
            <data_port>5346</data_port>
            <filter>
                <enable>
                    <item>testoracle.*</item>
                </enable>
                <disable>
                    <item>test.BIN$*</item>
                </disable>
            </filter>
            <map>
                <item>testoracle.*==testoracle.*</item>
            </map>
        </send>
    </cpt>
</dmhs>
EOF

10. 注册并开启同步

  • 创建服务脚本
cp service_template/DmhsService OracleDmhsService
sed -i 's/^DMHS_HOME.*/DMHS_HOME=$DMHS_HOME/' OracleDmhsService
sed -i 's/^PROG_DIR.*/PROG_DIR=$DMHS_HOME\/bin/' OracleDmhsService
sed -i 's/^CONF_PATH.*/CONF_PATH=$DMHS_HOME\/bin\/dmhs.hs/' OracleDmhsService
sed -i 's/^HS_NLS_LANG.*/HS_NLS_LANG=""/' OracleDmhsService
sed -i 's/^NEED_LIB_PATH.*/NEED_LIB_PATH=$DM_HOME\/bin:$DMHS_HOME\/dmhs\/bin/' OracleDmhsService
## 查看修改
cat OracleDmhsService |grep -E "^DMHS_HOME|^PROG_DIR|^CONF_PATH|^HS_NLS_LANG|^NEED_LIB_PATH"
  • 源端启动服务
./OracleDmhsService start
  • 源端开启同步
./dmhs_console
## 初始化归档日志起始位置
clear exec lsn 
## 装载数据
copy 0 "sch.name='DMHS'" DICT|LSN|CREATE|INSERT|INDEX

## 开始进行实时同步
start cpt

  • 其他案例
##为了初始化日志的起始位置
clear exec lsn
copy 0 "sch.name='DMHR'" DICT|LSN|CREATE|INSERT|INDEX
COPY 0 " sch.name='DMHR' and tab.name in ('TEST')"  DICT|LSN|CREATE|INSERT|INDEX 
COPY 0 " tab.name in ('DMHR.TEST')"  CREATE|INSERT|INDEX

参考内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值