现状
当前环境通过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
GETAPPLOPSwithIGNOREREPLICATES. You also must use theUPDATEMETADATAoption. - For a cascading configuration, use
IGNOREAPPLOPSwithGETREPLICATESon 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则无法同步(如手动执行),可根据自己的情况,进行选择配不配置。




