目录
6.3 源端数据装载报错load log analysis module failure
一.环境信息
1.1源端环境信息
ORACLE数据库 | 操作系统版本 | Red Hat Enterprise Linux Server release 7.6 (Maipo) |
数据库版本 | Oracle 11gR2 | |
IP地址 | 192.168.135.88 | |
数据库架构 | 单机 | |
数据库软件目录 | /u01 | |
数据库监听名 | prod | |
数据库端口 | 1521 | |
逻辑附加日志(最小附加日志及全列日志) | 开启 | |
归档模式 | 开启 | |
归档目录 | /arch | |
字符集 | ZHS16GBK | |
软件目录 | /home/oracle/dmhs | |
DMHS | 管理端口 | 5345 |
数据端口 | 5346 |
1.2目标端环境信息
操作系统版本 | Linux version 4.19.90-24.4.v2101.ky10.x86_64 | |
数据库版本 | 03134283890-20220720-165295-10045 | |
IP地址 | 192.168.135.1 | |
数据库架构 | 单机 | |
DM数据库 | 数据库软件目录 | /home/dmdba/dmdbms |
数据库实例目录 | /dm8/dmdata/DAMENG/dm.ini | |
归档目录 | /dm8/dmarch/ | |
备份路径 | /dm8//dmbak | |
数据库端口 | 5236 | |
同步管理用户 | SYSDBA | |
DMHS版本 | V4.2.94-Build(2022.08.11-113147trunc)_64_2208(Enterprise Edition) | |
软件目录 | /home/dmdba/dmhs | |
DMHS | 管理端口 | 5345 |
数据端口 | 5346 |
二.Dm端配置:
2.1安装dmhs(源端和目标端):
(1)可执行文件授权:
[dmdba@DM1 ~]$ mv dmhs_V4.1.48_pack4_dm8_rev104804_rh6_64_veri_20211228.bin /home/dmdba
[dmdba@DM1 ~]$ chmod +x dmhs_V4.1.48_pack4_dm8_rev104804_rh6_64_veri_20211228.bin
- 检查下tmp空间
是否有1G大小,不足的话在root进行扩容:
df -h
mount -o remount,size=2G /tmp
- 启动dmhs执行文件
[dmdba@DM1 ~]$ ./dmhs_V4.1.48_pack4_dm8_rev104804_rh6_64_veri_20211228.bin -i
至此DMHS安装完成,我们环境安装路径为/home/dmdba/dmhs,源端虚机和目的端虚机环境都需要安装
2.2 开启逻辑附加日志
修改DM7中“dm.ini”中的RLOG_APPEND_LOGIC参数的值设置为1。
2.3 开启归档日志
(1)将DM8数据库配置文件“dm.ini”中的ARCH_INI参数值设置为1。
(2)在与dm.ini相同目录下,增加配置文件“dmarch.ini”,并添加归档配置参数设置
[ ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dm8/dmarch ARCH_FILE_SIZE = 512 ARCH_SPACE_LIMIT = 0 |
2.4 DDL同步配置
使用SYSDBA用户执行ddl_sql_dm8.sql,建立DDL同步的触发器和辅助表。
创建完dmhs后,会在安装的子目录的script下存在”ddl_sql_dm8.sql”脚本,建议在DM管理工具中执行该脚本,在disql中执行会报错。
执行完成后,使用以下SQL语句查询辅助表是否创建成功
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMHS%' and status = 'VALID';
执行以下SQL语句查询触发器是否创建成功:
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y';
正常创建成功后会有关于DMHS的9张表和4个触发器
目标端也需要执行。
2.5 DMHS服务配置
cd /home/dmdba/dmhs/bin
cp TemplateDmhsService DmhsService
vim DmhsService
2.6 DMHS配置文件(dmhs.hs)
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<name>DM8_HS</name>
<ckpt_interval>60</ckpt_interval>
<siteid>2</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<data_port>5346</data_port>
</recv>
<enable>1</enable>
<name>dm8_exec</name>
<db_type>DM8</db_type>
<db_server>192.168.135.1</db_server>
<db_user>SYSDBA</db_user>##或使用DMHS用户也可
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<char_code>PG_GB18030</char_code>
<exec_thr>4</exec_thr>
<exec_sql>512</exec_sql>
<exec_trx>5000</exec_trx>
<exec_rows>250</exec_rows>
<trxid_tables>1</trxid_tables>
<vpool>7</vpool>
<recv_caches>8</recv_caches>
</exec>
</dmhs>
三.Oracle端配置:
3.1、安装unixodbc工具
1、下载unixodbc压缩包(unixODBC-2.3.11.tar.gz),用ssh工具将其上传linux服务器。(下载地址:http://www.unixodbc.org/)
2、输入以下命令,进行安装:
tar -zxvf unixODBC-2.3.11.tar.gz ——解压
cd unixODBC-2.3.11 ——进入解压后的安装目录
./configure ——对unixODBC-2.311软件进行配置
make&&make install ——安装unixODBC-2.311
默认安装路径为/usr/local目录下面,如果要指定安装目录,可以在configure的后面指定--includedir=/usr/include --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc
如果数据库中需要支持对中文表名和字段名的同步,则需要将unixODBC编译选项增加以下两个:
--enable-iconv=yes --with-iconv-char-enc=GB18030
3.2下载安装 oracle ODBC Driver
官方下载地址 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
下载文件:
instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient-odbc-linux.x64-11.2.0.4.0.zip
上传至服务器端,解压,然后将so格式的动态库copy到oracle的$ORACLE_HOME/lib下
unzip /soft/instantclient-basic-linux.x64-11.2.0.4.0.zip
unzip /soft/instantclient-odbc-linux.x64-11.2.0.4.0.zip
cp /soft/instantclient_11_2/*so* /u01/oracle/lib/
3.3 配置unixODBC
如果已经安装好了unixODBC可以通过命令odbcinst查看unixODBC的版本,以及读取的odbc配置文件的路径。
[oracle@p550 ~]# /usr/local/bin/odbcinst -j
unixODBC 2.3.0
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/oracle/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
默认在/usr/local/etc目录下面odbc.ini和odbcinst.ini中进行配置,如果安装是指定了sysconfdir,则在指定目录下的odbc.ini和odbcinst.ini中配置。
vi /usr/local/etc/ odbc.ini
[DMHS]
Description=ORACLE ODBC DSN
Driver=Oracle11g
SERVER=192.168.135.88
UID=dmhs
PWD=dmhs
Servername=prod
PORT=1521
vi /usr/local/etc/odbcinst.ini
[Oracle11g]
Description = ODBC DRIVER FOR ORACLE
Driver = /u01/oracle/lib/libsqora.so.11.1
Threading = 0
注意:odbc.ini和odbcinst.ini中每行开头禁止留有空格,否则会有如下报错:
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect。
1)检查libsqora.so.11.1动态库依赖是否完整:
通过 ls –la /u01/oracle/lib/libsqora.so.11.1检查文件是否存在。也可以通过ldd /u01/oracle/lib/libsqora.so.11.1检查依赖的文件是否都能够找到。如果没有找到,则为环境变量问题,检查环境变量LD_LIBRARY_PATH。
将unixodbc动态库加到目的端DMHS安装用户环境变量中
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
此类情况,需要添加添加软连接,因为odbc编译后的文件为libodbcinst.so,lib库需要的是libodbcinst.so1
ln -s /u01/oracle/lib/libodbcinst.so /u01/oracle/lib/libodbcinst.so.1
chown oracle:oinstall /u01/oracle/lib/libodbcinst.so.1
2)检查unixODBC配置是否正确
注意:必须切换至oracle用户
/usr/local/bin/isql –v DMHS dmhs dmhs
如果连接正常则表示配置正确。
3.4 安装dmhs,并检查DMHS执行端环境
安装步骤参见DM端配置2.1步骤,此处省略。
目的端为oracle,建议将DMHS 软件所属用户组调整为oracle:oinstall 中,避免出现用户权限原因导致环境变量引用缺失!!!
3.4.1 验证DMHS执行环境:
oracle1:/home/oracle/dmhs/bin(prod)> ldd libdmhs_exec.so
安装完数据库后,使用ldd libdmhs_exec.so查看执行端的动态库依赖是否完整,不完整的话,需要对环境变量路径进行补全,或进行已有环境变量的软链接。
这里将缺失的动态库补齐,部分动态库来自dmdbms/bin下copy的
3.4.2 验证oracle服务名称
DMHS 装载历史数据时,需要通过数据库网络服务名来抽取数据库的数据。配置 ORACLE 数据库的网络服务名可通过 ORACLE NCA 工具进行配置,也可直接修改 $ORACLE_HOME\network\admin\tnsname.ora 文件。
下例为直接修改 tnsname.ora 来添加数据
库服务监听:
prod =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.135.88 )(PORT = 1521)) (CONNECT_DATA =
(SERVER = DEDICATED)
配置完成之后,可使用 oracle 客户端工具 sqlplus 测试配置是否正确。 例如: sqlplus dmhs/dmhs@prod 如果配置正确,则可成功登陆数据库。
3.5 查看数据库归档状态
--确认ORACLE_SID后,使用sqlplus / as sysdba登录数据库
SQL> archive log list
--若为非归档模式(no archive mode),需关闭实例并以mount状态启动。
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter system set db_recovery_file_dest=’’;
SQL> alter system set log_archive_dest_1='location=/arch';
SQL> alter database open;
SQL> archive log list
3.6开启逻辑附加日志
查看全列日志查看是否开启
SQL>select supplemental_log_data_min,supplemental_log_data_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;
开启附加日志不需要重启 ORACLE 数据库服务,但重启数据库服务可加快 附加日志开启速度。
3.7 oracle端 DDL 支持
DMHS 支持源端 DDL 的同步。源端 DDL 同步必须满足一下三个条件:
- 源端数据库必须允许 DDL 触发器的触发动作,即数据库参数 _system_trig_enabled 为 TRUE 或者未设置。查看该参数的命令如下:
SQL> show parameter "_system_trig_enabled";
SQL> alter system set "_system_trig_enabled"=true;
- 登录数据库在DMHS用户下执行:
可选择含触发器的DDL同步方式,也可是选择不含触发器DDL的同步方式
以下为选择DDL同步方式,执行以下sql文件,文件在/dmhs/script目录下:
SQL>start /home/oracle/dmhs/scripts/ddl_sql_ora.sql
- 需要日志捕获模块对 ddl_mask 进行设置。例如op:obj(代表同步所有对象), ddl_mask 可对同步对象进行过滤。
3.8 同步连接用户&授权
(11G环境)创建用户DMHS作为连接用户,授权若不能以dba角色授予以下权限:
create user dmhs identified by dmhs;
grant connect to dmhs;
grant select any table to dmhs;
grant select any dictionary to dmhs;
grant create table to dmhs;
grant create session to dmhs;
grant lock any table to dmhs;
grant execute on dbms_flashback to dmhs;
grant administer database trigger to dmhs;
grant create trigger to dmhs;
grant select on sys.obj$ to dmhs;
grant select on sys.user$ to dmhs;
3.9 DMHS启动服务配置
cd /home/oracle/dmhs/bin
cp TemplateDmhsService DmhsService
vim DmhsService
3.10 DMHS配置文件(dmhs.hs)
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<name>ORA_HS</name>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<enable>1</enable>
<name>ora_cpt</name>
<db_type>ORACLE11G</db_type>
<db_server>prod</db_server>
<db_user>dmhs</db_user>
<db_pwd>dmhs</db_pwd>
<db_port>1521</db_port>
<idle_time>300</idle_time>
<ddl_mask>OP:OBJ:REC</ddl_mask>
<parse_thr>1</parse_thr>
<check_date>0</check_date>
<char_code>PG_GBK</char_code>
<arch>
<clear_flag>0</clear_flag>
<clear_interval>600</clear_interval>
</arch>
<send>
<max_log_num>2000</max_log_num>
<ip>192.168.135.1.</ip> #写DM端的地址
<mgr_port>5345</mgr_port> #需要与源端的端口对应
<net_pack_size>256</net_pack_size> #需要与源端的端口对应
<data_port>5346</data_port>
<timeout>0</timeout>
<filter>
<name_len>255</name_len>
<enable>
<item>DMHS.*</item> #根据oracle实际用户而定
</enable>
</filter>
<map>
<item>DMHS.*==DMHS.*</item>#根据oracle用户名而定,对应DM端的模式名。如PDB模式下,MAP模块不变
</map>
</send>
<send_delay_second>0</send_delay_second>##源端到目的端延时秒数
<start_scn>0</start_scn>##加载归档日志时的最小SCN
<supplement_log>0</supplement_log>是否支持只开启表级附加日志0不支持1支持
<rec_heap_size>16</rec_heap_size>##日志分析链表单个节点的内存堆大小,一般默认16M即可
<vpool_size>8</vpool_size>##CPT模块使用共享内存池大小,默认8M即可(DDL操作多或开启在线日志备份功能时需要配大一些)
</cpt>
</dmhs>
四.DMHS进行全量和增量同步
4.1 源端创建数据(Oracle端)
create table dmhs.test_insert(id int,name varchar(100),addr varchar(200));
insert into dmhs.test_insert values(1,'liu','bj');
insert into dmhs.test_insert values(2,'you','lz');
insert into dmhs.test_insert values(3,'rui','sx');
commit;
4.2启动Oracle端和DM端dmhs服务
启动装载字典前,一定要先将两端的执行器启动,创建好执行端的辅助表后再装载字典。Oracle端要切换至oracle用户
Oracle端:
oracle1:/home/oracle/dmhs/bin(prod)>./DmhsService start
Starting DmhsService: [ OK ]
DM端:
[dmdba@DM1 bin]$ ./DmhsService start
Starting DmhsService: [ OK ]
全量同步:
4.3 启动控制台执行命令
Oracle 端:
./dmhs_console
connect 192.168.135.88:5345
DM 端:
./dmhs_console
connect 192.168.135.1:5345
4.4 字典的初始化和数据装载
DM端:
start exec;
Oracle端:
CLEAR EXEC LSN 清空目标端的事务表,设置日志起始 LSN
COPY 0 "SCH.NAME='DMHS'" DICT|CREATE|INSERT
增量同步
4.5 开启CPT同步
场景说明:目标端已经有相关数据表和数据,不需要装载数据,直接进行CPT模块启动;
Oracle端:
./dmhs_console
connect 192.168.135.88:5345
start cpt
开启后,可以继续进行同步,目前这种配置暂时只适用于静态库。
DM端:此时,可以实时同步DMHS下的数据
五.验证同步情况
全量同步后:
Oracle端:
DM端:
增量同步后:
Oracle端:
insert into dmhs.test_insert values (4,'xx','sh');
commit;
DM端:
插入数据验证同步成功!
六.报错处理
6.1 启动dmhs后,出现乱码
原因:启动脚本DmhsService的字符集设置为ZHS16GBK,而且建议将dmhs.hs中lang改为英文,这样能做到任何环境都适配。
解决:
- 修改启动脚本的参数为:HS_NLS_LANG=“AMERICAN_AMERICA.AL32UTF8”
- 修改dmhs.hs中参数为:<lang>en</lang>
6.2 unixODBC配置文件及环境变量注意点
odbc.ini中配置的用户名、密码、服务名、端口根据目的配置指定。
安装完成后检查LD_LIBRARY_PATH环境变量是否存在unixODBC库路径:(根据实际unixodbc安装路径而定)
若不存在,永久添加
vim .bash_profile
添加exeport LD_LIBRARY_PATH=/u01/app/oracle/product/11.2/db/lib/:/usr/lib
使用修改的内容立即生效
source .bash_profile
6.3 源端数据装载报错load log analysis module failure
后台日志报错:
2023-06-09 18:24:04 MGR[INFO]: load ORACLE log analysis module...
2023-06-09 18:24:04 MGR[ERROR]: lib libcpt_ora.so can not found,error code 0, errmsg:libcpt_ora.so: cannot open shared object file: No such file or directory
2023-06-09 18:24:04 MGR[INFO]: Log analysis module loading failure
原因&解决:
find该动态库:
[root@oracle1 ~]# find / -name "libcpt_ora.so"
[root@oracle1 ~]#
发现不存在该文件,怀疑和dmhs版本有关,经在博客查看后发现该文件原本存在于/dmhs/bin下,但实际不存在,此次在Oracle安装的dmhs包为dm8通用,替换为Oracle的dmhs包即可。附博客报错处理:http://t.csdn.cn/QkKH6
达梦云适配技术社区
https://eco.dameng.com/