重覆
有效對象
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 會回復為來源處理模式,如下所示:
-
它會倒回已分組或陣列的交易。
-
它使用與來源交易相同的交易界限,一次重新執行一項 SQL 作業的違規交易。
-
它會執行捨棄邏輯 (
TRANSDISCARD) 或異常狀況對應 (TRANSEXCEPTION)。(如需詳細資訊,請參閱這些選項說明。) -
在
TRANSDISCARD錯誤處理完成後,它會恢復BATCHSQL或GROUPTRANSOPS模式。
MAXTRANSOPS 的影響
TRANSDISCARD 和 TRANSEXCEPTION 交易層次錯誤處理的完整性可能會受到 MAXTRANSOPS 參數的設定不利影響。當 Replicat 在目標上套用時,MAXTRANSOPS 會讓 Replicat 將非常大型的複製來源交易分割成較小的交易。
TRANSDISCARD 和 TRANSEXCEPTION 邏輯會導致 Replicat 在上次成功確認後倒回至第一筆記錄。這不一定是違規交易的實際開始。這取決於交易是否已進行分割,而其中的一部分位於先前確認的交易中。如果是這種情況,Replicat 就無法將 TRANSDISCARD 或 TRANSEXCEPTION 動作套用至來源發出的整個交易,但只能套用至從目標倒回的部分。
如果您使用 MAXTRANSOPS,請確定其設為大於預期由 TRANSDISCARD 和 TRANSEXCEPTION 處理之最大交易的值。這可確保交易不會分割成目標上較小的交易。
交易層次選項對統計資料的影響
資訊命令的輸出 (例如 STATS REPLICAT) 會顯示交易中由 TRANSDISCARD 或 TRANSEXCEPTION 邏輯處理的記錄總數。此號碼可以反映下列項目:
-
Replicat 會將交易的所有記錄寫入捨棄檔,包括透過
MAP敘述句中的FILTER或WHERE子句,從 Oracle GoldenGate 處理中排除的任何記錄。 -
如果交易中的來源表格有多個目標,捨棄的交易將包含每筆記錄的多個複本,每個目標一個。
-
捨棄交易時,Replicat 會忽略任何異常狀況對應敘述句 (如
MAP敘述句中的EXCEPTIONSONLY或MAPEXCEPTION所指定)。
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 規格產生相同的動作。在其他錯誤上,處理程序只會捨棄違規的記錄,然後放棄。