暂无图片
暂无图片
9
暂无图片
暂无图片
暂无图片

震惊!居然还有 OGG 不支持的语法

666

前 言

有这样的一套环境,源端是 Linux x86 下的 Oracle 19c RAC 通过 OGG 将数据复制到目标端的 Oracle 19c 和 kafka 下,即两条通道,一条是同构的 Oracle 到 Oracle 的复制,另一条则是 Oracle 到 kafka 的复制,突然有一天源端环境的 OGG 报错了,EXT2 进程 ABENDED,查看日志报错 : ERROR OGG-02297 This is an unsupported ALTER TABLE statement…

环境说明:

源端 Linux x86 Oracle RAC 19.15, ogg 19.1 集成捕获模式,没有任何补丁。

目标端:Kafka 版本 kafka_2.11-2.0.0, JDK1.8, ogg for bigdata 12.3.2.1.1。

facebook_pro_light_1920 × 1080  副本.png

1) 源端环境说明

如下是源端环境的配置信息,EXT1 进程是到 Kafka 的通道,EXT2 是到目标端 Kafka 的通道,两个进程都是集成捕获,参数配置文件等其他信息如下。

[oracle@jieke-19crac ogg19c]$ ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 19.1.0.0.4 OGGCORE_19.1.0.0.0_PLATFORMS_191017.1054_FBO
Linux, x64, 64bit (optimized), Oracle 19c on Oct 17 2019 21:16:29
Operating system character set identified as UTF-8.

Copyright (C) 1995, 2019, Oracle and/or its affiliates. All rights reserved.
GGSCI (jieke-19crac) 1> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
EXTRACT     RUNNING     DPU1        00:00:00      00:00:05    
EXTRACT     RUNNING     DPU2        00:00:00      00:00:05    
EXTRACT     RUNNING     EXT1        00:00:03      00:00:02    
EXTRACT     ABENDED     EXT2        00:05:04      00:00:01    
					 
GGSCI (jieke-19crac) 2> info ext1

EXTRACT    EXT1      Last Started 2024-05-05 21:48   Status RUNNING
Checkpoint Lag       00:00:03 (updated 00:00:01 ago)
Process ID           77362
Log Read Checkpoint  Oracle Integrated Redo Logs  --集成捕获
                     2024-07-04 14:27:49
                     SCN 21.2763607187 (92957920403)

GGSCI (jieke-19crac) 3> info ext2

EXTRACT    EXT2      Last Started 2024-06-23 10:53   Status ABENDED
Checkpoint Lag       00:00:04 (updated 00:00:09 ago)
Process ID           58717
Log Read Checkpoint  Oracle Integrated Redo Logs  --集成捕获
                     2024-07-04 14:27:50
                     SCN 21.2763609046 (92957922262)
					 

GGSCI (jieke-19crac) 2> view params ext1
extract ext1
USERIDALIAS alias_ogg
exttrail /goldengate/ogg19c/dirdat/xu ,FORMAT RELEASE 12.3
discardfile /goldengate/ogg19c/dirrpt/extxu.dsc, append
statoptions reportfetch
reportrollover at 08:30
GETUPDATEBEFORES
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
table JIEKE_ZZ.*;
table JIEKE_CC.*;
table CC.*;
table OPS.*;
table CC_GP.*;

GGSCI (jieke-19crac) 3> view params dpu2

extract dpu2
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
setenv (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
setenv (TNS_ADMIN=/u01/app/oracle/product/19.0.0/dbhome_1/network/admin)
USERIDALIAS alias_ogg
rmthost  192.168.4.12,mgrport 9809,compress
rmttrail /goldengate/ogg19c/dirdat/jk
passthru
numfiles 3000
TABLE JIEKE_ZZ.T_CRIT;
TABLE JIEKE_ZZ.T_CRIT_APPLY_TEMP;
TABLE JIEKE_ZZ.T_CRIT_FINANCE_TEMP;
......
复制

2) 报错信息

