自动冲突检测和解决方案
当 Oracle GoldenGate 复制 Oracle 数据库之间的更改时,您可以在 Oracle 数据库中配置和管理 Oracle GoldenGate 自动冲突检测和解决。注:自动冲突检测和解决功能可从 Oracle Database 12c 发行版 2 (12.2) 及更高版本获得,并与 Oracle GoldenGate 12c (12.3.0.1) 及更高版本一起使用。提供了手动冲突检测和解决功能,称为 Oracle GoldenGate 冲突检测和解决 (CDR)。Oracle GoldenGate CDR 在 Replicat 参数文件中配置。要了解有关 Oracle GoldenGate CDR 的更多信息,请参阅手动冲突检测和解决。
关于自动冲突检测和解决
当 Oracle GoldenGate 复制 Oracle 数据库之间的更改时,您可以在这些数据库中自动配置和管理 Oracle GoldenGate 冲突检测和解决。
此功能用于主动 - 主动配置,其中 Oracle GoldenGate 必须在包含相同数据集的多个数据库之间保持数据同步。
注:自动冲突检测和解决 (Automatic conflict Detection and Resolution,ADR) 功能仅在将 Oracle GoldenGate 与 Oracle AI Database 一起使用时可用。对于非 Oracle 数据库,Oracle GoldenGate 提供了手动冲突检测和解决 (CDR) 功能。Oracle GoldenGate CDR 在 Replicat 参数文件中配置。
自动冲突检测和解决方案
您可以在 Oracle GoldenGate 配置中配置自动冲突检测和解决方法,以在 Oracle 数据库之间复制表。要为表配置自动冲突检测和解决方法,需要调用 DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR 过程。设置自动冲突检测和解决的先决条件是,Oracle GoldenGate 用户必须具有相应的权限。要了解用户权限,请参见 Grant User Privileges for Oracle AI Database 26ai and Higher 和 Grant User Privileges for Oracle Database 21c and Lower 。
调用 ADD_AUTO_CDR 时,管理员用户必须登录到相应的 PDB。现在添加了以下表示位标志的常量:
-
EARLIEST_TIMESTAMP_RESOLUTION自动设置TOMBSTONE KEY VERSIONING -
DELETE_ALWAYS_WINS自动设置TOMBSTONE KEY VERSIONING。 -
IGNORE_SITE_PRIORITY
以下示例对 HR.EMPLOYEES 表使用 ALTER 命令:
BEGIN
dbms_goldengate_adm.alter_auto_cdr
(schema_name => 'HR'
,table_name => 'EMPLOYEES'
,additional_options => DBMS_GOLDENGATE_ADM.ADDITIONAL_OPTIONS_ADD_KEY_VERSION );
END;
/
请参阅 Oracle AI Database PL/SQL Packages and Types Reference 的 ADD_AUTO_CDR Procedure 中有关 additional_options 的说明。
当 Oracle GoldenGate 捕获源自 Oracle AI Database 的更改时,每个更改都会封装在行逻辑更改记录 (LCR) 中。行 LCR 是 DML 行更改的结构化表示形式。每一行 LCR 包括操作类型、旧列值和新列值。多个行 LCR 可以是单个数据库事务处理的一部分。
当一个表的多个副本允许对表进行更改时,在几乎同时对两个不同数据库中的同一行进行更改时,可能会发生冲突。Oracle GoldenGate 使用行 LCR 复制更改。它通过将来自源数据库的初始更改的行 LCR 中的旧值与由关键字列标识的目标数据库中的对应表行的当前值进行比较来检测冲突。如果任何列值都不匹配,则存在冲突。
检测到冲突后,Oracle GoldenGate 可以通过使用行 LCR 中的某些值覆盖行中的值、忽略行 LCR 中的值或计算差值来更新行值来解决冲突。
由于以下原因,自动冲突检测和解决不需要更改应用程序:
-
Oracle AI Database 会自动创建和维护不可见的时间戳列。
-
插入、更新和删除操作使用删除墓碑日志表来确定是否删除了行。
-
可以检测到 LOB 列冲突。
-
Oracle AI Database 会自动为所需的列配置补充日志记录。
提示:
有关补充日志记录的信息,另请参阅 Oracle AI Database Utilities
自动冲突检测和解决方案的要求
以下是在 Oracle GoldenGate 中配置自动 CDR 的主要要求:
-
需要补充日志记录来确保每一行 LCR 均具有检测和解决冲突所需的信息。对表执行 DML 操作时,补充日志记录会将附加信息放在表的列的重做日志中。为 Oracle GoldenGate 冲突检测和解决配置表时,将自动为表中的所有列配置补充日志记录。复制表更改时,重做日志中的其他信息将放置在 LCR 中。
提取必须用于捕获。必须在应用端使用集成模式下的集成复制或并行复制。
LOGALLSUPCOLS应保留默认值。 -
有一个类型为时间戳的隐藏字段
KEYVER$$,可以选择性地添加到DELETE TOMBSTONE表中。此字段对于EARLIEST TIMESTAMP、DELETE ALWAYS WINS和SITE PRIORITY解析是必需的,它也存在于基表中。线索文件元数据中需要以标志或标记形式提供基表中的字段。DELETE TOMBSTONE表中还支持主键更新。在DELETE TOMBSTONE表中为原始键值行插入一个条目(在图像之前)。提取中的逻辑(将DELETE TOMBSTONE表中的 INSERTS 与 DELETES 匹配)也需要与 PK 更新匹配,或者与至少一个不可为空字段的唯一关键字 (UK)(如果没有 PK)。 -
在实施参数并将设置传递到复制之前,
SITE PRIORITY需要从复制获得支持。 -
自动 CDR 不适用于其他
MAP级别的异常和错误处理配置,例如REPERROR、MAPEXCEPTION。可以使用自动 CDR 或REPERROR/MAPEXCEPTION,但不能在同一表中同时使用两者。要了解详细信息,请参见TABLE \| MAP和REPERROR。
兼容性和迁移
如果源数据库中的基表不包含 KEYVER$$ 列,但目标基表具有 DELETE 和主键更新会导致目标数据库中的 EARLIEST TIMESTAMP、DELETE ALWAYS WINS 和 SITE PRIORITY 解析错误。
从具有 KEYVER$$ 的基表复制到目标表(没有)时,将忽略 KEYVER$$ 列。
列组
列组是复制表中一个或多个列的逻辑分组。添加列组时,将对列组中的列执行冲突检测和解决,这些列与表中的其他列分开执行。
使用 ADD_AUTO_CDR 过程为 Oracle GoldenGate 冲突检测和解决配置表时,该表中的所有标量列都将添加到默认列组。要为表定义其他列组,请运行 ADD_AUTO_CDR_COLUMN_GROUP 过程。表中不属于用户定义列组的任何列都保留在该表的默认列组中。
列组允许不同的数据库几乎同时更新同一行中的不同列,而不会造成冲突。为表配置列组时,即使不同的数据库更新表中的同一行,也可以避免冲突。如果更新更改了不同列组中的列值,则不会检测到冲突。
图 1:列组

