Troubleshooting Goldengate OGG-02171 and OGG-02191 Pump Extract process ABENDED

最近处理了一起Goldengate Pump Extract进程abended的案例, 进程日志提示ERROR OGG-02171 Error reading LCR from data source和 ERROR OGG-02191 Incompatible record 104 错误,属于trail文件中的事务记录损坏, 通常是跳过文件中的错误记录,重新启动进程,环境是集成模式的goldengate 18.1。

 

可能发生几种情况:
1) Extract正在写入跟踪,并且记录开头和结尾周围的部分已损坏。 在这种情况下,GoldenGate 丢失了部分数据。
2)两次Extracts错误地写入了同一组trail文件。
3) Extract Pump正在写入跟踪文件,  并且在更新其检查点文件之前以及数据刷新到跟踪之后崩溃。
4)  存储、内存等硬件原因或IO子系统问题,文件写丢失
5)网络问题,TCP/IP 包错误
6) ogg bugs
一些避免的方法:
如果启用了 AsyncIO,Oracle 建议禁用CACHE。测试您的硬件并持续关注任何磁盘或光纤相关的错误。如果使用NAS存储建议使用本地存储观察是否有网络写导致错误。

案例问题现象

Note:
“Incompatible record”是指在一系列常规记录中遇到不完整的记录。 不完整的记录是指丢失header(实际上应该事务开始的地方),并且从记录的中间开始,该记录被认为已损坏。它可能会导致记录不兼容(Incompatible)。 这些可能是由于某种基顾环境错误而导致的。没有简单且正确的方法可以从此类错误中恢复。最后,您有可能最终会丢失一笔交易,您必须从源头重构该交易并使数据保持一致。

处理思路

如果trail是由Pump写入的,您可以有效地停止目标上的replicat和源库的pump,并更改pump以从失败点开始重新发送来自源的所有文件。或者使用下面提到的ogg 12的新特性Automated Remote Trail File Recovery.这样不会有任何数据丢失,如果源trace就坏了,也可以replicat跳过错误移动下一个,增加参数如下,然后重启replicat

如果还有问题可以使用logdump查找下一个seqno和rba, 指定位置跳过事务

在 OGG 12.2 之前,从 trail文件损坏中恢复需要很多步骤,非常繁琐,如果步骤中的任何一个错误都会导致数据完整性问题,并且复制将会混乱,如下:
1, 如记下目标的上次应用的 SCN 和时间戳;
2, 在源中,扫描此Last Applied SCN 的trail文件;
3, 通过更改Pump Extract来重新提取此 SCN 后的数据;
4, 更改 Replicat 进程以从 New Trail Seq# 中读取;
5, 启动 Pump 和 Replicat 进程;

从 Oracle GoldenGate 12.2 开始,引入了一项名为“Automated Remote Trail File Recovery”的新功能。 对于remote trail file损毁的方法恢复真的很方便,以下是步骤:
1. 首先最重要的是停止源端的Pump进程。
2. 首先从损坏的 seq# 开始删除(or rename)所有跟踪文件。
3. 在源中启动 Pump 进程,现在 Extract Pump可以自动重建丢失的trail文件。
4. 启动Replicat 进程。

 

如果trail是有extract写入,pump读取时报错,一种是使用extract从事务的开始重新生成trail, 但是找当前事务的开始比较麻烦,因为当前报错的位置是一个事务的中间而且是个bad recored, 很难定位到事务的最开始(TransInd : . (x00)),并且对于集成模式的extract(因为一些前提条件)不允许修改,从之前的时间重新抽取;另一种是查找到可以read的下一个正常的record事务的开始,跳过中间的错误record, 但是这种会有少量事务的不一致,需要对数据要求严格的环境后期手动对比校验。 这个案例我们处理是跳到下一个正常的extract trail,让pump继续传输。

处理方法
使用logdump工具查找下一条记录postition, 通常需要跳过bad recored当前文件,可能发生在pump或replicat进程.

Note:
可见使用sfh查看前后记录的header 都是错误记录。

SCANFORHEADER
Use SCANFORHEADER to go to the next record header. Before using this command, use the GHDR ON command to show record headers (see “GHDR”). SCANFORHEADER can be
shortened to SFH. PREV Displays the previous record header

SCANFORENDTRANS
Use SCANFORENDTRANS to scan for a record that has a transaction indicator of 2 or 3,as shown in the TransInd field of the header. When one of those indicators is found,Logdump displays the first record of the next transaction.The indicators represent the following:
• 2 — last record in the transaction
• 3 — only record in the transaction
SCANFORENDTRANS can be shortened to SFET.

向后手动指定位置

Note:
手动向后移了一些RBA后可以取到下一个记录head,但是注意TransInd (x01)说明是个事务中间值, 如果修改为这个位置,启动pump会提示如下错误

Transaction Indicator Description:
TransInd : . (x00) First statement in transaction
TransInd : . (x01) Statement in middle of transaction
Translnd : .(x02) last statement in transaction
Translnd : . (x03) Sole statement in transaction

Note:
OGG-01061 ,因为pump stopped/abended时的record 是middle of a tansacton,所以会提示上面的错误, 要找到下一个事务的开始位置TransInd:x00 的RBA,然后再启动。 我们继续查找.

Note:
我们使用SCANFORENDTRANS直接跳到事务结束,然后n取下一条记录.这就是最近的事务开始的RBA位置(trail文件的偏移量). 然后修改pump位置。

Note:
已经恢复正常。

同样如果尝试向前可以extract的位置,重新extract,也可以手动向前尝试减少几个rba值,如报错是198115192, 我们向前定位到198115152

如果我们找到了前一个事务,尝试修改EXTRACT重新生成trail文件。

Note:
如果提取试图更改 FIRST_SCN 之前的读取检查点,则将报告以上错误,ogg有一个增强请求允许未来版本中的 IE(集成模式抽取进程)定位在 FIRST_SCN 之前,即使存在存档日志,集成的提取也无法 定位读取 FIRST_SCN 之前的旧数据

查找集成提取的first_scn:

一旦 FIRST_SCN 前进,IE 就无法重新定位到该 SCN 之前。根据 TRANLOGOPTIONS CHECKPOINTRETENTIONTIME 参数提前 FIRST_SCN 值。 GA 版本上此参数的默认值为 60 天。 在最新版本 11.2.1.0.1 上,该时间为 1 天。

总结:
该案例中对于pump extract读取的trace文件损坏,因为是集成模式(IE),当前模式我们没有办法修改EXTRACT从问题前抽取,也只能修改pump extract跳过trail 中corrupted 记录。 另外因为在尝试extract重新抽取前做了ETROLLOVER,所以记的要手动修改下游的datapump进程指定到新的trail file,否则可能会出现进程一直running停留在ETrollover的配置, 方法如下

此条目发表在Oracle, Oracle troubleshooting分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注