通过查看错误日志发现 EXT 捕获进程发现了一个 DDL,这个 DDL 创建了一个序列 “SEQ_T_GPC_BID_CORP_DETAIL_A_D”,然后将这个 DDL 操作写入到了 trail 文件,注意低版本的 OGG 还需要 goldengate.def 表结构定义才能同步 DDL。接下来发现了另一个 DDL,即 “ALTER TABLE T_GPC_BID_CORP_DETAIL_A_D ADD SEQ_NO NUMBER(18,0) DEFAULT SEQ_T_GPC_BID_CORP_DETAIL_A_D.nextval”,这个 DDL 是一个不支持的语法,然后报错了 “ERROR OGG-02297”,吃惊、震惊,强大无敌的 OGG 居然不支持这个语法?什么鬼?宇宙无敌第一的数据同步软件不支持这个语法。。。真的很好奇呀,其他数据同步软件支持吗?比如 DSG、英方等,欢迎评论区来聊。

view params ext2

2024-06-23 08:00:52  INFO    OGG-00497  Writing DDL operation to extract trail file.

2024-06-23 09:46:18  INFO    OGG-01738  BOUNDED RECOVERY: CHECKPOINT: for object pool 1: p35551_extr: start=SeqNo: 194051, RBA: 57641488, SCN: 21.2064285401 (92258598617), 
Timestamp: 2024-06-23 09:46:05.000000, end=SeqNo: 194051, RBA: 57990956, SCN: 21.2064285688 (92258598904), Timestamp: 2024-06-23 09:46:06.000000, Thread: 1.

2024-06-23 10:09:07  INFO    OGG-01487  DDL found, operation [CREATE SEQUENCE SEQ_T_GPC_BID_CORP_DETAIL_A_D MINVALUE 1 MAXVALUE 99999999999 INCREMENT BY 1 START WITH 1 CACH
E 10 ORDER NOCYCLE (size 128)], start SCN [92259325774], commit SCN [92259325780] instance [ (1)], DDL seqno [0], marker seqno [0].

2024-06-23 10:09:07  INFO    OGG-00487  DDL operation included [INCLUDE ALL], optype [CREATE], objtype [SEQUENCE], objowner "JIEKE_ZZ", objname "SEQ_T_GPC_BID_CORP_DETAIL_
A_D".

2024-06-23 10:09:07  INFO    OGG-00497  Writing DDL operation to extract trail file.


2024-06-23 10:12:44  INFO    OGG-01487  DDL found, operation [ALTER TABLE T_GPC_BID_CORP_DETAIL_A_D ADD SEQ_NO NUMBER(18,0) DEFAULT SEQ_T_GPC_BID_CORP_DETAIL_A_D.nextval (size 107)], start SCN [92259325785], commit SCN [92259900916] instance [ (1)], DDL seqno [0], marker seqno [0].

2024-06-23 10:12:44  INFO    OGG-00487  DDL operation included [INCLUDE ALL], optype [ALTER], objtype [TABLE], objowner "JIEKE_ZZ", objname "T_GPC_BID_CORP_DETAIL_A_D".

Source Context :
  SourceModule            : [ggdb.ora.ddl]
  SourceID                : [../gglib/ggdbora/ddloraext.c]
  SourceMethod            : [DDLDBEXT_validateDDL]
  SourceLine              : [1661]
  ThreadBacktrace         : [14] elements
                          : [/goldengate/ogg19c/libgglog.so(CMessageContext::AddThreadContext())]
                          : [/goldengate/ogg19c/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...))]
                          : [/goldengate/ogg19c/libgglog.so(_MSG_String(CSourceContext*, int, char const*, CMessageFactory::MessageDisposition))]
                          : [/goldengate/ogg19c/extract(DDLDBEXT_validateDDL(extractDDL_t*))]
                          : [/goldengate/ogg19c/extract(DDLEXT_process_extract(extractDDL_t*, ddlProcessingOption_t&, ggs::gglib::gglcr::CommonLCR*, ggs::gglib::ggmetadata:
:SourceTableManager&))]
                          : [/goldengate/ogg19c/extract()]
                          : [/goldengate/ogg19c/extract(RedoIE::transferLCRfromCOM(TransferLCRContext*, ggs::gglib::gglcr::CommonLCR*, long&))]
                          : [/goldengate/ogg19c/extract(RedoIE::xoutReadLCR(ggs::gglib::gglcr::CommonLCR*, long&))]
                          : [/goldengate/ogg19c/extract(ProducerContext::readLCR(bool&, bool&))]
                          : [/goldengate/ogg19c/extract(IXFormatter::readLCR())]
                          : [/goldengate/ogg19c/extract(IXFormatter::FormatterThread(void*))]
                          : [/goldengate/ogg19c/extract(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*))]
                          : [/lib64/libpthread.so.0()]
                          : [/lib64/libc.so.6(clone)]