此示例显示了在数据库 A 和数据库 B 中复制的行。为每个数据库中的复制表配置了以下两个列组:
-
一个列组包含
Office列。此列组的不可见时间戳列为TS1。 -
另一个列组包括
Title和Salary列。此列组的不可见时间戳列为TS2。
这些列组使数据库 A 和数据库 B 能够几乎同时更新同一行,而不会造成冲突。具体而言,进行了以下更改:
-
在数据库 A 中,
Office的值已从1080更改为1030。 -
在数据库 B 中,
Title的值已从MTS1更改为MTS2。
由于 Office 列和 Title 列位于不同的列组中,因此将复制更改,而不会检测到冲突。结果是,在复制每个更改后,行中的值在两个数据库中都相同。
逐个 LOB 更新
由 LOB WRITE、LOB ERASE 和 LOB TRIM 组成的一组 LOB 操作是逐个 LOB 更新。如果为包含 LOB 列的表配置了冲突检测和解决方法,则每个 LOB 列将放置在其自己的列组中,并且列组具有自己的隐藏时间戳列。在第一个逐个 LOB 操作上更新时间戳列。
对于 LOB 列,将通过以下方式检测并解决冲突:
-
如果 LOB 列组的时间戳晚于行中相应的 LOB 列组,则会应用逐个 LOB 更新。
-
如果 LOB 列组的时间戳早于行中的对应 LOB 列组,则表行中的 LOB 将保留。
-
如果表中不存在该行,则会引发错误。
最早的时间戳冲突检测和解决
名称为 CDRTS$ column group 和 CDRTS$ROW 形式的列用于包含反映列组和行的修改时间的时间戳。
注:具有 $ 或 $$ 符号的表是内部表或隐藏表。
DBMS_GOLDENGATE_ADM 包含以下用于配置最早和最晚时间戳解析的过程:
-
ADD_AUTO_CDR() -
ADD_AUTO_CDR_COLUMN_GROUP() -
REMOVE_AUTO_CDR() -
REMOVE_AUTO_CDR_COLUMN_GROUP() -
ALTER_AUTO_CDR() -
ALTER_AUTO_CDR_COLUMN_GROUP()
ADD_AUTO_CDR() 和 ALTER_AUTO_CDR() 中的字段 ADDITIONAL_OPTIONS 启用使用最早时间戳。开启最早的时间戳会自动打开版本控制,这会添加一个新的时间戳类型的隐藏列 KEYVER$$(版本号)。添加新标志值以指示最早的时间戳使用。此字段还会添加到 DELETE TOMBSTONE 表中。删除冲突是需要版本号的原因。通过最早的时间戳解析,可以透明的删除冲突可能不仅错误地成功,而且可能会阻止行的新插入(新版本)。使用版本时间戳,可以针对同一行版本的行 DML 正确解析删除。
行的原始插入将从其默认值接收当前时间戳。然后,删除该行会将版本号和插入该行的时间插入到墓碑表中,当存在删除时。默认情况下,在新插入时,版本号将再次收到当前时间戳,从而避免与墓碑表中的当前删除条目发生错误冲突。
示例
假设您的表 tab1 在站点 1 和站点 2 上的数据库之间具有全局一致性。
该表包含一个(主)键。ACDR 将自动维护密钥版本 (kv) 和时间戳 (ts) 作为基表(隐藏)和墓碑表的列。对于密钥版本 kv 和时间戳 ts
数据库 1:insert tab1 key1 kv1 ts1
数据库 2:delete tab1 key1 kv1 ts1
插入 DELETE TOMBSTONE 表 key1 kv1 ts1
数据库 1:insert tab1 key1 kv2 ts2
如果不使用密钥版本,则将忽略插入,删除时间戳将更早。使用密钥版本时,您知道 kv2 不是已删除且插入成功行的版本。
最新时间戳冲突检测和解决
在 DBMS_GOLDENGATE_ADM 软件包中运行 ADD_AUTO_CDR 过程以配置用于自动检测和解决 Oracle GoldenGate 冲突的表时,会向表中添加一个隐藏的时间戳列。此隐藏的时间戳列记录行更改的时间,此信息用于检测和解决冲突。
应用行 LCR 时,INSERT、UPDATE 或 DELETE 操作可能会发生冲突。下表介绍了每种类型的冲突及其解决方法。
| 操作 | 冲突检测 | 冲突解决方案 |
|---|---|---|
INSERT |
当表的键列值与行 LCR 中的新值相同时,检测到冲突。 | 如果行 LCR 的时间戳晚于表行中的时间戳,则行 LCR 中的值将替换表中的值。 如果行 LCR 的时间戳早于表行中的时间戳,则将放弃行 LCR,并保留表值。 |
UPDATE |
在以下每种情况下都检测到冲突:
|
如果存在值不匹配,且行 LCR 的时间戳晚于表行中的时间戳,则行 LCR 中的值将替换表中的值。 如果存在值不匹配,且行 LCR 的时间戳早于表行中的时间戳,则将放弃行 LCR,并保留表值。 如果表行不存在,且行 LCR 的时间戳晚于墓石表行中的时间戳,则行 LCR 将从 如果表行不存在,且行 LCR 的时间戳早于墓石表行中的时间戳,则将放弃行 LCR。 如果表行不存在并且墓碑表中没有对应的行,则行 LCR 将从 |
DELETE |
在以下每种情况下都检测到冲突:
|
如果行 LCR 的时间戳晚于表中的时间戳,则从表中删除该行。 如果行 LCR 的时间戳早于表中的时间戳,则将放弃行 LCR,并保留表值。 如果删除成功,则通过将行 LCR 插入到墓碑表中来记录该行。 如果表行不存在,则通过将行 LCR 插入到墓碑表中来记录该行。 |
下图显示了数据库 A 与数据库 B 之间的冲突解决方法: 
此示例显示了在数据库 A 和数据库 B 中复制的行。数据库列为 Name、RowTS、Office、Title 和 Salary。RowTS 列是两个数据库中的不可见列。数据库 A 的 Office 列中有一个更新,同时数据库 B 的 Title 列中有一个更新。这会导致冲突,并应用最新时间戳方法解决此冲突。
-
在数据库 A 中,
Office列中的值从 1080 更新为 1103 ,RowTS 值从 @TS10 更改为 @TS20 。箭头指示此更改将复制到数据库 B。 -
在数据库 B 中,
Title列的值从 MTS1 更改为 MTS2 ,RowTS 值从 @TS10 更改为 @TS22 。 -
要解决此冲突,数据库 B 中存在的最新时间戳将获胜。这意味着不会应用数据库 A 中的更改。应用于数据库 A 和数据库 B 的最终值包括 Scott、@TS22、1080、MTS2、100。
增量冲突解决方法
在增量冲突检测中,当行 LCR 的旧列列表中的值与表中相应行的值不同时,会发生冲突。
要为表配置增量冲突检测和解决方法,请运行 DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR_DELTA_RES 过程。增量解析方法不依赖于时间戳或额外的解析列。通过解决增量冲突,可以通过将行 LCR 中的新值和旧值之间的差异添加到表中的值来解决冲突。此解决方法通常用于财务数据,例如帐户余额。例如,如果同时在两个地点更新银行余额,则所有借项和贷项的合并值帐户。
下图提供了说明增量冲突检测和解决方法的示例。
图 2:三角洲冲突检测和解决

