プライマリ・コンテンツに移動
Oracle® GoldenGate Oracle DatabaseのためのOracle GoldenGateのインストールおよび構成
12c (12.1.2)
E49844-07
  目次へ移動
目次

前
 
次
 

12 非統合Replicatを使用するための追加の構成手順

この章では、非統合モードで動作する場合のReplicat専用の手順について説明します。Replicatが非統合モードで動作する場合、トリガー、カスケード制約および一意の識別子を、Oracle GoldenGate環境で適切に構成する必要があります。

この章の内容は次のとおりです。

この章は、第9章「Oracle GoldenGateの適用の構成」に記載されている基本的な構成要件を補足するものです。

12.1 ターゲット表でのトリガーと参照カスケード制約の無効化

Replicatが非統合モードの場合、トリガーとカスケード制約をOracleターゲット表で無効にする必要があります。Oracle GoldenGateには、Oracleバージョンに応じてトリガーまたはカスケード制約を自動的に処理するオプションがいくつか用意されています。

  • Oracle 11.2.0.2以降の11gR2の各バージョンの場合、Replicatは、セッション中、トリガーによって行われる処理を無効にします。トリガーは無効になりませんが、かわりに、トリガー本体が実行されなくなります。ただし、トリガーのWHEN部分はコンパイルして実行し、データベース・エラーが起きないようにする必要があります。トリガーの起動を有効にするには、または手動で無効にするには、DBOPTIONSNOSUPPRESSTRIGGERSオプションを使用して、USERIDALIASパラメータの後に文を配置します。特定のトリガーの起動を許可するには、次のデータベース・プロシージャを使用します。trigger_ownerはトリガーの所有者で、trigger_nameはトリガーの名前です。特定のトリガーに対してプロシージャがFALSEでコールされると、そのプロシージャがTRUEでコールされるまで設定されたままになります。

  • dbms_ddl.set_trigger_firing_property(trigger_owner "trigger_name", FALSE)
    
  • Oracle 11.2.0.2以降の11gR2の各バージョンの場合、DEFERREFCONSTオプションを指定してDBOPTIONSパラメータを使用し、Replicatトランザクションがコミットされるまで、カスケード更新およびカスケード削除の制約のチェックおよび強制を延期できます。

  • 他のOracleのバージョンの場合、トリガーと整合性制約を無効にするか、それらを手動で変更して、Replicatデータベース・ユーザーを無視します。

Oracle GoldenGateでは、トリガーまたはカスケード制約の発生によって生じたDMLがレプリケートされるため、Replicatが非統合モードの場合は制約を無効にする必要があります。同じトリガーや制約がターゲット表でアクティブになった場合、レプリケートされたバージョンのために重複となり、データベースでエラーが返されます。ソース表にemp_srcsalary_src、ターゲット表にemp_targsalary_targを使用している次の例について考えます。

  1. emp_srcに対して削除が発行されます。

  2. それによって、削除がsalary_srcにカスケードされます。

  3. Oracle GoldenGateによって、両方の削除がターゲットに送信されます。

  4. 親削除が最初に到達し、emp_targに適用されます。

  5. 親削除によって、削除がsalary_targにカスケードされます。

  6. カスケードされたsalary_srcの削除がsalary_targに適用されます。

  7. 行はすでに手順5で削除されたため、それを見つけることはできません。

12.2 ターゲット表での制約チェックの延期

