一、现象
在某次银行迁移中,利用 O GG12 . 2 版本的集成模式挖掘 Oracle生产过程中,发现生产端有几张表未挖掘到数据。我们首先想到的是附加日志是否没有添加或是否存在不支持的内容,以下是排查的思路:
排查是否是以下几个原因引起的:
1、 未添加表级别附加日志
2、 不支持的列
3、 不支持的表
4、 表的信息日志为 nologging
下面为检查结果
--检查表级附加日志
info trandata xjm.sys_control
--检查不支持的列
select owner,table_name,column_name,data_type from dba_tab_columns where owner in ('XJM') and data_type in ('ANYDATA','ANYDATASET','ANYTYPE','BFILE','BINARY_INTEGER','MLSLABEL','PLS_INTEGER','TIMEZONE_ABBR','TIMEZONE_REGION','URITYPE','UROWID');
--检查不支持的表
select * from DBA_LOGSTDBY_UNSUPPORTED where OWNER=’XJM’;
--检查表的日志信息
select owner,table_name from dba_tables where owner in ('XJM') and logging='NO' and temporary='N';
二、分析过程
检查以上信息均为正常,于是从这些发现的不能挖掘的表入手,看看有没有什么共同点,结果还真有发现,这些挖不到数据的表名都是 sys _ 开头的。
于是开始怀疑是否是因为 s ys_ 开头导致 O GG 认为这些表是系统表无法识别到。为了测试方便,我们这里利用一个参数 formatsql ,将挖掘到的数据都可以在 trail文件中显示出来。
关于该参数的详细用法可查看官方文档
https://docs.oracle.com/en/middleware/goldengate/core/12.3.0.1/administer.html
测试 1: 12.2 集成模式下挖掘 s ys_test table
Create table zmy.sys_testtable as select * from dba_objects; Add trandata zmy.sys_testtable 在挖掘参数文件中 Table zmy.*; 发现能够挖掘到输出
猜测,可能是需要两个系统关键字,于是再测试 sys_control
测试 2 : 12.2 集成模式下挖掘 s ys_control
Create table zmy.sys_control as select * from dba_objects; Add trandata zmy.sys_control 在挖掘参数文件中 Table zmy.*;
发现 trail 文件中没有任何的输出
同理,测试了 s ys_currefnum, sys_sch_timeinfo, sys_common_timeinfo,syscontrol , sys_sch_control
其中只有 s ys_c 开头的表且含有系统字符的均无法挖掘到数据。
于是将挖掘参数文件里的参数更改为列出具体的表名,如:
Table zmy.sys_control;
发现竟然可以挖出数据。
再次尝试使用经典模式挖掘,发现在经典模式中,不受任何影响,任何表名都可以挖到数据。
猜测是否是 O GG12.2 的版本里出现的一个 bug,于是将O GG 换成更加通用和稳定的 1 2.3 版本以及高版本 1 9C ,结果还是一样的问题,在集成模式下 ,当获取o wner.* 模式是无法获取到 sys _c 开头的且包含系统字符的表名。
三、解决
这个 bug目前原厂并没有解决方案(该问题出现时间较早,截止发文时间还未对新版本做进一步测试,后续会做测试验证并发文结果),能临时解决的两个方法分别是
1、 使用经典模式挖掘
2、 在挖掘参数中列出具体的表名