此示例显示了在数据库 A 和数据库 B 中复制的行。Balance 列被指定为执行增量冲突解决的列,RowTS 列是用于跟踪每次对 Balance 列进行更改的时间的不可见时间戳列。将几乎同时更改两个数据库行中的 Balance 值(数据库 A 中的 @T20 和数据库 B 中的 @T22)。这些更改会导致冲突,增量冲突解决方案用于以下方式解决冲突:
-
在数据库 A 中,
Balance的值已从1000更改为1750。因此,该值增加了 750。 -
在数据库 B 中,
Balance的值已从1000更改为950。因此,该值减少了 50。 -
要解决数据库 A 中的冲突,请将行 LCR 中的新值和旧值与表中的值之间的差异值。LCR 中的新值和旧值之间的差异是 (1000+750-50=1700)。表中的当前值增加 700,以便解决冲突后的值是 1700。
-
要解决数据库 B 中的冲突,请将行 LCR 中的新值与旧值与表中的值之间的差异值。LCR 中的新值和旧值之间的差异是 750(1000 - 50 + 750)=1700。因此,表 (950) 中的当前值增加了 750,因此解决冲突后的值是 1700。
解决增量冲突后,对于数据库 A 和数据库 B 中的行,Balance 列的值相同。
地点优先级 CDR
注:SITE PRIORITY 解析优先于所有 COLUMN GROUP 解析设置。
注:如果 SITE PRIORITY Replicat 参数未放在参数文件中适用的 map 语句之前,它将不起作用。此参数必须放置在适用的映射语句之前。
在源和目标之间的 Replicat 参数文件中指定优先级解决以解决冲突。
使用参数 ACDR SITE_PRIORITY {source_db_name}{OVERWRITE | IGNORE } 为 Replicat 参数文件中的数据库或 PDB 启用 SITE PRIORITY,该参数指定为打开表的 SITE PRIORITY 解析。
如果指定了 OVERWRITE 选项,则源表优先,冲突由 OVERWRITE 解决。相反,如果指定了 IGNORE 选项,则目标表具有优先级,并且会在冲突中忽略源表更改。
DBMS_GOLDENGATE_ADM 软件包中 ADD_AUTO_CDR() 过程中的字段 ADDITIONAL_OPTIONS 和 ALTER_AUTO_CDR() 可以通过设置 IGNORE_SITE_PRIORITY 来禁用 SITE PRIORITY 解析。
每个复制源 - 目标关系都可以以不同的方式设置,因此,收敛取决于用户设置。
删除始终赢得时间戳 CDR
通过 DBMS_GOLDENGATE_ADM 过程 ADD_AUTO_CDR() 和 ALTER_AUTO_CDR() 中的字段 ADDITIONAL_OPTIONS 启用 DELETE ALWAYS WINS。这再次是删除冲突解决方法,该方法不使用最新时间戳解决方法,因此需要版本控制。启用 DELETE ALWAYS WINS 会自动打开版本控制,这将添加一个新的隐藏列 KEYVER$$(版本号),该列类型为时间戳。还会在 acdrflags_kqldtvc 中添加新标志值以指示 DELETE ALWAYS WINS 的用法。此字段还会添加到 DELETE TOMBSTONE 表中。存在与 EARLIEST TIMESTAMP 解析相同的版本化问题。
示例:
密钥版本 kv 和时间戳 ts
数据库 1:insert tab1 key1 kv1 ts1
数据库 2:delete tab1 key1 kv1 ts1
插入 DELETE TOMBSTONE 表 key1 kv1 ts1
数据库 1:insert tab1 key1 kv2 ts2
如果不使用密钥版本,则将忽略插入,删除将始终获胜。使用密钥版本时,您知道 kv2 不是已删除且插入成功行的版本。
DELETE TOMBSTONE 表
DELETE TOMBSTONE 表是已删除记录的标记,用于将其与从未存在的记录区分开来。DELETE TOMBSTONE 表至少包含关键字列和操作时间戳。删除收敛需要此信息,因为某些传入的更新和插入可能从其他站点延迟,并且传入的 LCR 需要根据墓碑操作时间戳进行筛选,以确定是否应应用。
跟踪删除墓石中的主键更新
对主键 (PK) 更新的完全支持需要处理键前面映像所表示的行和键后面映像所表示的行上的冲突。PK 更新是自治删除和插入,因此,对于与密钥的先前映像冲突以及与密钥的后续映像(和行)的插入,必须支持 PK 更新冲突作为删除。
支持 PK 更新以删除关键字的先前图像表示的行表示,这意味着它应作为删除插入到删除墓碑表中。更新 PK 时,将添加更新内部触发器以插入到墓碑表中(实际上是标识关键字的行,PK(如果存在)或具有至少一个不可为空列的所选英国)。由于 PK 更新可能会导致两个冲突,因此在行级别尝试最多两次解析,删除具有原始 PK 的行以及插入具有新 PK 的行。
示例:使用最新时间戳解析
数据库 1:更新到 tab1 key1 at ts1
数据库 2:更新到 tab1 key1 set key1 to key2 ts2
数据库 3:更新到 tab1 key2 ts3
在此方案中,似乎应删除行级别为 tab1、带有 key1 的行,并且数据库 3 更新应是 tab1 行关键字的最终修改
- 如果数据库 2 位于
ts3,数据库 3 位于ts3,则数据库 2 的 PK 更新将是tab1行key2的最终修改。
现在,请考虑以下情况:数据库 1 在 ts3,数据库 2 在 ts2,数据库 3 在 ts1,然后数据库 1 上对 tab1 行 key1 的更新应该成功,tab1 行 key2 上的数据库 2 的 PK 更新应该成功。此时,看起来完整的分辨率是,必须分别解析之前映像的删除和之后映像的插入。这意味着它们不是相互依赖的,而是一个人的损失,不是两者的损失。
配置 Delta 冲突检测和解决
DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR_DELTA_RES 过程配置增量冲突检测和解决。
通过增量冲突解决,您可以指定一个可检测和解决冲突的列。如果行 LCR 中的列值与表中的相应值不匹配,则会检测到冲突。通过将行 LCR 中的新值与旧值之间的差异添加到表中的值来解决冲突。
您可以使用 DBMS_GOLDENGATE_ADM 软件包中的 GRANT_ADMIN_PRIVILEGE 过程配置 Oracle GoldenGate 管理员。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
ADD_AUTO_CDR过程并指定要为最新时间戳冲突检测和解决配置的表。 -
运行
ADD_AUTO_CDR_DELTA_RES过程并指定执行增量冲突检测和解决的列。 -
重复复制表的每个 Oracle AI Database 中的前几个步骤。
示例 9-23 为表配置 Delta 冲突检测和解决
此示例为 oe.orders 表中的 order_total 列配置增量冲突检测和解决。
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
SCHEMA_NAME => 'OE',
TABLE_NAME => 'ORDERS');
END;
/
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
SCHEMA_NAME => 'OE',
TABLE_NAME => 'ORDERS',
COLUMN_NAME => 'ORDER_TOTAL');
END;
/
配置最新时间戳冲突检测和解决方法
DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR 过程配置最新时间戳冲突检测和解决方法。ADD_AUTO_CDR_COLUMN_GROUP 过程添加可选的列组。
对于 Oracle AI Database 26ai 及更高版本,还提供了其他方法来管理和维护 ACDR 配置的表。您可以将与 AUTO-CDR 相关的底层列保留为 UNUSED 列,或者在调用 REMOVE_AUTO_CDR 过程后立即将其删除。
如果对表应用 ADD_AUTO_CDR 过程,则默认情况下,如果删除 AUTO_CDR,其内部列将被标记为“不使用”。调用 REMOVE_AUTO_CDR 之后,可以在以后阶段手动删除未使用的列,也可以使用其他一些参数立即删除未使用的列。有关详细信息,请参见 Removing Conflict Detection and Resolution From a Table 。
要了解更多信息,请参阅 Oracle AI Database PL/SQL Packages and Types Reference 中的 ADD_AUTO_CDR Procedure
使用最新时间戳冲突检测和解决方法,当行 LCR 的时间戳列与对应表行的时间戳不匹配时会检测到冲突。如果时间戳晚于此时间戳,则应用行 LCR。否则,将放弃行 LCR,并且不会更改表行。运行 ADD_AUTO_CDR 过程时,它会为指定表中的每一行添加一个不可见的时间戳列,并配置时间戳冲突检测和解决方法。使用 ADD_AUTO_CDR_COLUMN_GROUP 过程添加一个或多个列组时,它会为列组添加时间戳,并为列组配置时间戳冲突检测和解决方法。
您可以使用 DBMS_GOLDENGATE_ADM 软件包中的 GRANT_ADMIN_PRIVILEGE 过程配置 Oracle GoldenGate 管理员。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
ADD_AUTO_CDR过程并指定要为最新时间戳冲突检测和解决配置的表。 -
运行
ADD_AUTO_CDR_COLUMN_GROUP过程,并在表中指定一个或多个列组。 -
重复复制表的每个 Oracle AI Database 中的前几个步骤。
示例 9-24 为表配置最新时间戳冲突检测和解决方法
此示例为 hr.employees 表配置最新时间戳冲突检测和解决方法。
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES');
END;
/
示例 9-25 配置列组
此示例配置以下列组以解决 HR.EMPLOYEES 表上的时间戳冲突:
-
JOB_IDENTIFIER_CG列组包括JOB_ID、DEPARTMENT_ID和MANAGER_ID列。 -
COMPENSATION_CG列组包含SALARY和COMMISSION_PCT列。
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES',
COLUMN_LIST => 'JOB_ID, DEPARTMENT_ID, MANAGER_ID',
COLUMN_GROUP_NAME => 'JOB_IDENTIFIER_CG');
END;
/
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES',
COLUMN_LIST => 'SALARY, COMMISSION_PCT',
COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;
/
配置 Delta 冲突检测和解决
DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR_DELTA_RES 过程配置增量冲突检测和解决。
通过增量冲突解决,您可以指定一个可检测和解决冲突的列。如果行 LCR 中的列值与表中的相应值不匹配,则会检测到冲突。通过将行 LCR 中的新值与旧值之间的差异添加到表中的值来解决冲突。
您可以使用 DBMS_GOLDENGATE_ADM 软件包中的 GRANT_ADMIN_PRIVILEGE 过程配置 Oracle GoldenGate 管理员。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
ADD_AUTO_CDR过程并指定要为最新时间戳冲突检测和解决配置的表。 -
运行
ADD_AUTO_CDR_DELTA_RES过程并指定执行增量冲突检测和解决的列。 -
重复复制表的每个 Oracle AI Database 中的前几个步骤。
示例 9-26 为表配置 Delta 冲突检测和解决
此示例为 oe.orders 表中的 order_total 列配置增量冲突检测和解决。
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
SCHEMA_NAME => 'OE',
TABLE_NAME => 'ORDERS');
END;
/
BEGIN
DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
SCHEMA_NAME => 'OE',
TABLE_NAME => 'ORDERS',
COLUMN_NAME => 'ORDER_TOTAL');
END;
/
管理自动冲突检测和解决
您可以使用 DBMS_GOLDENGATE_ADM 程序包在 Oracle AI Database 中管理 Oracle GoldenGate 自动冲突检测和解决。
更改表的冲突检测和解决方法
DBMS_GOLDENGATE_ADM 软件包中的 ALTER_AUTO_CDR 过程会更改表的冲突检测和解决方法。
必须为表配置 Oracle GoldenGate 自动冲突检测和解决:
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
ALTER_AUTO_CDR过程并指定要为最新时间戳冲突检测和解决配置的表。 -
重复复制表的每个 Oracle AI Database 中前面的所有步骤。
示例 9-27 更改表的冲突检测和解决方法
此示例更改 HR.EMPLOYEES 表的冲突检测和解决方法,以指定在墓碑表中跟踪删除冲突。
BEGIN
DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES',
TOMBSTONE_DELETES => TRUE);
END;
/
更改列组
ALTER_AUTO_CDR_COLUMN_GROUP 过程会更改列组。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
ALTER_AUTO_CDR_COLUMN_GROUP过程,并在表中指定一个或多个列组。 -
重复复制表的每个 Oracle AI Database 中之前的所有步骤。
示例 9-28 更改列组
此示例从 HR.EMPLOYEES 表的 JOB_IDENTIFIER_CG 列组中删除 MANAGER_ID 列。
BEGIN
DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR_COLUMN_GROUP(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES',
COLUMN_GROUP_NAME => 'JOB_IDENTIFIER_CG',
REMOVE_COLUMN_LIST => 'MANAGER_ID');
END;
/
注:如果有多个列,则使用逗号分隔的列表。
清除墓石行
PURGE_TOMBSTONES 过程将删除在指定日期和时间之前记录的墓碑行。此过程将删除为解决数据库中冲突而配置的所有表的墓碑行。
可能有必要定期清除墓碑行,以防止墓碑日志随着时间的推移变得过大。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
PURGE_TOMBSTONES过程并指定日期和时间。
示例 9-29 清除墓碑行
此示例清除 2015 年东部标准时间 12 月 1 日下午 3:00 之前记录的所有墓碑行。必须以 TIMESTAMP WITH TIME ZONE 格式输入时间戳。
EXEC DBMS_GOLDENGATE_ADM.PURGE_TOMBSTONES('2015-12-01 15:00:00.000000 EST');
ACDR 表上的联机重新定义
Oracle AI Database 允许在使用 DBMS_REDEFINITION 程序包重组表或列时缓解应用程序交互。DBMS_REDEFINITION 程序包可用于执行以下任务:
-
删除不使用的列。
-
重组、表空间重新设计和分区。
DBMS_REDFINITION.START_REDEF_TABLE 会自动管理临时表的隐藏时间戳列。
有关 DBMS_REDFINITION 程序包的详细信息,请参阅 Oracle AI Database PL/SQL Packages and Types Reference 中的 DBMS_REDEFINITION 。
从表中删除冲突检测和解决方法
在 Oracle AI Database 及更高版本中,完全从表中删除自动冲突检测和解决 (Automatic Conflict Detection and Resolution,ADR) 对表的影响较小,因为如果删除 AUTO_CDR,与 AUTO_CDR 相关的列将标记为 UNUSED。
调用 REMOVE_AUTO_CDR 过程后,可以在维护窗口中手动删除未使用的列。这对于 ALTER TABLE ... DROP COLUMN 操作占用大量资源的大型表非常有用。
如果要在调用 REMOVE_AUTO_CDR 过程时立即删除所有 AUTO_CDR 内部列,则必须首先使用 ADD_AUTO_CDR 或 ALTER_AUTO_CDR 过程的 additional_options 参数 REMOVE_HIDDEN_COLUMNS 标记表。
使用 DBMS_GOLDENGATE_ADM 软件包中的 REMOVE_AUTO_CDR 过程将表标记为 UNUSED,从而最大程度地减少阻塞。您可以选择删除列或将其保留在以后阶段。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
REMOVE_AUTO_CDR过程并指定表。 -
重复复制表的每个 Oracle AI Database 实例中前面的所有步骤。
示例 9-30 删除表的冲突检测和解决方法
此示例删除 HR.EMPLOYEES 表的冲突检测和解决方法。
BEGIN
DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES');
END;
/
通过在 ADD_AUTO_CDR 过程中使用 ADD_AUTO_CDR.REMOVE_HIDDEN_COLUMNS 标志作为 additional_flags 参数,可以选择删除列。
下面是一个可用于查看表中隐藏列的示例。
以下查询使用 DBA_UNUSED_COL_TABS 程序包来确定 EMPLOYEES 表中是否存在未使用的列。
SELECT OWNER, TABLE_NAME, COUNT
FROM DBA_UNUSED_COL_TABS
WHERE OWNER = 'HR'
AND TABLE_NAME = 'EMPLOYEES'
ORDER BY OWNER, TABLE_NAME;
输出显示如下:
OWNER TABLE_NAME COUNT
-------- ------------ ----------
HR EMPLOYEES 1
以下查询列出在为 EMPLOYEES 表中的列组删除 ACDR 时系统标记的隐藏列。
SELECT OWNER, TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, HIDDEN_COLUMN
FROM DBA_TAB_COLS
WHERE OWNER = 'HR'
AND TABLE_NAME = 'EMPLOYEES'
AND HIDDEN_COLUMN = 'YES' AND USER_GENERATED= 'NO'
ORDER BY OWNER, TABLE_NAME, COLUMN_ID;
输出显示如下:
OWNER TABLE_NAME COLUMN_ID COLUMN_NAME DATA_TYPE HIDDEN_COLUMN
------------ ------------ ---------- ------------- ------------ ---------------
HR EMPLOYEES SYS_C00014_22092220:30:52$ TIMESTAMP(6) YES
删除列组
对于 Oracle AI Database 26ai 及更高版本,从列组中删除自动冲突检测和解决 (Automatic Conflict Detection and Resolution,ADR) 对表的影响较小,因为与 ACDR 相关的列标记为 UNUSED。还可以选择删除列或将其保留在以后阶段。
使用 DBMS_GOLDENGATE_ADM 软件包中的 REMOVE_AUTO_CDR_COLUMN_GROUP 过程对表进行标记,从而最大程度地减少阻塞。请参见 Removing Conflict Detection and Resolution From a Table 中的示例。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
REMOVE_AUTO_CDR_COLUMN_GROUP过程并指定列组的名称。 -
重复复制表的每个 Oracle AI Database 中之前的所有步骤。
示例 9-31 删除列组
此示例将 COMPENSATION_CG 列组从 HR.EMPLOYEES 表中删除。
BEGIN
DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_COLUMN_GROUP(
SCHEMA_NAME => 'HR',
TABLE_NAME => 'EMPLOYEES',
COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;
删除 Delta 冲突检测和解决
DBMS_GOLDENGATE_ADM 软件包中的 REMOVE_AUTO_CDR_DELTA_RES 过程将删除列的增量冲突检测和解决方法。
必须为指定的列配置增量冲突检测和解决。
-
以 Oracle GoldenGate 管理员身份连接到入站服务器数据库。
-
运行
REMOVE_AUTO_CDR_DELTA_RES过程并指定该列。 -
重复复制表的每个 Oracle AI Database 中之前的所有步骤。
示例 9-32 删除表的 Delta 冲突检测和解决
此示例删除 OE.ORDERS 表中 ORDER_TOTAL 列的增量冲突检测和解决方法。
BEGIN
DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_DELTA_RES(
SCHEMA_NAME => 'OE',
TABLE_NAME => 'ORDERS',
COLUMN_NAME => 'ORDER_TOTAL');
END;
监视自动冲突检测和解决
您可以通过查询数据字典视图来监视 Oracle AI Database 中的 Oracle GoldenGate 自动冲突检测和解决。
显示有关为冲突配置的表的信息
ALL_GG_AUTO_CDR_TABLES 视图显示有关为 Oracle GoldenGate 自动冲突检测和解决配置的表的信息。
-
连接到数据库。
-
查询
ALL_GG_AUTO_CDR_TABLES视图。
示例 9-33 显示为冲突检测和解决配置的表的有关信息
此查询显示有关为冲突检测和解决配置的表的以下信息:
-
每个表的表所有者。
-
每个表的表名。
-
用于存储为更新删除冲突删除的行(如果为表配置了墓碑表)的墓碑表。
-
用于解决每个表的冲突的隐藏时间戳列。
COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN TOMBSTONE_TABLE FORMAT A15
COLUMN ROW_RESOLUTION_COLUMN FORMAT A25
SELECT TABLE_OWNER,
TABLE_NAME,
TOMBSTONE_TABLE,
ROW_RESOLUTION_COLUMN
FROM ALL_GG_AUTO_CDR_TABLES
ORDER BY TABLE_OWNER, TABLE_NAME;
您的输出与以下内容类似:
TABLE_OWNER TABLE_NAME TOMBSTONE_TABLE ROW_RESOLUTION_COLUMN
--------------- --------------- --------------- -------------------------
HR EMPLOYEES DT$_EMPLOYEES CDRTS$ROW
OE ORDERS DT$_ORDERS CDRTS$ROW
显示有关冲突解决列的信息
ALL_GG_AUTO_CDR_COLUMNS 视图显示有关为 Oracle GoldenGate 自动冲突检测和解决配置的列的信息。
可以为行或列配置列自动冲突检测和解决。可以为列组中的列配置最新时间戳冲突解决方法。此外,还可以配置列以解决增量冲突。
-
以 Oracle GoldenGate 管理员身份连接到数据库。
-
查询
ALL_GG_AUTO_CDR_COLUMNS视图。
示例 9-34 显示有关列组的信息
此查询显示有关为冲突检测和解决配置的表的以下信息:
-
每个表的表所有者。
-
每个表的表名。
-
如果列位于列组中,则为列组的名称。
-
列名。
-
如果为列配置了最新时间戳冲突解决方法,则为该列配置隐藏时间戳列的名称。
COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A10
COLUMN COLUMN_GROUP_NAME FORMAT A17
COLUMN COLUMN_NAME FORMAT A15
COLUMN RESOLUTION_COLUMN FORMAT A23
SELECT TABLE_OWNER,
TABLE_NAME,
COLUMN_GROUP_NAME,
COLUMN_NAME,
RESOLUTION_COLUMN
FROM ALL_GG_AUTO_CDR_COLUMNS
ORDER BY TABLE_OWNER, TABLE_NAME;
您的输出与以下内容类似:
TABLE_OWNE TABLE_NAME COLUMN_GROUP_NAME COLUMN_NAME RESOLUTION_COLUMN
---------- ---------- ----------------- --------------- -----------------------
HR EMPLOYEES COMPENSATION_CG COMMISSION_PCT CDRTS$COMPENSATION_CG
HR EMPLOYEES COMPENSATION_CG SALARY CDRTS$COMPENSATION_CG
HR EMPLOYEES JOB_IDENTIFIER_CG MANAGER_ID CDRTS$JOB_IDENTIFIER_CG
HR EMPLOYEES JOB_IDENTIFIER_CG JOB_ID CDRTS$JOB_IDENTIFIER_CG
HR EMPLOYEES JOB_IDENTIFIER_CG DEPARTMENT_ID CDRTS$JOB_IDENTIFIER_CG
HR EMPLOYEES IMPLICIT_COLUMNS$ PHONE_NUMBER CDRTS$ROW
HR EMPLOYEES IMPLICIT_COLUMNS$ LAST_NAME CDRTS$ROW
HR EMPLOYEES IMPLICIT_COLUMNS$ HIRE_DATE CDRTS$ROW
HR EMPLOYEES IMPLICIT_COLUMNS$ FIRST_NAME CDRTS$ROW
HR EMPLOYEES IMPLICIT_COLUMNS$ EMAIL CDRTS$ROW
HR EMPLOYEES IMPLICIT_COLUMNS$ EMPLOYEE_ID CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ ORDER_MODE CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ ORDER_ID CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ ORDER_DATE CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ CUSTOMER_ID CDRTS$ROW
OE ORDERS DELTA$ ORDER_TOTAL
OE ORDERS IMPLICIT_COLUMNS$ PROMOTION_ID CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ ORDER_STATUS CDRTS$ROW
OE ORDERS IMPLICIT_COLUMNS$ SALES_REP_ID CDRTS$ROW
在此示例中,为列组名称配置了 IMPLICIT_COLUMNS$ 的列以进行行冲突检测和解决,但这些列不是列组的一部分。列组名称为 DELTA$ 的列配置为增量冲突检测和解决,并且这些列没有解决列。
显示有关列组的信息
ALL_GG_AUTO_CDR_COLUMN_GROUPS 视图显示有关为 Oracle GoldenGate 自动冲突检测和解决配置的列组的信息。
您可以使用 DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR 过程配置 Oracle GoldenGate 自动冲突检测和解决。您可以使用 DBMS_GOLDENGATE_ADM 软件包中的 ADD_AUTO_CDR_COLUMN_GROUP 过程配置列组。
-
以 Oracle GoldenGate 管理员身份连接到数据库。
-
查询
ALL_GG_AUTO_CDR_COLUMN_GROUPS视图。
示例 9-35 显示有关列组的信息
此查询显示有关为冲突检测和解决配置的表的以下信息:
-
表所有者。
-
表名。
-
列组的名称。
-
用于解决每个列组的冲突的隐藏时间戳列。
COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_GROUP_NAME FORMAT A20
COLUMN RESOLUTION_COLUMN FORMAT A25
SELECT TABLE_OWNER,
TABLE_NAME,
COLUMN_GROUP_NAME,
RESOLUTION_COLUMN
FROM ALL_GG_AUTO_CDR_COLUMN_GROUPS
ORDER BY TABLE_OWNER, TABLE_NAME;
输出与以下内容类似:
TABLE_OWNER TABLE_NAME COLUMN_GROUP_NAME RESOLUTION_COLUMN
--------------- --------------- -------------------- -------------------------
HR EMPLOYEES COMPENSATION_CG CDRTS$COMPENSATION_CG
HR EMPLOYEES JOB_IDENTIFIER_CG CDRTS$JOB_IDENTIFIER_CG