表中提取与 DDL 之间的交互
Oracle GoldenGate 支持某些数据类型,方法是从重做流中标识修改的行,然后查询底层表以提取更改的列。例如,通过从重做日志中标识修改的行和 LOB 列,然后从基表中查询该行的 LOB 列值,可以支持对 LOB 进行部分更新。采用类似的技术来支持 UDT。
注意:提取仅当不使用本机对象支持时才需要提取 UDT。
此类基于提取的支持是通过根据提交事务处理的 SCN(系统更改号)向数据库发出闪回查询来实现的。闪回查询功能具有一定的限制。某些 DDL 操作会成为一些障碍,使得闪回查询无法在这些 DDL 之前获取数据。此类 DDL 的示例为 ALTER TABLE MODIFY COLUMN 和 ALTER TABLE DROP COLUMN。
因此,如果存在提取捕获滞后,干预 DDL 可能会导致在 DDL 之前对数据的提取请求失败。在这种情况下,提取会回退并提取修改的列数据的当前快照。此方法有几个限制:首先,DDL 可以修改 Extract 需要提取的列(例如,假设干预的 DDL 向要捕获的 UDT 添加了一个新属性)。其次,DDL 可能修改了提取作为逻辑行标识符的列之一。第三,在 Extract 有机会提取数据之前,该表可能已重命名。
要防止与提取相关的不一致(如这些),请在修改列时采取以下预防措施。
-
将所有 DML 暂停到表中。
-
等待提取完成捕获所有剩余重做,然后等待复制完成对线索中捕获的数据的处理。要确定复制是否已完成,请发出以下命令,直到看到没有更多数据要处理的消息。
INFO REPLICAT *group* -
对源执行 DDL。
-
恢复源 DML 操作。