HANDLECOLLISIONS | NOHANDLECOLLISIONS

有效对象

复制

说明

使用 HANDLECOLLISIONS 和 NOHANDLECOLLISIONS 参数控制在目标上应用 SQL 时复制是否尝试解决重复记录和缺失记录错误。将源表中的数据加载到目标表,Oracle GoldenGate 正在复制这些表正在进行的事务处理更改时,这些错误(称为冲突)会在初始装入过程中出现。当 Oracle GoldenGate 在加载完成后应用复制的更改时,HANDLECOLLISIONS 会为复制提供这些冲突的错误处理逻辑。

您可以通过以下方式使用 HANDLECOLLISIONS 和 NOHANDLECOLLISIONS:

可以组合上述方法。您可以指定全局冲突处理规则,然后在 MAP 语句中使用不同的冲突处理规则覆盖该规则。MAP 规范始终覆盖全局规范。

注意:集成复制的错误处理不适用于 HANDLECOLLISIONS。Oracle 建议您使用精确的实例化方法,而不是使用 HANDLECOLLISIONS。

HowHANDLECOLLISIONSWorks

以下示例说明 HANDLECOLLISIONS 的工作原理:

  1. 应用程序将更新源 table1 中的记录 A。

  2. 提取将提取更新。

  3. 应用程序将删除源 table1 中的记录 A。

  4. 提取将提取删除。

  5. Oracle GoldenGate 从源 table1 提取初始加载数据,没有记录 A。

  6. Oracle GoldenGate 应用初始加载,但不应用记录 A。

  7. 复制尝试应用记录 A 的更新。

  8. 数据库将返回“record missing”错误。

  9. 复制尝试应用记录 A 的删除。

  10. 数据库将返回“record missing”错误。

在将初始加载期间捕获的事务处理更改应用于目标表后禁用 HANDLECOLLISIONS,以便复制不会自动处理后续错误。初始同步后生成的错误表示异常情况,应由可确定如何解决错误的人员进行评估。例如,缺少记录错误可能表明源系统上存在的记录被无意中删除。

您可以通过以下方式关闭 HANDLECOLLISIONS:

避免缺少列值的可能解答

默认情况下,数据库未记录源表的所有列值时,当 Replicat 尝试将主键更新转换为插入时,如果目标表具有 NOT NULL 约束条件,则可能会出现错误。您可以通过以下方式处理此方案:

如果数据库默认包含所有列,则必须使用 NOCOMPRESSUPDATES 和 NOCOMPRESSDELETES 才能使 HANDLECOLLISIONS 正常工作。如果数据库不支持 NOCOMPRESSDELETES,则必须使用 FETCHOPTIONS MISSINGCOLS。

有关 Oracle GoldenGate 初始加载方法的更多信息,请参阅关于使用初始加载提取实例化。

默认值

NOHANDLECOLLISIONS

语法

HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]

HANDLECOLLISIONS

启用碰撞处理。

_ALLOWPKMISSINGROWCOLLS

如果对应的目标行不存在,则将 HANDLECOLLISIONS 与 _ALLOWPKMISSINGROWCOLLISIONS 一起使用可跳过主键 UPDATE 操作。

注意:跳过操作可能会导致数据损坏。请参见本主题中的“说明”。

NOHANDLECOLLISIONS

关闭碰撞处理。

THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])

为指定的线程启用 HANDLECOLLISIONS。在参数文件的根级别的全局 HANDLECOLLISIONS 语句中使用时,无论指定线程位于 的所有 MAP 语句中的哪个位置,都将为其启用 HANDLECOLLISIONS。在 MAP 语句的 HANDLECOLLISIONS 子句中使用时,仅为该 MAP 语句启用 HANDLECOLLISIONS。

threadID[, threadID][, …]

指定一个线程 ID,或以 threadID, threadID, threadID 格式指定逗号分隔的线程列表。

thread_range[, thread_range][, …]

以 threadIDlow-threadIDhigh 形式指定线程范围,或以 threadIDlow-threadIDhigh,threadIDlow-threadIDhigh 格式指定的逗号分隔的范围列表。

允许组合使用这些格式,例如 threadID、threadID、threadIDlow-threadIDhigh。

示例

示例 1

此示例为参数文件中的所有 MAP 语句启用 HANDLECOLLISIONS。

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

示例 2

此示例为某些 MAP 语句启用 HANDLECOLLISIONS,而为其他语句禁用它。

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
NOHANDLECOLLISIONS
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

示例 3

此示例显示 MAP 语句中 HANDLECOLLISIONS 的基本用法。

MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;

示例 4

此示例显示了全局使用和 MAP 级使用的组合。MAP 规范将覆盖指定表的全局规范。

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep, NOHANDLECOLLISIONS;
MAP hr.country, TARGET hr.country, NOHANDLECOLLISIONS;

示例 5

在以下示例中,为所有 MAP 语句全局启用了 HANDLECOLLISIONS,除了第一个 MAP 语句中的缺省线程 0 和第二个 MAP 语句中的线程 3。

HANDLECOLLISIONS
MAP fin.*, TARGET fin.*;
MAP sales.*, TARGET sales.*;
MAP orders.*, TARGET orders.*;
MAP scott.cust, TARGET scott.cust, NOHANDLECOLLISIONS;
MAP amy.cust, TARGET amy.cust, THREAD(3), NOHANDLECOLLISIONS;

示例 6

In this example, HANDLECOLLISIONS is enabled globally, but turned off for thread 3. 剩余的线程 1、2 和 4 将处理碰撞。

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREAD(3)
MAP scott.emplyees, TARGET scott.employees, THREADRANGE(1,4, OID);
MAP scott.inventory, TARGET scott.inventory, THREADRANGE(1,4, OID);
MAP scott.cust, TARGET scott.cust, THREADRANGE(1,4, OID);

示例 7

In this example, HANDLECOLLISIONS is enabled globally, then disabled globally for threads 5 through 7. 在第一个 map 语句中,所有线程都将处理冲突,因为 HANDLECOLLISIONS 参数未指定线程或范围。在第二个 map 语句中,只有线程 4、8 和 9 将处理冲突,因为全局 NOHANDLECOLLISIONS 适用于线程 5-7。

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREADRANGE(5-7)
MAP scott.cust, TARGET scott.cust, THREADRANGE(4,9,OID), HANDLECOLLISIONS;
MAP scott.offices, TARGET scott.offices, THREADRANGE(4,9,OID);
MAP scott.emp, TARGET scott.emp, THREADRANGE(4,9,OID);
MAP scott.ord, TARGET scott.ord, THREADRANGE(4,9,OID);
MAP acct.*, TARGET acct.*;
MAP admin.*, TARGET admin.*;