Replicatが非統合モードの場合、ターゲットで制約チェックを延期する必要がある場合があります。

  1. ソースで制約がDEFERRABLEである場合、ターゲットの制約もDEFERRABLEにする必要があります。次のパラメータ文のいずれかを使用して、Replicatのトランザクションがコミットされるまで制約チェックを延期できます。

    • Replicatセッション全体で制約を延期するには、Replicatパラメータ・ファイルのルート・レベルでSQLEXECを使用します。

      SQLEXEC ("alter session set constraint deferred")

    • DEFERREFCONSTオプションを指定してReplicatパラメータDBOPTIONSを使用し、各Replicatトランザクションに対する制約チェックを遅延させます。

  2. 一時的な主キーの重複によって生じた整合性エラーに対応するようにReplicatを構成する必要がある場合があります。一時的な主キーの重複は、トランザクションの実行中に一時的に生じ、トランザクションのコミット時に解決する重複です。この種の操作では、通常、SET x = x+n式または新しい値が既存の値と等しくなるように値を変更するその他の操作を使用します。

    次に、制約が延期されない場合に一時的な主キーの重複が発生する可能性がある一連の値変更を示します。例では、主キー列はCODEであり、現在のキー値(更新前)は1、2および3です。

    update item set code = 2 where code = 1;
    update item set code = 3 where code = 2;
    update item set code = 4 where code = 3;
    

この例では、キー値2がすでに表に存在するため、Replicatによって最初の更新がターゲットに適用されると、ORA-00001(一意制約)エラーになります。Replicatトランザクションによって制約違反エラーが返されます。デフォルトでは、Replicatによってそれらの違反および異常終了は処理されません。

12.2.1 11.2.0.2より前のバージョンでの一時的な主キーの重複の処理

11.2.0.2より前のバージョンで一時的な主キーの重複を処理するには、ReplicatパラメータHANDLETPKUPDATEを使用します。この構成では、非統合Replicatは、制約を一時的に延期して一時的な主キーの更新を処理します。この機能をサポートするには、ターゲット表でDEFERRABLE INITIALLY IMMEDIATEとして制約を作成または変更する必要があります。制約がDEFERRABLEでない場合、Replicatは、HANDLECOLLISIONSおよびREPERRORパラメータを使用して指定されているルール(存在する場合)に従ってエラーを処理するか、異常終了します。

12.2.2 11.2.0.2以降のバージョンでの一時的な主キーの重複の処理

11.2.0.2より後のバージョンの場合、非統合Replicatは、デフォルトではOracle Workspace Managerの作業領域を使用して一時的な主キーの重複を自動的に解決しようとします。この構成では、Replicatは、コミット時まで制約チェックを延期します。制約は、明示的に延期可能として定義されている必要はありません。

一時的な主キーの重複の自動処理の要件は、次のとおりです。

  • Replicatデータベース・ユーザーに次のOracle関数へのアクセス権を付与します。

    DBMS_XSTREAM_GG.ENABLE_TDUP_WORKSPACE()
    
  • ターゲット表は延期可能な制約を持つことはできません。延期可能な制約がある場合、Replicatはエラーを返し、異常終了します。

延期可能な制約を持つ表を処理するには、制約がDEFERRABLE INITIALLY IMMEDIATEであることを確認し、その表をマップするMAP文でHANDLETPKUPDATEパラメータを使用します。HANDLETPKUPDATEパラメータでは、デフォルトである重複の自動処理がオーバーライドされます。作業領域の使用によって、次のOracle GoldenGateのエラー処理パラメータが影響を受けます。

  • HANDLECOLLISIONS

  • REPERROR

ReplicatによってOracle Workspace Managerの作業領域が有効になると、HANDLECOLLISIONSREPERRORなどのOracle GoldenGateパラメータで指定されたエラー処理が無視されます。かわりに、グループ化されたトランザクション(BATCHSQLが有効な場合)がReplicatによって異常終了され、アクティブな作業領域を使用して通常のモードで更新が再試行されます。再度ORA-00001が発生する場合、Replicatでトランザクションがロールバックされ、有効なエラー処理ルールを使用してトランザクションが再試行されます。


注意:

非更新レコードに対してORA-00001が発生する場合、HANDLECOLLISIONSREPERRORなどのエラー処理のパラメータによってエラーが処理されます。

一時的な主キーの重複を含む操作に、LOBやXMLTypeなどの行外列の更新も含まれる場合、作業領域は使用できません。したがって、そのようなケースはサポートされず、ターゲットで未検出のデータの破損が発生する可能性があります。この例は、次のとおりです。

update T set PK = PK + 1, C_LOB = 'ABC';