重新错误

有效对象

复制

说明

使用 REPERROR 参数控制 Replicat 对错误的响应方式。Replicat 对任何错误的默认响应是异常终止。

您可以使用一个 REPERROR 语句以默认方式处理大多数错误,而使用一个或多个其他 REPERROR 语句以不同方式处理特定错误。例如,可以忽略重复记录错误,但在所有其他情况下都异常终止处理。

可以全局使用 REPERROR(在参数文件的根目录中)影响其后的所有 MAP 语句,也可以在 MAP 语句中使用它来影响该语句中指定的表。在 MAP 语句中使用 REPERROR 可使您能够以特定方式处理协调复制的每个线程的错误。

使用记录级别错误处理

除 TRANSDISCARD 和 TRANSEXCEPTION 之外的所有 REPERROR 选项都应用错误处理操作来响应单个记录上的单个 SQL 操作。同一事务处理中的其他无错误记录将按照参数文件中的 MAP 语句和其他参数(如适用)中的配置进行处理。

使用事务处理级别错误处理

TRANSDISCARD、TRANSEXCEPTION 和 ABEND 选项将错误处理操作应用于整个事务处理。触发错误可能发生在事务处理中的单个记录或提交操作上。(提交错误没有与之关联的特定记录。)这些选项可用于:

TRANSDISCARD 和 TRANSEXCEPTION 是互斥的。

其他参数对事务处理级别选项的影响

TRANSDISCARD 和 TRANSEXCEPTION 遵循源事务处理的边界;但是,参数文件中存在 BATCHSQL、GROUPTRANSOPS 或 MAXTRANSOPS 可能会影响错误处理逻辑或结果,因为它们会改变事务处理边界。

BATCHSQL 和 GROUPTRANSOPS 的作用

BATCHSQL 或 GROUPTRANSOPS(默认值)将不同事务处理中的 SQL 操作分组为更大的事务处理,以提高性能,同时维护事务处理顺序。当这些参数生效并且发生任何错误时,Replicat 会首先尝试通过输入替代处理模式来解决该问题(有关这些参数,请参见文档)。如果错误仍然存在,TRANSDISCARD 或 TRANSEXCEPTION 将生效,Replicat 将恢复为源处理模式,如下所示:

  1. 它会回滚分组或数组事务处理。

  2. 它使用与源事务处理相同的事务处理边界,一次重放一个 SQL 操作。

  3. 它执行放弃逻辑 (TRANSDISCARD) 或异常映射 (TRANSEXCEPTION)。(有关更多详细信息,请参见这些选项说明。)

  4. 在完成 TRANSDISCARD 错误处理后,它将恢复 BATCHSQL 或 GROUPTRANSOPS 模式。

MAXTRANSOPS 的影响

MAXTRANSOPS 参数的设置可能会对 TRANSDISCARD 和 TRANSEXCEPTION 事务处理级别错误处理的完整性产生不利影响。MAXTRANSOPS 会导致复制将非常大的复制源事务处理在目标上应用时拆分为较小的事务处理。

TRANSDISCARD 和 TRANSEXCEPTION 逻辑导致复制在上次成功提交后回退到第一个记录。这可能是也可能不是违规交易的实际开始。这取决于该事务处理是否已拆分,部分事务处理是否位于以前提交的事务处理中。如果是这种情况,复制将无法将 TRANSDISCARD 或 TRANSEXCEPTION 操作应用于整个事务处理,因为它是在源上发出的,而只能应用于从目标回退的部分。

如果使用 MAXTRANSOPS,请确保将其设置为大于期望由 TRANSDISCARD 和 TRANSEXCEPTION 处理的最大事务处理的值。这将确保不会将事务处理拆分为目标上的较小事务处理。

事务处理级别选项对统计的影响

信息性命令(如 STATS REPLICAT)的输出将显示由 TRANSDISCARD 或 TRANSEXCEPTION 逻辑处理的事务处理中的记录总数。此数字可能反映以下情况:

对于因放弃处理 (TRANSDISCARD) 或异常映射 (TRANSEXCEPTION) 导致的错误,复制会异常终止。

获取有关错误处理的更多信息

有关为提取和复制配置错误处理的更多信息,请参见 Oracle GoldenGate Microservices Documentation 中的管理错误。

有关 MAP 参数的更多信息,请参见 "TABLE | MAP "。

默认值

TRANSABORT 表示死锁;ABEND 表示所有其他死锁

语法

REPERROR {
(
{DEFAULT | DEFAULT2 | <SQL_error> | <user_defined_error>},
{ABEND |
DISCARD |
EXCEPTION |
IGNORE |
RETRYOP [MAXRETRIES <n>] |
TRANSABORT [, MAXRETRIES] [, DELAYSECS <n> | DELAYCSECS <n>] |
TRANSDISCARD |
TRANSEXCEPTION
}
{PROCEDURE,[ABEND|IGNORE|DISCARD]}) |
RESET }