2024-06-23 10:12:44  ERROR   OGG-02297  This is an unsupported ALTER TABLE statement for table "JIEKE_ZZ"."T_GPC_BID_CORP_DETAIL_A_D".

Source Context :
  SourceModule            : [er.redo.ora.IXFormatter]
  SourceID                : [er/redo/oracle/IXFormatter.cpp]
  SourceMethod            : [getResult]
  SourceLine              : [761]
  ThreadBacktrace         : [15] elements
                          : [/goldengate/ogg19c/libgglog.so(CMessageContext::AddThreadContext())]
                          : [/goldengate/ogg19c/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...))]
                          : [/goldengate/ogg19c/libgglog.so(_MSG_(CSourceContext*, int, CMessageFactory::MessageDisposition))]
                          : [/goldengate/ogg19c/extract()]
                          : [/goldengate/ogg19c/extract(RedoIE::readLCR(ggs::gglib::gglcr::CommonLCR**, long&, bool&))]
                          : [/goldengate/ogg19c/extract(ggs::er::OraTranLogDataSource::readLCR(ggs::gglib::gglcr::CommonLCR**, long&, bool&))]
                          : [/goldengate/ogg19c/extract(ggs::er::ExtractContext::processExtractLoop())]
                          : [/goldengate/ogg19c/extract(ggs::er::ExtractContext::run())]
                          : [/goldengate/ogg19c/extract()]
                          : [/goldengate/ogg19c/extract(ggs::gglib::MultiThreading::MainThread::ExecMain())]
                          : [/goldengate/ogg19c/extract(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*))]
                          : [/goldengate/ogg19c/extract(ggs::gglib::MultiThreading::MainThread::Run(int, char**))]
                          : [/goldengate/ogg19c/extract(main)]
                          : [/lib64/libc.so.6(__libc_start_main)]
                          : [/goldengate/ogg19c/extract()]

2024-06-23 10:12:44  ERROR   OGG-02078  Extract encountered a fatal error in a processing thread and is abending.
复制

经查看,我们相关同事确实是在源端 Oracle 库执行了此 DDL,此 SQL 的功能是在已有表上添加一列并通过调用序列作为默认值。然后不一会儿 OGG 就挂了出现了微信告警。

ALTER TABLE
T_GPC_BID_CORP_DETAIL_A_D
ADD SEQ_NO NUMBER(18,0) DEFAULT SEQ_T_GPC_BID_CORP_DETAIL_A_D.nextvel;
复制

3)问题排查

源端 Oracle 的两个通道一个到 kafka 的通道正常,是因为这个 EXT1 不捕获序列等 DDL,EXT2 是同步部分表到目标端的 Oracle 数据库,而且源端是整个 schema 级别都已捕获,因此会捕获相关 DDL,故出现了上面的报错不支持的语法。

对于 OGG 不太熟悉的朋友,你可能需要查看如下三篇文章。

OGG|Oracle GoldenGate 基础知识
OGG|使用 OGG12.3 同步 Oracle 部分表到 Kafka
OGG|利用 OGG 迁移 Oracle11g 到 19C

4)临时解决方案

我们采取的临时解决办法就是通过上面的日志,查找到这个 SQL 提交时的 SCN 号,即 commit SCN [92259900916],通过跳到这个事务提交的 SCN 进而跳过这个 SQL,然后重启 EXT2 捕获进程恢复源端捕获。这样对于目标端是 Kafka 这端的我们本来不捕获 DDL 是没有问题的,另外对于同构环境目标端是 Oracle 数据库的,我们需要将此 DDL SQL 在目标端数据库上执行,所幸的是我们的目标数据库中没有涉及到这个表对象的同步,故不需要执行。

