暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

级联OGG DDL复制的坑,关键参数你不可不知道!

原创 szrsu 2024-12-31
582

现状

当前环境通过OGG来进行同步数据,架构为A->B->C,都开启了DDL复制。在这过程中发现A->B的DDL复制正常,但DDL却无法同步到C,也就是B->C 不正常。OGG配置使用的是经典模式,这种模式是使用触发器来捕获DDL操作并同步到目标库。

排查

检查进程状态

–检查了B上的进程状态,都是正常

GGSCI (coredb01) 17> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
EXTRACT     RUNNING     DP151       00:00:00      00:00:03    
EXTRACT     RUNNING     EXT151      00:00:00      00:00:08 

–检查了C上的进程状态,也是正常

GGSCI (corebak) 1> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING                                           
REPLICAT    RUNNING     REP211      00:00:00      00:00:00   

创建测试表

–手动在B上创建一个测试表

SQL> create table szr.tddl(id int,name varchar2(10));

Table created.

–在C上可以查询到

SQL> desc szr.tddl;
 Name																													   Null?    Type

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------

 ID																													       NUMBER(38)
 NAME																													       VARCHAR2(10)

手动创建的表DDL同步正常。

把B和C上该表删除,在A上重新进行创建,发现A和B存在该表,C查不到,还是没同步过来。

问题根源

从上面的测试过程,我们可以看到,各个进程状态是正常的,手动在B上执行的DDL是可以正常复制到C,说明DDL是正常开启的。那为什么通过OGG进程就无法自动同步DDL呢?

查看了一下官方文档,找到如下说明:

GETREPLICATES | IGNOREREPLICATES

Valid for Extract (Oracle only). Controls whether or not DDL operations produced by Replicat are included in the content that Extract writes to a trail or file. The default is IGNOREREPLICATES. For more information, see the GETAPPLOPS | IGNOREAPPLOPS options of DDLOPTIONS.

GETAPPLOPS | IGNOREAPPLOPS

Valid for Extract. (Oracle only)

Controls whether or not DDL operations produced by business applications except Replicat are included in the content that Extract writes to a trail or file. GETAPPLOPS and IGNOREAPPLOPScan be used together with the GETREPLICATES and IGNOREREPLICATES options to control which DDL is propagated in a bidirectional or cascading configuration.

  • For a bidirectional configuration, use GETAPPLOPS with IGNOREREPLICATES. You also must use the UPDATEMETADATA option.
  • For a cascading configuration, use IGNOREAPPLOPS with GETREPLICATES on the systems that will be cascading the DDL operations to the target.

The default is GETAPPLOPS.

上面的两个参数说明:

IGNOREREPLICATES 和 GETREPLICATES 控制extract是否忽略由replicat产生的ddl操作

GETAPPLOPS 和 IGNOREAPPLOPS 控制extract是否忽略由应用等其他操作产生的ddl操作

默认的配置是:DDLOPTIONS GETAPPLOPS, IGNOREREPLICATES,也就是忽略replicat产生的ddl操作,如果需要抓取replicat产生的ddl操作,需要配置DDLOPTIONS GETREPLICATES。

–修改B上的抽取进程,添加以下参数:

DDLOPTIONS GETREPLICATES

进行重启抽取进程生效,问题就解决,B->C的ddl复制正常了,不管是通过手动执行的DDL还是OGG自动执行的DDL,都能正常同步。

顺带提一下,如果是添加的以下参数:

DDLOPTIONS GETREPLICATES, IGNOREAPPLOPS

那么只有OGG应用的DDL能正常同步,非OGG应用的DDL则无法同步(如手动执行),可根据自己的情况,进行选择配不配置。

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

评论