错误规范选项

DEFAULT

为除指定了显式 REPERROR 语句的错误之外的所有错误设置全局响应。

DEFAULT2

当 DEFAULT 的响应设置为 EXCEPTION 时,提供备份默认操作。如果没有为预计有错误的 MAP 语句指定异常 MAP 语句,则使用 DEFAULT2。

<SQL_error>

SQL 错误编号。如果使用 TRANSDISCARD 和 TRANSEXCEPTION,这可能是记录级错误或提交级错误。

<user_defined_error>

使用 MAP 语句中 FILTER 子句的 RAISEERROR 选项指定的用户定义错误。

错误响应选项

ABEND

回滚事务处理并异常终止处理。缺省值为 ABEND。

DISCARD

将违规操作记录到放弃文件,但继续处理事务处理和后续事务处理。

EXCEPTION

将导致出错的操作处理为异常错误,但正常处理事务处理中的无错误的操作。将此选项与例外 MAP 语句结合使用,或与 MAP 的 MAPEXCEPTION 选项一起使用。例如,可以将失败的更新语句中的列映射到“缺少的更新”表中。在参数文件中,在预计有错误的 MAP 语句之后指定异常 MAP 语句。

EXCEPTION 仅将异常处理应用于单个记录上的单个 SQL 操作。要将异常处理应用于整个事务,请使用 TRANSEXCEPTION 选项。

注意:当冲突检测和解决 (Conflict Detection and Resolution,CDR) 功能处于活动状态时,如果受影响的表存在异常 MAP 语句,它将自动将导致错误的所有操作视为异常。在这种情况下,不需要带有 EXCEPTION 的 REPERROR,因为 AUTOCDR 与 REPERROR 不兼容,因此对于启用了 AUTOCDR 的表,将忽略 REPERROR。将 REPERROR 与其他选项一起使用可处理 CDR 无法解决的冲突,或者不希望 CDR 处理的冲突。

IGNORE

忽略错误。

RETRYOP [MAXRETRIES <n>]

重试违规操作。使用 MAXRETRIES 选项可以控制重试次数。例如,如果某个表超出了区,则带有 MAXRETRIES 的 RETRYOP 可以让您有时间添加区,从而使事务处理不会失败。复制在指定的 MAXRETRIES 号之后异常终止。

TRANSABORT [, MAXRETRIES <n>] [, DELAYSECS <n> | DELAYCSECS <n>]

中止事务处理,并重新定位到事务处理开头。在成功处理记录或 MAXRETRIES 到期之前,此序列将继续。如果未设置 MAXRETRIES,则 TRANSABORT 操作将连续循环。

使用 DELAY 选项之一延迟重试。DELAYSECS <n> 设置延迟(以秒为单位),缺省值为 60 秒。DELAYCSECS <n> 设置延迟(以厘秒为单位)。

TRANSABORT 选项可用于处理支持这些条件的数据库上的超时和死锁。

TRANSDISCARD

如果该事务处理中的任何操作(包括提交操作)导致 REPERROR 错误规范中列出的复制错误,则放弃整个源事务处理。复制将中止事务处理,如果在记录上发生错误,则将该记录写入放弃文件。然后,复制将重放事务处理,并将所有记录写入丢弃文件(包括提交记录)。放弃处理导致的错误发生复制异常终止。

如果已丢弃的记录已映射到目标记录,Replicat 会将其写入目标格式的丢弃文件;否则,将以源格式写入该文件。重放的事务处理本身始终以源格式写入。

TRANSDISCARD 支持记录级别错误以及提交错误。

附加信息位于此主题的开头。

TRANSEXCEPTION

如果 REPERROR 指定的错误出现在事务处理中的任何记录上,则根据 MAP 语句中的 MAPEXCEPTION 或 EXCEPTIONSONLY 子句定义的相应异常映射规范,为事务处理中的每个记录执行异常映射。如果任何记录没有对应的异常映射规范,或者写入异常表时发生错误,复制将异常终止并显示错误消息。

当遇到错误并且正在使用 TRANSEXCEPTION 时,Replicat 会中止事务处理,如果该错误出现在记录上,则将该记录写入丢弃文件。复制将重放事务处理,并检查源记录以查找异常映射规范,然后执行它们。

TRANSEXCEPTION 支持记录级别错误以及提交错误。要在记录级别处理错误(对于单个 SQL 操作),而不影响同一事务处理中的无错误操作,请在 MAP 语句中使用 EXCEPTION 选项。

PROCEDURE,[ABEND IGNORE DISCARD]

使用 PROCEDURE 配置发生过程性复制错误时的复制行为。缺省情况下,发生过程性复制错误时,复制将 ABEND。

