确保源表和目标表中的行唯一性

除非在 TABLE 或 MAP 语句中使用 KEYCOLS 子句,否则 Oracle GoldenGate 将根据记录的约束的数量和类型,按以下优先级顺序选择要使用的行标识符(请参阅事务处理日志设置和要求)。

注:JSON Relation Duality Views (JSON DV) 和 JSON Collection Tables (JCT) 不支持 KEYCOLS 子句,因为它们具有单个预定义键 (_id)。

  1. 主键(如果不包含任何扩展的 (32K) VARCHAR2/NVARCHAR2 列)。不含不可见列的主键。

  2. 唯一键:不含不可见列的唯一键。

    对于非集成复制,唯一键的选择如下:

    • 第一个以字母数字方式唯一键,不包含虚拟列、不包含 UDT、不包含基于函数的列、不包含可为空值的列以及不包含扩展 (32K) VARCHAR2/NVARCHAR2 列。要支持包含作为不可见索引一部分的列的键,必须在 Oracle GoldenGate GLOBALS 文件中使用 ALLOWINVISIBLEINDEXKEYS 参数。

    • 第一个按字母数字方式唯一键,不包含虚拟列、不包含 UDT、不包含扩展 (32K) VARCHAR2/NVARCHAR2 列或不包含基于函数的列,但可以包含可为空的列。要支持包含作为不可见索引一部分的列的键,必须在 Oracle GoldenGate GLOBALS 文件中使用 ALLOWINVISIBLEINDEXKEYS 参数。

  3. 不可为 NULL 的唯一键:其中一个唯一键中的至少一列不可为 NULL。这是因为 NOALLOWNULLABLEKEYS 是缺省值。

注意:ALLOWNULLABLEKEYS 对于集成复制无效。

  1. 如果上述关键字类型均不存在(即使表中可能定义了其他类型的关键字),Oracle GoldenGate 将在数据库允许的所有列中构造一个伪关键字用于唯一键,不包括虚拟列、UDT、基于函数的列、扩展 (32K) VARCHAR2/NVARCHAR2 列以及 Oracle GoldenGate 用户显式从 Oracle GoldenGate 配置中排除的任何列。

    除非由于前面的限制而另行排除,否则伪键中将允许出现不可见列。

注:如果表中存在其他不可使用的关键字,或者表中根本没有关键字,则 Oracle GoldenGate 会将相应的消息记录到报表文件中。从所有列构建密钥会妨碍 Oracle GoldenGate 在源系统上的性能。在目标上,此键会导致复制使用较大且效率较低的 WHERE 子句。

如果表没有适当的键,或者您希望不使用现有键,则可以在表具有始终包含唯一值的列时定义替代键。您可以通过在 Extract TABLE 参数和 Replicat MAP 参数中包含 KEYCOLS 子句来定义此替代关键字。指定的键将覆盖 Oracle GoldenGate 找到的任何现有主键或唯一键。有关详细信息,请参阅 Oracle GoldenGate 的参数和函数参考。

如果以下条件与 Oracle Replicat 匹配,则需要使用与源表键列匹配的唯一索引: