文章目录
前言
达梦数据实时同步软件(以下简称 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