IGNORE 选项忽略失败的调用。DISCARD 选项会在目标数据库中的应用错误队列中回写丢弃的错误。这些错误可以在以后重新执行或删除。

RESET

使用 REPERROR RESET 语句删除以前 REPERROR 参数中指定的错误处理规则,并将默认错误处理应用于之后的所有 MAP 语句。

全局使用 REPERROR 的示例

这些示例显示了在参数文件的根目录中使用的 REPERROR,用于设置全局错误处理规则。通过在 MAP 语句中使用 REPERROR,可以覆盖任意给定表的任何或所有这些规则。请参见“ Examples of Using REPERROR Globally and in a MAP Statement ”。

示例 1

以下示例说明如何针对大多数错误停止处理,但忽略重复记录错误。

REPERROR (DEFAULT, ABEND)
REPERROR (-1, IGNORE)

示例 2

以下示例调用为处理帐户表错误而创建的异常错误 MAP 语句。产品表上的错误导致复制异常结束,因为未定义异常 MAP 语句。

REPERROR (DEFAULT, EXCEPTION)
REPERROR (DEFAULT2, ABEND)
MAP sales.product, TARGET sales.product;
MAP sales.account, TARGET sales.account;
INSERTALLRECORDS
MAP sales.account, TARGET sales.account_exception,
EXCEPTIONSONLY,
COLMAP (account_no = account_no,
optype = @GETENV ('lasterr', 'optype'),
dberr = @GETENV ('lasterr', 'dberrnum'),
dberrmsg = @GETENV ('lasterr', 'dberrmsg'));

示例 3

以下操作对第一个 MAP 语句应用错误规则,然后将 ABEND 的缺省值恢复为第二个。

REPERROR (-1, IGNORE)
MAP sales.product, TARGET sales.product;
REPERROR RESET
MAP sales.account, TARGET sales.account;

示例 4

如果某个记录中的任何操作生成错误 1403,则以下操作将放弃违规记录,然后重放整个事务处理。其他错误类型会导致复制异常终止。

REPERROR DEFAULT ABEND
REPERROR 1403 TRANSDISCARD

示例 5

以下内容将放弃违规记录,然后重放整个事务处理以搜索写入名为 tgtexception 的异常表的异常映射规范。其他错误会导致复制丢弃违规记录(如果适用),然后异常终止。

REPERROR DEFAULT ABEND
REPERROR 1403 TRANSEXCEPTION
MAP src, TARGET tgt, &
MAPEXCEPTION (TARGET tgtexception, INSERTALLRECORDS, COLMAP (...) );

在全局和 MAP 语句中使用 REPERROR 的示例

以下示例显示了 REPERROR 可与全局 REPERROR 语句一起用于 MAP 语句的不同方式。

示例 1

REPLICAT <group_name>
REPERROR (<error1> , <response1>)
MAP <src1>, TARGET <tgt1>, REPERROR (<error1>, <response2>);
MAP <src2>, TARGET <tgt2>, REPERROR (<error2>, <response3>);

在前面的示例中,当第一个 MAP 语句出现 error1 时,操作应为 response2,而不是 response1,因为指定了覆盖。但是,如果第二个 MAP 语句出现 error1,则响应应为 response1,即全局响应。error2 的响应为 response3,该响应特定于 MAP。

示例 2

REPLICAT <group_name>
REPERROR (<error1> , <response1>)
MAP <src1>, TARGET <tgt1>, REPERROR (<error2>, <response2>),
REPERROR (<error3>, <response3>);

在前面的示例中,从 src1 复制到 src2 时,应应用所有错误和操作 (1-3),因为所有 REPERROR 语句都解决了不同的错误(没有特定于 MAP 的覆盖)。

示例 3

REPLICAT <group_name>
REPERROR (<error1> , <response1>)
MAP <src1>, TARGET <tgt1>, REPERROR (<error1>, <response2>);
MAP <src2>, TARGET <tgt2>, REPERROR (<error2>, <response3>);
REPERROR (<error1> , <response4>)
MAP <src2>, TARGET <tgt2>, REPERROR (<error3>, <response3>);

在前面的示例中,如果第一个 MAP 语句出现 error1,则该操作应为 response2。对于第二个,为 response1(全局响应),对于第三个,为 response4(因为第二个 REPERROR 语句)。全局 REPERROR 语句应用于参数文件中跟随它的所有 MAP 语句,直到另一个 REPERROR 语句启动新规则。

示例 4

REPERROR DEFAULT ABEND
REPERROR 1403 TRANSDISCARD.
MAP src, TARGET tgt, REPERROR(600 TRANSDISCARD);

在前面的示例中,如果在将源表 src 应用于目标表 tgt 时遇到错误 600,则整个事务处理将写入丢弃文件。遇到错误 1403 也会根据全局 REPERROR 规范执行相同的操作。对于其他错误,该处理仅放弃违规记录,然后异常终止。