Oracle GoldenGate 当生成 [=11g=] 列时始终标识 type_IT 不允许插入目标数据库 table

Oracle GoldenGate When Table column is generate always identity type_IT does not let insert in target DB table

正在尝试使用 Oracle Golden Gate (OGG) 将数据从源数据库复制到副本数据库(目标)。假设我在源数据库中有 TableA 和 B。 A 具有由触发器管理的标识列,该触发器使用序列对象添加唯一编号(12C 之前的旧 Oracle 方式)。 table B 的身份列为“GENERATE ALWAYS AS IDENTITY ...”,这是 12C 中新出现的方式。下面是我的观察,然后是问题: (A) SourceDB TableA,插入1条记录,id=1。然后在TargetDB TableA中,OGG复制了1个insert,id=1。好。

Source A------------------------------------Target A
id=1----------------------------------------id=1

(B)在TargetDB中,手动插入1条记录,搞定,id=3。好的。这里的 id 应该是 2 但 OGG 跳过了 2 并且将 Target table 中这条新添加的记录的 id 设置为 3.

Source A------------------------------------Target A
id=1----------------------------------------id=1
.-------------------------------------------id=3

(C) SourceDB TableA,插入1条记录,id=2。然后在TargetDB TableA中,OGG复制了1个insert,id=2。好。

Source A------------------------------------Target A
id=1----------------------------------------id=1
.-------------------------------------------id=3
id=2----------------------------------------id=2

所以,除了 OGG 的良好行为外,它看起来还不错! 但是当我尝试在 TableB 上做同样的事情时,它在步骤 B 中给了我唯一的约束错误!!看起来是因为 Table B 标识列被定义为 Generate Always as Identity。那么,真的是因为这个吗?这种新方法比使用 sequence.nextValue 对象生成新的唯一 id 列的旧方法引起更多问题。或者在 OGG 中有什么方法可以克服这个问题并使这个 table B 的行为与 Table A 相同,对于步骤 B?

让我们将您的问题分为两种情况:

序列

对于一个序列,您只能复制 one-way 次。这表示 您不能在 two-way 或 multi-way 复制中复制序列。 您只能在 active-passive HA(高可用性)而非 active-active HA 设置中进行复制。您需要通过以下方式关闭序列复制:

  • 使用 TABLEEXCLUDE.
  • 从捕获(提取)中排除序列捕获
  • 禁用在交付 (REPLICAT) 中使用 DBOPTIONS SUPRESSTRIGGERS 处理序列的触发器。

在复制期间,Oracle GoldenGate 捕获序列更新并确保目标序列值等于或高于源序列号:

  • 如果在序列中指定了NOCACHE选项,则每次更新序列时,GoldenGate跟踪中都会显示一个数据条目。
  • 如果为序列指定了 CACHE 选项,则每次更新高水位线时,GoldenGate 跟踪中都会显示一个数据条目。

身份列

从 OGG v18 开始集成进程支持标识列的捕获和复制。

  • 仅集成提取和复制支持捕获和复制。所有其他非集成模式不支持标识列复制,包括经典并​​行和协调复制。
  • 只有具有 OGG v18 及更高版本的 RDBMS 18.x 及更高版本支持标识列的复制。
  • 允许从 OGG v18 及更高版本双向复制标识列
  • 如果目标列是标识列,OGG 复制将使用源中的值覆盖目标。
  • 对于如何在源或目标上设置 IDENTITY 属性 没有限制
  • 此功能无法向后移植到旧版本。
  • 一个空的 table 有一个通过 ALTER 添加的标识列 TABLE ADD 仍然不被支持。