重覆

有效對象

Replicat

說明

使用 REPERROR 參數控制 Replicat 如何回應錯誤。Replicat 對任何錯誤的預設回應為中止。

您可以使用一個 REPERROR 敘述句,以預設方式處理大部分的錯誤,同時使用一或多個其他 REPERROR 敘述句以不同的方式處理特定錯誤。例如,您可忽略重複記錄錯誤,但在所有其他狀況下會中止處理。

您可以全域使用 REPERROR (在參數檔的根目錄中) 來影響之後的所有 MAP 敘述句,或者您可以在 MAP 敘述句中使用它來影響該敘述句中指定的表格。在 MAP 陳述式中使用 REPERROR,可讓您針對協調式 Replicat 的每個執行緒,以特定方式處理錯誤。

使用記錄層級錯誤處理

除了 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 的影響

TRANSDISCARD 和 TRANSEXCEPTION 交易層次錯誤處理的完整性可能會受到 MAXTRANSOPS 參數的設定不利影響。當 Replicat 在目標上套用時,MAXTRANSOPS 會讓 Replicat 將非常大型的複製來源交易分割成較小的交易。

TRANSDISCARD 和 TRANSEXCEPTION 邏輯會導致 Replicat 在上次成功確認後倒回至第一筆記錄。這不一定是違規交易的實際開始。這取決於交易是否已進行分割,而其中的一部分位於先前確認的交易中。如果是這種情況,Replicat 就無法將 TRANSDISCARD 或 TRANSEXCEPTION 動作套用至來源發出的整個交易,但只能套用至從目標倒回的部分。

如果您使用 MAXTRANSOPS,請確定其設為大於預期由 TRANSDISCARD 和 TRANSEXCEPTION 處理之最大交易的值。這可確保交易不會分割成目標上較小的交易。

交易層次選項對統計資料的影響

資訊命令的輸出 (例如 STATS REPLICAT) 會顯示交易中由 TRANSDISCARD 或 TRANSEXCEPTION 邏輯處理的記錄總數。此號碼可以反映下列項目:

Replicat 會因捨棄處理 (TRANSDISCARD) 或異常狀況對應 (TRANSEXCEPTION) 所造成的錯誤而異常中止。

取得有關錯誤處理的詳細資訊

請參閱 Oracle GoldenGate Microservices 文件中的管理錯誤,瞭解有關設定 Extract 和 Replicat 錯誤處理的詳細資訊。

如需有關 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 選項。

注意:當「衝突偵測與解決 (CDR)」功能處於作用中時,如果受影響表格有 MAP 敘述句存在,它會自動將導致錯誤的所有作業視為異常狀況。在此情況下,AUTOCDR 與 REPERROR 不相容,因此 REPERROR 與 EXCEPTION 不需要,因此 AUTOCDR 啟用之表格的 REPERROR 將會被忽略。使用 REPERROR 與其他選項來處理 CDR 無法解決的衝突,或處理不希望 CDR 處理的衝突。

IGNORE

忽略錯誤。

RETRYOP [MAXRETRIES <n>]

重試引發問題的作業。使用 MAXRETRIES 選項來控制重試次數。例如,如果表格超出擴充區塊,RETRYOP (含 MAXRETRIES) 會提供您新增擴充區塊的時間,讓交易不會失敗。Replicat 在指定的 MAXRETRIES 數目之後異常中止。

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

中止異動並重新定位至異動的開頭。此順序會繼續進行,直到記錄處理成功或 MAXRETRIES 到期為止。如果未設定 MAXRETRIES,TRANSABORT 動作將會持續循環。

使用其中一個 DELAY 選項來延遲重試。DELAYSECS <n> 會設定延遲 (秒),且預設值為 60 秒。DELAYCSECS <n> 會設定延遲 (以毫秒為單位)。

TRANSABORT 選項適用於處理支援這些條件之資料庫的逾時和死鎖。

TRANSDISCARD

如果該交易內有任何作業 (包括確認作業),導致 REPERROR 錯誤規格中列出的 Replicat 錯誤,則會捨棄整個來源交易。Replicat 會中止交易,如果記錄發生錯誤,就會將該記錄寫入捨棄檔。Replicat 接著會重新執行交易,並將所有記錄寫入捨棄檔,包括確認記錄。Replicat 會因捨棄處理所造成的錯誤而異常中止。

如果捨棄的記錄已經有資料對應至目標記錄,Replicat 就會以目標格式將它寫入捨棄檔;否則,將會以來源格式寫入。重新執行的交易本身一律會以來源格式寫入。

TRANSDISCARD 支援記錄層級錯誤以及確認錯誤。

這個主題的開始會提供其他資訊。

TRANSEXCEPTION

如果交易中任何記錄發生 REPERROR 指定的錯誤,則會根據交易中每個記錄的對應例外對應規格 (如 MAPEXCEPTION 或 EXCEPTIONSONLY 子句在例外 MAP 陳述式中定義) 來執行交易中每個記錄的例外對應。如果有任何記錄沒有對應的例外對應規格,或寫入例外表格時發生錯誤,Replicat 會異常中止並出現錯誤訊息。

發生錯誤且正在使用 TRANSEXCEPTION 時,Replicat 會中止交易,如果記錄發生錯誤,就會將該記錄寫入捨棄檔案。Replicat 會重新執行異動並檢查來源記錄以找出例外對應規格,然後執行這些規格。

TRANSEXCEPTION 支援記錄層級錯誤以及確認錯誤。若要處理記錄層次 (針對個別 SQL 作業) 的錯誤,而不影響相同交易中的無錯誤作業,請使用 MAP 敘述句中的 EXCEPTION 選項。

PROCEDURE,[ABEND IGNORE DISCARD]

如果發生程序複製錯誤,請使用 PROCEDURE 來設定 Replicat 的行為。依照預設,當發生程序複製錯誤時,Replicat 將會是 ABEND。

IGNORE 選項會忽略失敗的呼叫。DISCARD 選項會在目標資料庫的套用錯誤佇列中暫存捨棄的錯誤。您以後可以重新執行或刪除這些錯誤。

RESET

使用 REPERROR RESET 陳述式移除先前 REPERROR 參數中指定的錯誤處理規則,並將預設錯誤處理套用至後續的所有 MAP 陳述式。

全域使用 REPERROR 的範例

這些範例顯示參數檔根目錄中所使用的 REPERROR,以設定全域錯誤處理規則。您可以在 MAP 敘述句中使用 REPERROR,覆寫任何指定表格或表格的任何或所有這些規則。請參閱 Globally 和 MAP Statement 中使用 REPERROR 的範例。

範例 1

下列範例示範如何停止處理大部分的錯誤,但忽略重複記錄錯誤。

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

範例 2

下列範例會呼叫建立的例外 MAP 陳述式來處理帳戶表格上的錯誤。產品表格上的錯誤導致 Replicat 不正常結束,因為未定義例外 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,則重新執行整個交易。其他錯誤類型會導致 Replicat 中止。

REPERROR DEFAULT ABEND
REPERROR 1403 TRANSDISCARD

範例 5

下列會捨棄違規記錄,然後重新執行整個交易,以搜尋寫入至名為 tgtexception 之異常狀況表格的異常狀況對應規格。其他錯誤會導致 Replicat 捨棄違規記錄 (如果適用),然後中止。

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 規格產生相同的動作。在其他錯誤上,處理程序只會捨棄違規的記錄,然後放棄。