作者 | JiekeXu
来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
大家好,我是 JiekeXu,江湖人称“强哥”,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle 11g OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看居然还有 OGG 不支持的语法!欢迎点击最上方蓝字“JiekeXu DBA之路”关注我的微信公众号,然后点击右上方三个点“设为星标”顶,更多干货文章才能第一时间推送,谢谢!
前 言
有这样的一套环境,源端是 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] --注意:这里的 SCN 很重要,后面要使用
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。
经典提取的解决方案选项:
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>'
2. 将来,避免在源数据库上执行不受支持的 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);
3.如果不支持的 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之路】,一起学习新知识!
分享几个数据库备份脚本
一文搞懂 Oracle 统计信息
我的 Oracle ACE 心路历程
MOP 系列|MOP 三种主流数据库索引简介
Oracle 主流版本不同架构下的静默安装指南
关机重启导致 ASM 磁盘丢失数据库无法启动
Oracle SQL 性能分析(SPA)原理与实战演练
Oracle 11g 升级到 19c 需要关注的几个问题
Windows 10 环境下 MySQL 8.0.33 安装指南
SQL 大全(四)|数据库迁移升级时常用 SQL 语句
OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)
Oracle 大数据量导出工具——sqluldr2 的安装与使用
从国产数据库调研报告中你都能了解哪些信息及我的总结建议
使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践
在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?
欢迎关注我的公众号【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
————————————————————————————