暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

OGG OGG-06439 同步数据丢失问题

原创 悠游 2022-04-02
7361


早上接到业务人员反馈有两张表的数据不同步了,让帮忙查查问题,经验证该表的同步链路为 A=>B 库的OGG同步。随即检查相关OGG进程皆正常

源库


目标库



既然OGG同步进程都正常,怎么还会出现数据不同步呢?

接着继续排查目标库ggserr.log看到 WARNING OGG-06439这个报错间断性出现频率较高,一般来说,日志中WARNING的告警是需要关注下的,但也问题不大,ERROR则是致命性的

源库的日志中也同样有相关表一样的警告



OGG的复制表我们都知道需要定义主键或者唯一键来作为key,帮助OGG在抽取和应用中定位数据,当OGG同步表没有Primary key或者Unique key时,进程将会报OGG-06439;

OGG-06439也算是一个比较常见的报错,告诉我们将使用所有列来表示键,但不一定保证惟一性。 KEYCOLS可用于定义键。  

2022-04-02T11:51:30.145+0800  WARNING OGG-06439  Oracle GoldenGate Delivery for Oracle, ***:  No unique key is defined for table ***. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
2022-04-02T11:51:30.145+0800  INFO    OGG-02756  Oracle GoldenGate Delivery for Oracle, ***:  The definition for table *** is obtained from the trail file.

在以往的经验中,OGG-06439就是使用所有列作为键来同步数据,并不会影响数据的一致性,更不会丢失数据,但此次的情况明显跟业务人员反馈的情况有所出入


查询该表的索引和约束情况发现该表竟然有唯一索引,且索引状态也都是valid的,但为什么OGG并没有使用唯一索引作为KEY呢?


有没有可能是OGG进程已经启动后才创建的唯一索引?重启REPLICATE进程后OGG依然无法识别到该主键索引

经过一番折腾,发现该主键约束为NOT VALIDATED(不校验模式),  当主键约束状态为ENABLED时,代表历史数据不进行校验,新入数据则会检查唯一性和非空


NOT VALIDATED状态的约束问题已经久的不知道为什么当初要设置成这样。

难道这就是OGG不使用该主键作为KEY的原因吗?尝试将该约束修改成VALIDATED 

alter table ******* modify constraint ***** VALIDATE;  (会进行数据校验)

顺利的执行成功了,也就是说表中主键列已经不存在重复数据或空值了


再次重启了OGG的REPLICATE进程,该表未报出OGG-06439了,业务人员也反馈数据同步正常。

至此验证了目标端会使用PK列当作OGG的键列同步数据,即使源端是使用all cloumns抽取的。


那为什么之前主键约束是NOT VALIDATED的时候会无法同步数据呢?经了解,业务人员是修改了数据无法同步(UPDATE操作)

REPLICATE应用进程的配置如下



Doc ID 1144303.1   If ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATES parameters are being used, and if Oracle GoldenGate has all of the target key values, then Oracle GoldenGate will not ignore the update, but instead will apply it using all key columns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). This is necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is, then Oracle GoldenGate turns the update into an insert.

这句官方文档的大概解释是配置了 INSERTMISSINGUPDATES参数后,update如果找不到要更新的行,那么将会装换成insert将要更新的行插入。


REPLICATE进程的报错日志里有问题表的ORA-00001: unique constraint主键冲突


源库表结构(注意红框部分)


目标库表结构


可以看到源端和目标端表结构不一致,源端部分列有默认值而目标端无默认值,源端部分列可为空,目标端不可为空。


结合以上情况,可以得出如下结论:

一.OGG不会使用主键约束为NOT VALIDATED的列作为KEY

二.当主键约束是NOT VALIDATED的时候

1.源端发起insert  ,源端使用all columns作为key,目标端insert需要判断是否冲突,如果不冲突,insert成功,如果冲突,insert失败,会记录失败报错。

2.源端发起update,源端使用all columns作为key,目标端使用all columns作为key去检索需要修改的行,由于部分列无默认值以及可为空的情况下数据会和源端可能不一致,目标端无法检索到需要update的行则将该update转变成insert,insert又会由于Primary CONSTRAINT判断冲突而导致失败,同样会记录ORA-00001: unique constraint主键冲突报错。





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论