REPERROR

有効な対象

Replicat

摘要

REPERRORパラメータでは、Replicatのエラーへの対応方法を制御します。Replicatのエラーへのデフォルトのレスポンスは、異常終了です。

1つのREPERROR文を使用して大半のエラーをデフォルトの方法で処理しながら、1つまたは複数の別の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操作を、一度に1つリプレイします。

  3. 破棄ロジック(TRANSDISCARD)または例外マッピング(TRANSEXCEPTION)を実行します。(詳細は、各オプションの説明を参照してください。)

  4. TRANSDISCARDエラー処理が完了したら、BATCHSQLまたはGROUPTRANSOPSモードを再開します。

MAXTRANSOPSの影響

TRANSDISCARDおよびTRANSEXCEPTIONのトランザクション・レベルのエラー処理の整合性は、MAXTRANSOPSパラメータ設定の悪影響を受けることがあります。MAXTRANSOPSによって、Replicatは、ターゲットでのトランザクションの適用時に、非常に大きなレプリケートされたソース・トランザクションを小さいトランザクションに分割します。

TRANSDISCARDおよびTRANSEXCEPTIONロジックによって、Replicatは、最後に成功したコミット後の最初のレコードまでロールバックします。これは、問題のあるトランザクションの、実際の最初である場合とそうでない場合があります。そのトランザクションが分割されているか、およびトランザクションの一部が以前にコミットしたトランザクションにあるかどうかによって異なります。その場合、TRANSDISCARDまたはTRANSEXCEPTIONアクションはソース上に発行されましたが、ターゲットからロールバックされた部分にのみ発行されたため、Replicatはこれらの操作をトランザクション全体には適用できません。

MAXTRANSOPSを使用する場合、TRANSDISCARDおよびTRANSEXCEPTIONが処理する可能性がある最大のトランザクションより大きい値に設定されていることを確認してください。これにより、トランザクションがターゲット上で小さいトランザクションに分割されていないことを確認できます。

統計でのトランザクション・レベルのオプションの影響

STATS REPLICATなど、情報コマンドの出力では、TRANSDISCARDまたはTRANSEXCEPTIONロジックで処理されたトランザクションの合計レコード数が表示されます。この数は、次のことを表します。

破棄処理(TRANSDISCARD)または例外マッピング(TRANSEXCEPTION)が原因のエラーが発生すると、Replicatは異常終了します。

エラー処理に関するその他の情報

ExtractおよびReplicatのエラー処理の構成の詳細は、Oracle GoldenGate Microservicesドキュメントのエラーの管理を参照してください。

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に設定されている場合に、バックアップのデフォルト・アクションを提供します。DEFAULT2は、エラーの発生が予想されるMAP文に例外MAP文が指定されていないときに使用します。

<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文が存在する場合、競合検出および解決(CDR)機能は、エラーを引き起こすすべての操作を自動的に例外として処理します。この場合、AUTOCDRはREPERRORと互換性がないため、REPERRORはAUTOCDRが有効な表では無視されるため、EXCEPTIONを含むREPERRORは必要ありません。REPERRORを他のオプションとともに使用して、CDRが解決できない競合を処理したり、CDRが処理できない競合を処理したりします。

IGNORE

エラーを無視します

RETRYOP [MAXRETRIES <n>]

問題のある操作を再試行しますMAXRETRIESオプションでは、再試行回数を制御します。たとえば、表がエクステント不足の場合、RETRYOPとMAXRETRIESによって、トランザクションの失敗を防ぐためにエクステントを追加する時間を確保できます。指定したMAXRETRIES回数の後、Replicatは異常終了します。

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で指定されたエラーが発生した場合、例外MAP文のMAPEXCEPTIONまたはEXCEPTIONSONLY句で定義したように、対応する例外マッピング指定に従って、トランザクションのすべてのレコードに例外マッピングを実行します。レコードに対応する例外マッピング指定がない場合、または例外表への書込み時にエラーがある場合、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です。いずれかの表(1つまたは複数)についてMAP文のREPERRORを使用すると、これらのルールの一部またはすべてをオーバーライドできます。「REPERRORのグローバルおよびMAP文での使用例」を参照してください。

例1

次に、大半のエラーでは処理を停止し、重複レコード・エラーは無視する方法の例を示します。

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

例2

次の例では、account表のエラーを処理するために作成された例外MAP文を呼び出します。product表には例外MAP文が定義されていないため、この表でエラーが発生すると、Replicatは異常終了します。

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文にエラー・ルールを適用した後、2番目の文ではデフォルトの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 (...) );

REPERRORのグローバルおよびMAP文での使用例

次に、グローバルなREPERROR文と組み合せて、MAP文でREPERRORを使用する様々な例を示します。

例1

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

前述の例では、最初のMAP文でerror1が発生した場合、優先される文が指定されているため、アクションはresponse1ではなくresponse2になります。ただし、2番目のMAP文でerror1が発生した場合には、グローバル・レスポンスのresponse1がレスポンスになります。error2に対するレスポンスは、MAP固有のresponse3になります。

例2

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

前述の例では、すべてのREPERROR文が異なるエラーに対応するため(MAP固有の優先なし)、src1からsrc2にレプリケートするときに、すべてのエラーおよびアクション(1から3)が適用されます。

例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になります。2番目の文ではアクションはresponse1 (グローバル・レスポンス)になり、3番目の文ではresponse4になります(2番目のREPERROR文が適用されるため)。グローバルREPERROR文は、パラメータ・ファイル内で別のREPERROR文で新しいルールが開始されるまで、後続のすべてのMAP文に適用されます。

例4

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

前述の例では、ソース表srcをターゲット表tgtに適用中にエラー600が発生した場合、トランザクション全体が破棄ファイルに書き込まれます。エラー1403が発生した場合も、グローバルREPERROR指定に基づいて、同じアクションが行われます。その他のエラーが発生すると、プロセスは問題のあるレコードのみを破棄し、異常終了します。