1 使用到的硬件环境如下:
硬件类别 | 硬件名称 | 配置 | 数量 |
---|---|---|---|
Oracle服务器 | 服务器 | CPU:intel xeon cpu E7-4809/ 64核,2颗;内存:128GB;硬盘:289G;网卡:1000M | 1 |
2 本次测试使用到的软件环境如下:
软件类别 | 软件名称 | 版本 |
---|---|---|
操作系统 | linux | Redhat 6.8 |
数据库 | Oracle | 11.2.0 |
同步软件 | Dmhs | dmhs_V4.1.65 |
1 使用到的硬件环境如下:
硬件类别 | 硬件名称 | 配置 | 数量 |
---|---|---|---|
DM8服务器 | 服务器 | CPU:intel core™ T7700,2颗;内存:32GB;硬盘:1T;网卡:1000M | 1 |
2 本次测试使用到的软件环境如下:
软件类别 | 软件名称 | 版本 |
---|---|---|
操作系统 | windows | Windows server 2012 R2 |
数据库 | DM8 | Dm8-1-2-70-21.09.08-147080-10028 ENT |
同步软件 | Dmhs | dmhs_V4.1.48 |
表 支持oracle的数据类型
消息格式说明:
请参照《DMHS安装配置手册》。
UNIX/LINUX平台中,DMHS 源端安装完成之后,可将目录切换到DMHS软件目录,通过命令ldd libcpt_ora.so(RAC可通过命令ldd libcpt_rac.so),查看DMHS日志执行模块链接是否正常。
DMHS在运行时,需要加载本地ORACLE 动态库libclntsh.so。在部署DMHS之前,需将libclnsh.so所在目录添加到共享库路径变量中。libclntsh.so通常位于ORACLE_HOME/lib中。在LINUX/UNIX系统中,设置的方法如下:
注:当在系统中未找到libclntsh.so文件, 但存在libclntsh.so.19这样的文件,可使用命令ln -s libclntsh.so.19 libclntsh.so创建一个软链接。
可使用ldd libclntsh.so查看依赖包是否缺失。
DMHS支持源端为ORACLE RAC的数据库,DMHS安装时,只需部署在RAC的某一个节点上。当数据库为RAC 时,需对RAC各个节点配置时间同步。配置时间同步可访问www.ntp.org,或者咨询ORACLE系统管理员。
根据RAC存储使用的不同,需进行其他额外的配置:
ASM =
(
DESCRIPTION =
(ADDRESS =(PROTOCOL=TCP)(HOST=***.***.***.***)(PORT=1521))
(CONNECT_DATA =(SERVER =DEDICATED)(SERVICE_NAME=+ASM))
)
测试oracle数据库rac集群中ASM的密码方法:
sqlplus sys/*******@asm as sysdba
操作系统磁盘存储
当RAC的归档文件存放在操作系统磁盘时,对未部署DMHS的RAC节点,必须配置归档文件到部署DMHS的文件映射。具体配置,请联系服务器管理员。
DMHS在运行前,需对数据库参数/状态进行调整。
本章节操作需在数据库管理员配合下操作,或直接由数据库管理员操作。
DMHS通过分析ORACLE 数据库的归档/在线日志来捕获数据库的增量数据,DMHS运行之前,必须将数据库设置为归档模式,同时开启最小附加日志及全列日志。修改数据库为归档模式需重启数据库服务,在操作只需确认工作环境能停机维护。具体操作过程如下:
修改数据库归档模式。
可使用sqlplus执行archive log list查看数据库归档模式.
如上图中数据库已经为归档模式,则跳过以下步骤开启归档。
当数据库数据包含中文字符时,需将DMHS运作所在窗口的NLS_LANG设置为对应的字符集,建议使用AMERICAN_AMERICA.ZHS16GBK。
windows平台设置客户端字符集:
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
UNIX/LINUX平台设置客户端字符集:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
在源端由Oracle数据库管理员,执行以下SQL创建源端读取用户
--创建dmhs用户并授权
create user dmhs identified by dmhs1234;
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 flashback any table to dmhs;
--ORACLE12C
grant connect to c##dmhs container=all;
DMHS支持源端DDL的同步。源端DDL同步必须满足一下三个条件:
源端数据库必须允许DDL触发器的触发动作,即数据库参数_system_trig_enabled为TRUE或者未设置。查看该参数的命令如下:
需要在源端数据库以sys用户,在sys模式下创建DDL触发器及DDL记录表,详细脚本请参照安装目录的dmhs/scripts/ddl_sql_ora.sql.sql脚本。脚本内容如下:
---=======================================================
---version 2.0
---sys用户登录并创建
---=======================================================
create table dmhs_ddl_sql (
objid NUMBER,
dataobj NUMBER,
op_type varchar2(32),
obj_schname varchar2(128),
obj_name varchar2(128),
obj_type varchar2(32),
op_sql varchar(4000),
op_sql2 clob,
ddl_time date,
resvd1 NUMBER,
resvd2 NUMBER,
resvd3 NUMBER,
resvd4 NUMBER,
resvd5 varchar2(1000),
resvd6 varchar2(1000)
);
create or replace trigger dmhs_trigger
before ddl
on database
declare
e1 exception;
sql_text ora_name_list_t;
ddl_sql clob;
op_no number := NULL;
objid number := NULL;
dataobj number := NULL;
v_num number;
sql_item varchar(8000);
sql_temp varchar(8000);
begin
/*
if ora_login_user = 'DMHS' then
return;
end if;
*/
if (SUBSTR(ora_dict_obj_name, 1, 5) = 'DMHS_' and ora_dict_obj_name<>'DMHS_TRXID_TABLE') or (ora_dict_obj_owner = 'SYS' and ora_dict_obj_type != 'TABLESPACE') then
--下面这个条件是为了捕获dmhs_ddl_sql表的TRUNCATE操作的,这个操作不捕获会导致无法解析到该表的OP_SQL2列
if ora_dict_obj_name = 'DMHS_DDL_SQL' and ora_dict_obj_type = 'TABLE' and ora_sysevent = 'DROP' then
raise_application_error(-20002, 'table cannot drop before dmhs_trigger is droped');
end if;
if ora_sysevent != 'TRUNCATE' or ora_dict_obj_name <> 'DMHS_DDL_SQL' then
return;
end if;
end if;
/*
if ora_dict_obj_type <> 'TABLE' and ora_dict_obj_type <> 'VIEW' and ora_dict_obj_type <> 'SEQUENCE' and ora_dict_obj_type <> 'INDEX' and ora_dict_obj_type <> 'SYNONYM' then
return;
end if;
*/
sql_temp := '';
dbms_lob.createtemporary(ddl_sql, TRUE);
v_num := ora_sql_txt (sql_text);
for i in 1 .. v_num
loop
sql_item := sql_text (i);
if length(sql_item) + length(sql_temp) > 3000 then
dbms_lob.append(ddl_sql, sql_temp);
sql_temp := '';
end if;
sql_temp := sql_temp || sql_item;
end loop;
dbms_lob.append(ddl_sql, sql_temp);
if ora_sysevent != 'CREATE' then
if ora_dict_obj_type = 'TABLE' or ora_dict_obj_type = 'SEQUENCE' then
select o.obj#, o.dataobj# into objid, dataobj from sys.obj$ o, sys.user$ u where o.name = ora_dict_obj_name and o.type# in(2, 6) and o.subname is null and u.name = ora_dict_obj_owner and o.owner# = u.user#;
end if;
insert into dmhs_ddl_sql(objid, dataobj, op_type, obj_schname, obj_name, obj_type, op_sql, ddl_time) values(objid, dataobj, ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, SUBSTR(ddl_sql, 1, 2000), sysdate);
else
if ora_dict_obj_type = 'TABLE' then
insert into dmhs_ddl_sql(op_type, obj_schname, obj_name, obj_type, op_sql, op_sql2, ddl_time) values(ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, SUBSTR(ddl_sql, 1, 2000), ddl_sql, sysdate);
elsif ora_dict_obj_type in ('VIEW', 'MATERIALIZED VIEW', 'TRIGGER', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY', 'TYPE', 'TYPE BODY', 'SYNONYM', 'TABLESPACE', 'USER', 'ROLE', 'INDEX', 'SEQUENCE') then
insert into dmhs_ddl_sql(op_type, obj_schname, obj_name, obj_type, op_sql, op_sql2, ddl_time) values(ora_sysevent, ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, SUBSTR(ddl_sql, 1, 2000), ddl_sql, sysdate);
end if;
end if;
exception
when e1 then raise e1;
when no_data_found then
dbms_output.put_line('object is not exist');
end dmhs_trigger;
--1)关闭数据回收站
show parameter recycle
alter system set recyclebin=off deferred;
需要日志捕获模块对ddl_mask进行设置。例如<ddl_mask>op:obj<ddl_mask>。ddl_mask可对同步对象进行过滤,详细参数请参照ddl_mask参数说明。
配置ORACLE RAC源端,可使用DMHS配置助手进行配置,或手动配置DMHS配置文件dmhs.hs。手动配置dmhs.hs时需注意,dmhs.hs文件内容必须严格遵循xml格式规范。以下介绍如何手动配置dmhs.hs。
创建DMHS配置文件dmhs.hs。将文件路径切换到dmhs/bin工作目录下,创建文件dmhs.hs。注意DMHS运行用户必须具有dmhs.hs文件的读取权限。
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<siteid>1</siteid>
<mgr_port>5345</mgr_port>
<chk_interval>3</chk_interval>
<ckpt_interval>60</ckpt_interval>
<lang>en</lang>
<mem_check>1</mem_check>
<version>2.0</version>
</base>
<cpt>
<enable>1</enable>
<db_type>ORACLE11G</db_type>
<db_server>HN****</db_server>
<db_user>dmhs</db_user>
<db_pwd>**********</db_pwd>
<db_port>1521</db_port>
<idle_time>300</idle_time>
<ddl_mask>OBJ:OP</ddl_mask>
<rac>
<rac_type>1</rac_type>
<db_server>asm</db_server>
<db_user>sys</db_user>
<db_pwd>*********</db_pwd>
<nodes>2</nodes>
</rac>
<parse_thr>1</parse_thr>
<send_lst>2</send_lst>
<rec_heap_size>16</rec_heap_size>
<vpool_size>8</vpool_size>
<supplement_log>1</supplement_log>
<enable_mview>0</enable_mview>
<check_date>0</check_date>
<trx_delay_second>10</trx_delay_second>
<send_delay_second>20</send_delay_second>
<arch>
<clear_flag>0</clear_flag>
<clear_interval>3600</clear_interval>
<retain_day>3</retain_day>
</arch>
<send>
<ip>xxx.xxx.xxx.xxx</ip>
<mgr_port>5348</mgr_port>
<data_port>5347</data_port>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>0</identity>
<filter>
<enable>
<item>TJRH.*</item>
</enable>
</filter>
</send>
</cpt>
</dmhs>
配置文件说明:
<enable>1</enable>
<db_type>ORACLE11G</db_type>
<db_server>HNxxxx</db_server> --配置的是数据库的监听名
<db_user>dmhs</db_user> --创建的只读权限的用户名,非业务用户,请使用plsql dmhs / **********@asm验证是否能登录
<db_pwd>**********</db_pwd>
<db_port>1521</db_port>
<idle_time>300</idle_time>
<ddl_mask>OBJ:OP</ddl_mask>
Rac配置块说明
<rac>
<rac_type>1</rac_type>
<db_server>asm</db_server> --监听文件里ASM的监听名
<db_user>sys</db_user> --必须是sys用户,请使用plsql SYS/****@asm验证是否能登录
<db_pwd>******</db_pwd>
<nodes>2</nodes>
</rac>
发送模块说明
<send>
<ip>xxx.xxx.xxx.xxx</ip> --目地端的ip地址
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<siteid>17</siteid>
<mgr_port>5348</mgr_port>
<ckpt_interval>60</ckpt_interval>
<lang>en</lang>
<version>2.0</version>
</base>
<exec>
<recv>
<mgr_port>5348</mgr_port>
<data_port>5347</data_port>
</recv>
<db_type>dm8</db_type>
<db_server>xxx.xxx.xxx.xxx</db_server>
<db_user>tjrh</db_user>
<db_pwd>********</db_pwd>
<db_port>5237</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>
<affect_row>0</affect_row>
<check_index>0</check_index>
<exec_policy>0</exec_policy>
</exec>
</dmhs>
配置说明:
<db_type>dm8</db_type> --目的端数据库版本
<db_server>xxx.xxx.xxx.xxx</db_server> --目的端ip地址
<db_user>tjrh</db_user> --目的端用户名
<db_pwd>**********</db_pwd>
<db_port>5237</db_port> --目的端端口
后台启动与前台启动选择一项完成同步工作。前台启动完成配置与同步后,请将前台启动窗口关闭,使用后台脚本启动dmhs,不需要做同步操作,只启动服务即可。
5.1 前台启动dmhs
目的端运行dmhs_server,并执行Start exec
dmhs_server dmhs.hs
start exec
源端运行dmhs_server,执行clear exec lsn。
./dmhs_server dmhs.hs
clear exec lsn
注意:源端请使用oracle用户运行dmhs
源端装载字典信息及历史数据。数据装载掩码具体请看用户手册。
copy 0 “sch.name=’TJRH’” CREATE|INSERT|DICT
等待执行完成
源端DMHS,执行start。
start
如果5.1的步骤已经执行,只需要启动后台服务即可,不需要执行在5.2.3的同步操作。
将bin目录下的service_template/DmhsService拷贝到bin目录
cp /dmhs/bin/service_template/DmhsService /dmhs/bin
修改DmhsService的脚本,如下
vim DmhsService
DMHS_HOME=/dmhs
PROG_DIR=/dmhs/bin
CONF_PATH=/dmhs/bin/dmhs.hs
NEED_LIB_PATH=/dmhs/bin:/u01/app/oracle/product/11.2.0/db_1/bin
启动dmhs服务
cd /dmhs/bin
./DmhsService start
首先,将bin目录下的service_template/DmhsServiceInstall.bat拷贝到bin目录。
其次,在dmhs\bin目录下双击运行DmhsServiceInstall.bat,注册服务。
然后,去服务里启动dmhs服务。
执行端运行DMHS软件工具dmhs_console,连接执行端DMHS服务,控制台管理工具中执行如下DMHS命令:
connect ip:mgr_port
启动日志执行模块,控制台管理工具中执行如下DMHS命令:
start exec
源端运行DMHS软件工具dmhs_console,连接源端DMHS服务,设置日志捕获模块起始LSN。
源端运行DMHS软件工具dmhs_console,连接源端DMHS服务,装载源端字典信息及历史数据。数据装载掩码具体请看用户手册。
启动日志捕获模块。源端运行DMHS软件工具dmhs_console,连接源端DMHS服务,执行start cpt。
DMHS目标库约束/触发器限制
配置ODBC
(1)安装odbc
推荐安装 unixodbc2.3.2 版本的 odbc,下面介绍如何使用源码安装 unixidbc。拷贝unixODBC-2.3.0.tar.gz至/dmdata目录下,并进行解压:
gunzip unixODBC-2.3.0.tar.gz //会在/dmdata目录下生成一个unixODBC-2.3.0.tar文件
tar –xvf unixODBC-2.3.0.tar //会在/dmdata目录下生成一个unixODBC-2.3.0文件夹
cd unixodbc-2.3.0
export CC=gcc
./configure --enable-drivers=no --with-iconv-char-enc=GB18030 --enable-gui=no --enable-iconv=yes
make
make install
(2) 配置odbc.ini和odbcinst.ini
cd /usr/local/etc
vi odbc.ini
在其中写入:
[ORACLE]
Description = ORACLE ODBC DSN
Driver = Oracle in OraDb11g_home1
SERVER = *.*.*.*
UID = dmhs
PWD = dmhs1234
Servername = ORCL
PORT = 1521
vi odbcinit.ini
在其中写入:
[Oracle in OraDb11g_home1]
Description = ODBC DRIVER FOR ORACLE
Driver =/dmdata/dmhs/bin1/libsqora.so.11.1
Threading = 0
(3) 测试使用odbc连接oracle数据库(使用oracle用户连接测试),下图修改为dmhs/dmhs1234进行连接测试
如果报驱动问题,可以ldd /dmdata/dmhs/bin1/libsqora.so.11.1验证是否缺失依赖包;配置bin和LD_LIBRARY_PATH的环境变量;
Dmhs.hs配置
以下是Oracle单机做为目的端双向同步的配置,如果仅做为目的端可以将cpt模块删除,正式配置时请将注释删除。
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<enable>1</enable>
<name>cpt</name>
<db_type>ORACLE11G</db_type>
<db_server>ORCL</db_server> <!—ODBC 名称-->
<db_user>GXXX</db_user> <!—oracle数据库登录用户名-->
<db_pwd>dmxxxx</db_pwd> <!—oracle数据库登录密码-->
<db_port>1521</db_port>
<idle_time>300</idle_time>
<ddl_mask>OP:OBJ:REC</ddl_mask>
<check_date>0</check_date>
<arch>
<clear_flag>0</clear_flag>
<clear_interval>600</clear_interval>
</arch>
<send>
<ip>*.*.*.18</ip><!---目的端ip->
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
<level>0</level>
<trigger>1</trigger>
<constraint>1</constraint>
<case_sensitive>0</case_sensitive>
<filter>
<enable>
<item>BDCHS.*</item><!—源端表-->
</enable>
</filter>
<!—表映射,如果目的端和源端模式名一致可以不配置-->
<map>
<item> BDCHS.*==DMHS.*</item>
</map>
</send>
</cpt>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<enable>1</enable>
<name>exec</name>
<db_type>oracle11g</db_type>
<db_server>ORCL</db_server>
<db_user>bdcxxx</db_user>
<db_pwd>TY_xxx</db_pwd>
<db_port>1521</db_port>
<toggle_case>0</toggle_case>
<exec_thr>1</exec_thr>
<level>0</level>
<exec_thr>1</exec_thr>
<exec_sql>2048</exec_sql>
<exec_trx>5000</exec_trx>
<exec_rows>250</exec_rows>
<vpool>7</vpool>
<trxid_tables>1</trxid_tables>
<recv_caches>8</recv_caches>
<exec_policy>2</exec_policy>
<commit_policy>1</commit_policy>
<enable_merge>1</enable_merge>
<affect_row>1</affect_row>
</exec>
</dmhs>
dmhs启动乱码如下图所示:
修改dmhs.hs的配置文件,将<bash>的<lang>配置ch修改为en
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
Linux环境变量配置:
添加环境变量LD_LIBRARY_PATH和PATH目录,执行以下命令临时生效:
export LD_LIBRARY_PATH= /dmhs/bin;
export PATH=$PATH:/dmhs/bin;/dmdbms/bin;
重启dmhs,如果无报错可将以上环境变量添加到/etc/profile配置文件中,执行source /etc/profile生效。
windows环境变量配置:
右击‘我在电脑’ – ‘属性’ – ‘高级系统设置’ – ‘环境变量’
在【系统变量模块】配置path路径添加达梦数据库bin所在路径和dmdbms/bin目录
在<exec>模块配置<check_index>0</check_index>
报错如下图:
请先确认登录Oracle的用户名与密码是否正确,如果配置正确,请使用oracle用户运行dmhs。
使用print 1 seqid trxid “err.sql”,获取到报错sql,报错语句全是如下格式:Insert into test(send_date) values(‘2015-11-23 10:28:42’)。达梦是支持这种形式的时间类型插入的。解决办法如下:
将dm.ini的DATETIME_FMT_MODE设置为0
文章
阅读量
获赞