前 言
有这样的一套环境,源端是 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。
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 及以后的版本中会出现类似的问题。
原来是一个 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
Bug 28045394 的最终结果:
对于经典提取,只有当标识列被指定为 CREATE TABLE DDL 的一部分而不被指定为ALTER TABLE DDL 时,标识列才被支持。注意:在 Oracle 数据库 12.2.0.2.0(兼容)及以后的版本中,集成提取支持 Alter table add identity column。
经典提取的解决方案选项:
- 解决当前的提取问题:
a)由于 extract 不能复制 DDL,那么直接在目标数据库中执行不支持的 DDL,首先确保 pump 和 replicat 已经处理了在 extract 终止之前生成的所有 trail 日志
b)配置 extract 忽略不支持的 DDL,在 extract 参数文件中添加如下内容,并重新启动 extract:
-- 将括号内的值替换为特定于环境的实际值 DDL EXCLUDE OPTYPE ALTER OBJNAME <OWNER>.<TABLE> INSTRWORDS 'ADD <NEW COLUMN>'
复制
- 将来,避免在源数据库上执行不受支持的 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);
复制
- 如果不支持的 DDL 在将来是不可避免的,并且上面的第 2 条不是一个选择,那么:
a)每次由于不支持 DDL 而导致提取中断时,执行步骤 1 中的解决方法,或者
b)不复制序列
所以对于经典捕获可以采取如上的方案,当然也可以应用补丁 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
——————————————————————————