1、部署DMHS前的准备
1.1、部署目标及软件版本说明
部署目标
使用DMHS实现源库(Oracle12c)到目标库(DM8)单向同步
软件版本说明
源端: Oracle12c
DMHS: dmhs_V4.1.48_oracle12_rev102088_rh6_64_veri_20210924.bin
目标端:dm8
DMHS: dmhs_V4.1.39_dm8_rev101315_rh6_64_veri_20210809.bin
DMDCI:dm8_20210909_x86_rh6_64_ent_8.1.2.70_dmdci.zip
1.2、DMHS基础知识
DMHS管理模块(MGR)
负责管理dmhs中的其他模块
DMHS同步服务模块(CPT、EXEC、NET)
负责dmhs数据同步
模块分布情况
源端: MGR、CPT、NET
目标端:MGR、EXEC、NET
DMHS配置方式
一、使用dmhs配置助手工具(dmhs软件安装目录/tool/dmhs_hsca)进行配置
二、使用WEB管理平台进行配置(hsem)
三、手动编辑dmhs.hs配置文件(dmhs软件安装目录/bin/dmhs.hs)
注:
本文通过手动修改dmhs.hs配置文件,配置dmhs服务
主要软件目录说明
bin:执行码、动态库等(dmhs_server、dmhs_console)
db:内置数据库(默认dm7)
doc:文档目录,包括搭建文档
guard(或hs_agent):guard或agent目录
scripts:脚本目录,包括DDL同步需要执行的相关SQL脚本等
tool:工具目录,包括dmhs配置助手工具等
2、DMHS配置
本节重点为DMHS的配置,确保源端及目标端能正常同步
省略步骤如下:
数据库软件安装
DMHS软件安装
注意:
关闭源端和目标端的防火墙
2.1、源端(Oracle12c)
命令前带#,说明是root用户执行
命令前带$,说明是oracle用户执行
操作系统和数据库层面的配置
设置本地链接库路径
DMHS在运行时,需加载本地Oracle动态库libclntsh.so
查找libclntsh.so
# find / -name 'libclntsh.so'
检查环境变量$LD_LIBRARY_PATH中是否包含此动态库的路径
$ echo $LD_LIBRARY_PATH
没有就修改profile
$ vi ~/.bash_profile
$ . ~/.bash_profile
注:
当系统不存在libclntsh.so文件,但有libclntsh.so.***的文件时,可使用以下命令创建一个软链接
ln -s libclntsh.so.*** libclntsh.so
检查源端的执行模块(cpt)是否正常
切换到DMHS安装目录
$ cd /home/oracle/dmhs/bin
检查libcpt_ora.so是否缺失依赖库
[oracle@localhost bin]$ ldd libcpt_ora.so
注:
若有not
found的库,需在本机寻找具体位置,并将其所在路径添加到环境变量$LD_LIBRARY_PATH中,使得libcpt_ora.so能找到其依赖库。(本机也没有的话需要下载)
下图为正确执行的输出(没有not found)
配置数据库网络服务名(即oracle的tnsname)
DMHS 装载历史数据时,需要通过数据库网络服务名来抽取数据库的数据。
vi $ORACLE_HOME\network\admin\tnsname.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
验证服务名是否正确(前提:要先创建dmhs数据库用户,并有相应的权限)
[oracle@localhost admin]$ sqlplus dmhs/dmhs@orcl
开归档及附加日志
DMHS 通过分析 ORACLE 数据库的归档/在线日志来捕获数据库的增量数据,DMHS运行之前,必须将数据库设置为归档模式,同时开启最小附加日志及全列日志。
- 开归档
SQL> shut immediate;
SQL> startup mount
alter system set db_recovery_file_dest=’’;
alter system set log_archive_dest=’/home/oracle/arch’;
alter database archivelog;
shut immediate;
startup
archive log list
- 开最小附加日志及全列日志
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;
正确的返回结果如下:
设置ORACLE客户端字符集
当数据库数据包含中文时,需将DMHS运作所在窗口的NLS_LANG设置为对应的字符集,建议使用AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
注:
本文档专注数据同步,暂时不关注同步过程中的中文字符问题
源端DDL支持
DMHS支持源端DDL的同步,需满足以下三个条件:
- 源端数据库必须运行DDL触发器的触发动作,即数据库参数_system_trig_enabled为TRUE或未设置
set lin 100
col PARAMETER for a35
col DESC for a35
select ksppinm PARAMETER,KSPPITY value,ksppdesc from x$ksppi where ksppinm like '%trig_enabled';
- 需要在源端数据库以sys用户,在sys模式下创建DDL触发器及DDL记录表,详情参照脚本dmhs_ddl.sql
切换到dmhs安装目录/scripts
cd /home/oracle/dmhs/scripts
检查用户及模式是否都为sys
sqlplus / as sysdba
select sys_context('USERENV','CURRENT_SCHEMA') from dual;
SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
-------------------------------------------
SYS
show user
USER is "SYS"
执行dmhs_ddl.sql(源库为oracle,故ddl脚本为ddl_sql_ora.sql)
@ddl_sql_ora.sql
注:
ddl_sql_ora.sql脚本使用到存储过程的地方,最后需添加/
可在脚本最后一行添加select ‘Finished!’ form
dual;(确保脚本运行到了最后一行)
- 日志捕获模块对ddl_mask进行设置
例如:<ddl_mask>op:obj</ddl_mask>
ddl_mask可对同步对象进行过滤,详细参数请参照ddl_mask参数说明
注:
下面会设置此参数,此处先跳过dmhs.hs相关的配置
- 设置用户权限
DMHS源端数据库用户,必须具有以下数据库权限(否则启动初始化同步时,会出现权限不足的错误)
grant SELECT ON SYS.V_$DATABASE to DMHS;
grant SELECT ON SYS.V_$SESSION to DMHS;
grant SELECT ON SYS.GV_$PARAMETER to DMHS;
grant SELECT ON SYS.GV_$INSTANCE to DMHS;
grant SELECT ON SYS.GV_$ARCHIVE_DEST to DMHS;
grant SELECT ON SYS.GV_$ARCHIVE to DMHS;
grant SELECT ON SYS.GV_$LOG to DMHS;
grant SELECT ON SYS.GV_$LOGFILE to DMHS;
grant SELECT ON SYS.DBA_TABLES to DMHS;
grant SELECT ON SYS.V_$INSTANCE to DMHS;
grant SELECT ON SYS.OBJ$ to DMHS;
grant SELECT ON SYS.USER$ to DMHS;
grant SELECT ON SYS.COL$ to DMHS;
grant SELECT ON SYS.DBA_CONS_COLUMNS to DMHS;
grant SELECT ON SYS.DBA_CONSTRAINTS to DMHS;
grant SELECT ON SYS.LOB$ to DMHS;
grant SELECT ON SYS.TABPART$ to DMHS;
grant SELECT ON SYS.TAB$ to DMHS;
grant SELECT ON SYS.TABSUBPART$ to DMHS;
grant SELECT ON SYS.TABCOMPART$ to DMHS;
grant EXECUTE ON DBMS_FLASHBACK to DMHS;
grant LOCK ANY TABLE to DMHS;
grant SELECT ANY TABLE to DMHS;
DMHS
执行端数据库用户必须具有同步对象的操作权限及操作用户下建表的权限。(此处执行端用SYSDBA即可)
DMHS数据同步模块的配置(MGR、CPT、NET)
编写dhms.hs文件即可(位于DMHS安装目录/dmhs/bin中)
$ cd /home/oracle/dmhs/bin
$ vi dmhs.hs
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<db_type>oracle12c</db_type>
<db_server>orcl</db_server>
<db_user>DMHS</db_user>
<db_pwd>dmhs</db_pwd>
<db_port>1521</db_port>
<db_ssl_path></db_ssl_path>
<db_ssl_pwd></db_ssl_pwd>
<parse_thr>1</parse_thr>
<ddl_mask>op:obj</ddl_mask>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<rac>
<rac_type>1</rac_type>
<asm_server>asm</asm_server>
<asm_user>sys</asm_user>
<asm_pwd>ASM#1234</asm_pwd>
<nodes>1</nodes>
</rac>
<send>
<ip>192.168.8.121</ip>
<mgr_port>5345</mgr_port>
<data_port>5446</data_port>
<trigger>1</trigger>
<constraint>1</constraint>
<filter>
<enable>
<item>DMHS.*</item>
</enable>
</filter>
<map>
<item>DMHS.*==SYSDBA.*</item>
</map>
</send>
</cpt>
</dmhs>
参数解释
下面简单介绍源端DMHS配置文件(dmhs.hs)中的参数
- 目标端约束/触发器限制
为了防止约束和触发器影响dmhs同步数据,故需在源端的DMHS配置文件中禁用它们
禁用约束
将<constraint>标签设置为1,避免外键引起的同步错误
禁用触发器
将<trigger>设置为1,避免DML操作的触发器引起同步错误
- MGR模块配置
通过标签<base>设置其参数
<base>
语言设置为英文
<lang>en</lang>
源端mgr端口5345
<mgr_port>5345</mgr_port>
exec模块检查点刷新时间为60秒
<ckpt_interval>60</ckpt_interval>
源端siteid为1,不可与目标端siteid重复
<siteid>1</siteid>
设置为2,适用最新的配置格式
<version>2.0</version>
</base>
- CPT模块配置
通过标签<cpt>设置其参数
<cpt>
源端数据库版本为oracle12c
<db_type>oracle12c</db_type>
源端数据库服务名(tnsname)
<db_server>orcl</db_server>
源端同步用户
<db_user>DMHS</db_user>
用户密码
<db_pwd>dmhs</db_pwd>
源端数据库端口
<db_port>1521</db_port>
安全用,暂时跳过
<db_ssl_path></db_ssl_path>
<db_ssl_pwd></db_ssl_pwd>
日志分析线程数为1,其数量影响日志解析速度
<parse_thr>1</parse_thr>
DDL配置(同步源端所有DDL操作)
<ddl_mask>op:obj</ddl_mask>
归档信息配置
<arch>
<clear_interval>600</clear_interval>
不配置归档清理策略
<clear_flag>0</clear_flag>
</arch>
<rac>
ASM模式(源端oracle使用了ASM,故需配置此参数)
<rac_type>1</rac_type>
ASM服务名(修改grid用户的tnsname.ora)
<asm_server>asm</asm_server>
连接asm的用户名
<asm_user>sys</asm_user>
用户口令
<asm_pwd>ASM#1234</asm_pwd>
源端为单实例+ASM,故节点数为1
<nodes>1</nodes>
</rac>
发送子模块配置
<send> ... </send>
</cpt>
- NET模块配置(发送子模块)
发送子模块,通过<CPT>标签的子标签<send>进行配置
<send>
目标端IP,发送子模块将数据发送给此IP
<ip>192.168.8.121</ip>
目标端mgr端口
<mgr_port>5345</mgr_port>
目标端接收子模块端口
<data_port>5446</data_port>
禁用约束
<trigger>1</trigger>
禁用触发器
<constraint>1</constraint>
过滤需要同步的数据
<filter>
白名单(同步白名单中的内容)
<enable>
同步源端DMHS用户的所有对象
<item>DMHS.*</item>
</enable>
</filter>
映射同步数据(源端与目标端直接的映射)
<map>
将源端DMHS用户的所有对象,同步到目标端SYSDBA用户中
<item>DMHS.*==SYSDBA.*</item>
</map>
</send>
2.2、目标端(DM8)
操作系统和数据库层面的配置
不要使用dmhs自带的libdmoci.so
下载可用的libdmoci.so,并使用ldd命令确保其依赖库都存在
DMHS数据同步模块的配置(MGR、EXEC、NET)
编写dhms.hs文件即可(位于DMHS安装目录/dmhs/bin中)
$ cd /home/dmdba/dmhs/bin
$ vi dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<data_port>5446</data_port>
</recv>
<db_type>dm8</db_type>
<db_server>192.168.8.121</db_server>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<db_name></db_name>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
</exec>
</dmhs>
参数解释
下面简单介绍目标端DMHS配置文件(dmhs.hs)中的参数
- MGR模块配置
通过标签<base>设置其参数
<base>
<lang>en</lang>
目标端mgr模块端口
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
目标端siteid为2,必须与源端siteid不同
<siteid>2</siteid>
<version>2.0</version>
</base>
- EXEC模块配置
通过标签<exec>设置其参数
<exec>
收子模块配置
<recv>
目标端接收子模块端口
<data_port>5446</data_port>
</recv>
目标端数据库类型为dm8
<db_type>dm8</db_type>
目标端数据库IP
<db_server>192.168.8.121</db_server>
目标库同步用户
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
目标端数据库端口
<db_port>5236</db_port>
dm8通过IP+端口只对应一个数据库,故db_name可不写
<db_name></db_name>
exec工作线程为4,影响入库效率
<exec_thr>4</exec_thr>
以下参数控制入库效率,不做解释
<exec_sql>1024</exec_sql>
<exec_trx> 5000 </exec_trx>
<exec_rows>1000</exec_rows>
</exec>
- NET模块配置(接收子模块)
接收子模块,通过<EXEC>标签的子标签<recv>进行配置
<recv>
目标端接收子模块端口
<data_port>5446</data_port>
</recv>
3、ODBC配置
3.1、安装ODBC
yum -y install unixODBC
yum -y install unixODBC-devel
3.2、配置ODBC
源端和目标端都可使用下面的配置
odbc数据源驱动配置
# vi /etc/odbcinst.ini
[Oracle ODBC Driver]
Description = ODBC for Oracle
Driver = /u01/app/oracle/product/12.2.0/dbhome_1/lib/libsqora.so.12.1
[DM8 ODBC DRIVER]
Description = ODBC for dm8
Driver = /dm8/drivers/odbc/libdodbc.so
odbc数据源配置
# vi /etc/odbc.ini
[oracle]
Description = ODBC for Oracle
Driver = Oracle ODBC Driver
Database = orcl
Servername = orcl
UserID = DMHS
Password = dmhs
Port = 1521
[dm8]
Description = ODBC for dm8
Driver = DM8 ODBC DRIVER
Server = 192.168.8.121
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236
注:
driver一定要配置好,否则会影响dmhs同步
libdodbc.so不要使用dmhs自带的
务必使用ldd命令,确保没有缺少依赖库
3.3、检验ODBC
检查ODBC配置是否正确
源端
su - oracle
isql -v oracle
目标端
su - dmdba
isql -v dm8
4、启动DMHS服务
启动源端和目标端的DMHS服务,通过DMHS的各种模块,同步数据
4.1、DMHS系统启动流程图
4.2、执行命令
- 目标端启动dmhs_server,再启动execute模块
cd /home/dmdba/dmhs/bin
./dmhs_server ./dmhs.hs
start exec
正确输出如下
dmhs通过ODBC(的dmoci)连接上了目标端数据库,并创建了辅助表,记录同步信息
创建了4个执行进程(由dmhs.hs中的<exec_thr>标签决定)
接收子模块用于接收数据的端口也开启监听了
MGR[INFO]: init the analysis module…
MGR[WARN]: site not config analysis module !
检查目标端端口(mgr和接收子模块的端口)
- 源端启动dmhs_server,并重置EXEC LSN
cd /home/oracle/dmhs/bin
./dmhs_server ./dmhs.hs
clear exec lsn
下图为正确输出
注:
上图为源端dmhs_server的日志
- 源端数据库创建表t1(用于测试同步是否正常)
create table t1(a int);
insert into values(11);
commit;
在源库和目标库执行以下语句
select * from t1;
由于暂未开始初始化同步,故目标库查不到t1表
- 源端初始化字典(源端和目标端进行初始化同步)
copy 0 "sch.name='DMHS'" CREATE|INSERT|DICT
注:
上图为源端dmhs_server的日志
- 检查
此时若不对源端进行操作,则源端与目标端是同步的(即两端的t1表内容一致)
若对源库的t1表进行插入操作
insert into t1 values(1028);
commit;
由于源端的cpt模块未启动,故源端新的操作未同步到目标端,目标端查询不到新插入的值
- 源端启动cpt模块
start cpt
- 检查
此时源端的新操作将同步到目标端
5、安装过程中出现的错误
5.1、目标端启动exec模块时,卡住不动
原因:
libdmoci.so有问题,不要用dmhs自带的oci
检查:
ldd libdmhs_exec.so
经查询,当前使用的libdmoci.so是达梦自带的!
解决方法:
替换为可用的libdmoci.so
5.2、源端启动dmhs_server失败
报错:
caption模块只能用于oracle11g或10g,与当前版本(oracle12c)不兼容
解决办法:
下载对应版本的dmhs(即oracle12)
./dmhs_V4.1.48_oracle12_rev102088_rh6_64_veri_20210924.bin
5.3、源端初始化字典时报错
报错如下:
分析:
这是是说OCI执行SELECT语句时权限不足,报的是ORA错误,即用户无权限执行此SQL,故推测是源端同步数据的用户权限不足(由于之前给该用户授予了dba权限,故一直没有考虑用户权限的问题)
解决办法:
为源端同步数据的用户执行以下授权语句
grant SELECT ON SYS.V_$DATABASE to dmhs;
grant SELECT ON SYS.V_$SESSION to dmhs;
grant SELECT ON SYS.GV_$PARAMETER to dmhs;
grant SELECT ON SYS.GV_$INSTANCE to dmhs;
grant SELECT ON SYS.GV_$ARCHIVE_DEST to dmhs;
grant SELECT ON SYS.GV_$ARCHIVE to dmhs;
grant SELECT ON SYS.GV_$LOG to dmhs;
grant SELECT ON SYS.GV_$LOGFILE to dmhs;
grant SELECT ON SYS.DBA_TABLES to dmhs;
grant SELECT ON SYS.V_$INSTANCE to dmhs;
grant SELECT ON SYS.OBJ$ to dmhs;
grant SELECT ON SYS.USER$ to dmhs;
grant SELECT ON SYS.COL$ to dmhs;
grant SELECT ON SYS.DBA_CONS_COLUMNS to dmhs;
grant SELECT ON SYS.DBA_CONSTRAINTS to dmhs;
grant SELECT ON SYS.LOB$ to dmhs;
grant SELECT ON SYS.TABPART$ to dmhs;
grant SELECT ON SYS.TAB$ to dmhs;
grant SELECT ON SYS.TABSUBPART$ to dmhs;
grant SELECT ON SYS.TABCOMPART$ to dmhs;
grant EXECUTE ON DBMS_FLASHBACK to dmhs;
grant LOCK ANY TABLE to dmhs;
grant SELECT ANY TABLE to dmhs;
6、可继续深究的细节
同步过程中的字符处理(中文字符)
提高同步效率
使用dem管理dmhs
达梦云适配中心:
https://eco.dameng.com