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

84d3ddd9b92539cb4630b7335d9ee085.gif

作者 | 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。

1696337fa74c1130330e774c600fb865.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] --注意:这里的 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 及以后的版本中会出现类似的问题。

8dd675408bae4ba003e9401ad756d04b.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

68b23230916a27b7d8b68f4588dd6bc5.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>'
  • 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)不复制序列

554680ebf7cc4b5ce4ec2adcdafabdad.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之路】,一起学习新知识!

b62ffe1522b44453024052d47800d42c.gif

分享几个数据库备份脚本

一文搞懂 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
————————————————————————————

b237393c7f3eb3388e1b2681047be51a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值