Oracle GoldenGate 生成表列时始终标识类型_IT 不允许在目标数据库表中插入

Posted

技术标签:

【中文标题】Oracle GoldenGate 生成表列时始终标识类型_IT 不允许在目标数据库表中插入【英文标题】:Oracle GoldenGate When Table column is generate always identity type_IT does not let insert in target DB table 【发布时间】:2020-08-03 05:19:02 【问题描述】:

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

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

(B) 在 TargetDB 中,手动插入 1 条记录,就完成了,id=3。好的。这里id应该是2,但是OGG跳过了2,把这个新添加的记录在Target表中的id设置为3。

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

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

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

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

【问题讨论】:

表 A 中的序列在每个站点中独立管理 ?是主动-主动场景还是复制是单向的? 复制是单向的。 【参考方案1】:

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

序列

对于一个序列,您只能进行单向复制。这表示 您不能以双向或多向复制方式复制序列。 您只能在主动-被动 HA(高可用性)而不是主动-主动 HA 设置中进行复制。您需要通过以下方式关闭序列复制:

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

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

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

身份列

从 OGG v18 开始,集成流程支持身份列的捕获和复制。

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

【讨论】:

谢谢。它解释了为什么标识列会导致唯一约束错误,这与其他由触发器和序列管理的表不同。由于我的预期复制是一种方式,并且当前数据库是 12C,因此可能最好避免使用生成标识列。 我的建议是一样的,如果可以,请避免使用 IDENTITY 列。 GG更好地处理序列。你能接受答案吗?? 是的,您的回答很中肯而且完美!只是无法找到接受答案的地方。稍后我从笔记本电脑登录时会这样做。

以上是关于Oracle GoldenGate 生成表列时始终标识类型_IT 不允许在目标数据库表中插入的主要内容,如果未能解决你的问题,请参考以下文章

创建表列时如何正确使用 ON UPDATE CURRENT_TIMESTAMP?

GoldenGate实施步骤

使用默认值添加不可为空的列时的 Oracle 错误

Oracle GoldenGate学习之Goldengate介绍

oracle GoldenGate 安装

Oracle GoldenGate 18.1发布