ggsci
dblogin USERIDALIAS alias_ogg
alter extract ext2 scn 92259900916
start ext2
复制

5)事后排查总结

事后通过上网查找相关资料,终于在 MOS 上找到一篇名为“Extract abends with OGG-02297 This Is An Unsupported ALTER TABLE Statement For Table (Doc ID 2728380.1)” 的文章说明在 OGG 12.3.0.1.0 及以后的版本中会出现类似的问题。

图片.png

原来是一个 Bug 28428061 - 在“不受支持的 ALTER TABLE 状态”时抽取进程异常终止。根据该错误,OGG 抽取进程不支持该类型的 DDL,即带有 ADD 的 ALTER TABLE 命令,其中包含添加带有序列的新列:

Extract abends with OGG-02297 This Is An Unsupported ALTER TABLE Statement For Table (Doc ID 2728380.1)

ALTER TABLE <SCHEMA>.<TABLE>
ADD (ID NUMBER DEFAULT "<SCHEMA>"."COL_SEQ"."NEXTVAL" CONSTRAINT COL NOT NULL);
复制

OGG 12.3、18.1 和 19.1 的均会出现此错误且未公布,不过 Bug 28428061 已作为以下未发布 Bug 的副本关闭:Bug 28045394:在执行 Alter 表以添加标识列时,使用 OGG-02297 进行 OGG:IE & CE abend

图片.png

Bug 28045394 的最终结果:

对于经典提取,只有当标识列被指定为 CREATE TABLE DDL 的一部分而不被指定为ALTER TABLE DDL 时,标识列才被支持。注意:在 Oracle 数据库 12.2.0.2.0(兼容)及以后的版本中,集成提取支持 Alter table add identity column。

经典提取的解决方案选项:

  1. 解决当前的提取问题:

a)由于 extract 不能复制 DDL,那么直接在目标数据库中执行不支持的 DDL,首先确保 pump 和 replicat 已经处理了在 extract 终止之前生成的所有 trail 日志

b)配置 extract 忽略不支持的 DDL,在 extract 参数文件中添加如下内容,并重新启动 extract:

-- 将括号内的值替换为特定于环境的实际值

DDL EXCLUDE OPTYPE ALTER OBJNAME <OWNER>.<TABLE> INSTRWORDS 'ADD <NEW COLUMN>'
复制
  1. 将来,避免在源数据库上执行不受支持的 DDL

a)不能使用 ALTER table 命令在已存在的复制表中添加一个有顺序的新列。

b)如果将来必须将一个有序列的新列添加到现有的复制表中,那么在两个语句中执行DDL,而不是在一个不支持的语句中执行。提取将处理以下内容:

-- 将括号内的值替换为特定于环境的实际值
-- 首先将新列添加到现有表中

ALTER TABLE <OWNER>.<TABLE> ADD (<NEW COLUMN> NUMBER DEFAULT 1);

-- 然后修改新添加的列以使用该序列

ALTER TABLE <OWNER>.<TABLE> MODIFY (<COLUMN> DEFAULT <OWNER>.<SEQUENCE>.NEXTVAL);
复制
  1. 如果不支持的 DDL 在将来是不可避免的,并且上面的第 2 条不是一个选择,那么:

a)每次由于不支持 DDL 而导致提取中断时,执行步骤 1 中的解决方法,或者

b)不复制序列

图片.png

所以对于经典捕获可以采取如上的方案,当然也可以应用补丁 Apply patch for Bug 28045394,这个感兴趣的可以自行尝试。

参考链接

https://www.modb.pro/db/464143 

Extract abends with OGG-02297 This Is An Unsupported ALTER TABLE Statement For Table (Doc ID 2728380.1) 

IE & CE Abend With OGG-02297 On Executing Alter Table To Add Identity Column (Doc ID 2780232.1)
复制

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

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

评论

目录
  • 前 言
  • 1) 源端环境说明
  • 2) 报错信息
  • 3)问题排查
  • 4)临时解决方案
  • 5)事后排查总结
  • 参考链接