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は次のようにソース処理モードに戻ります。
-
グループ化または配列化されたトランザクションをロールバックします。
-
ソース・トランザクションと同じトランザクション境界を使用して、問題のあるトランザクションのSQL操作を、一度に1つリプレイします。
-
破棄ロジック(
TRANSDISCARD)または例外マッピング(TRANSEXCEPTION)を実行します。(詳細は、各オプションの説明を参照してください。) -
TRANSDISCARDエラー処理が完了したら、BATCHSQLまたはGROUPTRANSOPSモードを再開します。
MAXTRANSOPSの影響
TRANSDISCARDおよびTRANSEXCEPTIONのトランザクション・レベルのエラー処理の整合性は、MAXTRANSOPSパラメータ設定の悪影響を受けることがあります。MAXTRANSOPSによって、Replicatは、ターゲットでのトランザクションの適用時に、非常に大きなレプリケートされたソース・トランザクションを小さいトランザクションに分割します。
TRANSDISCARDおよびTRANSEXCEPTIONロジックによって、Replicatは、最後に成功したコミット後の最初のレコードまでロールバックします。これは、問題のあるトランザクションの、実際の最初である場合とそうでない場合があります。そのトランザクションが分割されているか、およびトランザクションの一部が以前にコミットしたトランザクションにあるかどうかによって異なります。その場合、TRANSDISCARDまたはTRANSEXCEPTIONアクションはソース上に発行されましたが、ターゲットからロールバックされた部分にのみ発行されたため、Replicatはこれらのアクションをトランザクション全体には適用できません。
MAXTRANSOPSを使用する場合、TRANSDISCARDおよびTRANSEXCEPTIONが処理する可能性がある最大のトランザクションより大きい値に設定されていることを確認してください。これにより、トランザクションがターゲット上で小さいトランザクションに分割されていないことを確認できます。
統計でのトランザクション・レベルのオプションの影響
STATS REPLICATなど、GGSCIの情報コマンドの出力では、TRANSDISCARDまたはTRANSEXCEPTIONロジックで処理されたトランザクションの合計レコード数が表示されます。この数は、次のことを表します。
-
Replicatは、
MAP文のFILTERまたはWHERE句によってOracle GoldenGate処理から除外されたすべてのレコードを含む、トランザクションのすべてのレコードを破棄ファイルに書き込みます。 -
トランザクション内のソース表に複数のターゲットがある場合、破棄トランザクションには、各レコードの複数のコピーが各ターゲットに1つ含まれます。
-
トランザクションを破棄する場合、Replicatは、例外マッピング文(
MAP文のEXCEPTIONSONLYまたはMAPEXCEPTIONで指定)を無視します。
破棄処理(TRANSDISCARD)または例外マッピング(TRANSEXCEPTION)が原因のエラーが発生すると、Replicatは異常終了します。
デフォルト
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は、エラーを引き起こすすべての操作を自動的に例外として処理します。この場合、REPERRORとEXCEPTIONは必要ありませんが、CDRが解決できない競合を処理するその他のオプションとともに、またはCDRに処理させない競合に対して、REPERRORを使用する必要があります。 -
IGNORE -
エラーを無視します。
-
RETRYOP [MAXRETRIESn] -
問題のある操作を再試行します。
MAXRETRIESオプションでは、再試行回数を制御します。たとえば、表がエクステント不足の場合、RETRYOPとMAXRETRIESによって、トランザクションの失敗を防ぐためにエクステントを追加する時間を確保できます。指定したMAXRETRIES回数の後、Replicatは異常終了します。 -
TRANSABORT [, MAXRETRIESn] [, DELAYSECSn| DELAYCSECSn] -
トランザクションを中止し、トランザクションの開始位置に再配置します。このシーケンスは、レコードの処理が成功するか、
MAXRETRIESが終了するまで継続されます。MAXRETRIESが設定されていない場合、TRANSABORTアクションは何度も繰り返されます。いずれかの
DELAYオプションでは、再試行を遅延させます。DELAYSECSnは、遅延を秒単位で設定し、デフォルトは60秒です。DELAYCSECSnは、遅延をセンチ秒単位で設定します。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指定に基づいて、同じアクションが行われます。その他のエラーが発生すると、プロセスは問題のあるレコードのみを破棄し、異常終了します。
親トピック: Oracle GoldenGateパラメータ