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

前
次

13.8 DDLレプリケーションのフィルタリング

次の方法を使用して、要件に応じて特定(またはすべて)のDDLがターゲット・データベースに適用されるよう、DDL操作をフィルタできます。デフォルトでは、すべてのDDLがExtractに渡されます。

  • PL/SQLコードによるフィルタ: トリガーベースのDDLキャプチャでのみ有効です。この方法では、DDL操作が発生するとDDLトリガーによってコールされるOracle関数を使用してDDLをExtractに送信するかどうかを判断します。PL/SQLコードによるフィルタは、DDLトリガーが使用されている場合に、ソース・データベースのパフォーマンスを改善するためにのみ使用する必要があります。組込みルールおよびDDLパラメータによるフィルタと組み合せることができます(次を参照)。DDLトリガーまたはフィルタ・ルールによってフィルタされた後でExtractに渡されるDDLを、DDLパラメータを使用して特定のニーズにあわせてさらにフィルタできます。

  • 組込みフィルタ・ルールによるフィルタ: トリガーベースのDDLキャプチャでのみ有効です。この方法では、フィルタ・ルールをOracle GoldenGateトリガー・ロジックに組み込むために実行するプロシージャを使用します。この方法では、Extractに送信するオブジェクトのタイプを注意深く制御でき、ルールの評価の順序付けが可能です。この方法は、DDLトリガーが使用されている場合に、ソース・データベースのパフォーマンスを改善するためにのみ使用する必要があります。組込みルールをPL/SQLおよびDDLパラメータによるフィルタと組み合せることができます。DDLトリガーまたはフィルタ・ルールによってフィルタされた後でExtractに渡されるDDLを、DDLパラメータを使用して特定のニーズにあわせてさらにフィルタできます。

    注意:

    統合キャプチャ・モードで動作するExtractの場合、PL/SQLまたは組込みフィルタ・ルールによるフィルタは不要です。Extractがクラシック・モードで動作する必要がある場合に、これらのフィルタリング方法を使用する際は、フィルタ処理済オブジェクトに関連付けられている任意のトランザクション・データ(DML)に対して同じフィルタ処理を行う必要があります。たとえば、ACCOUNTSという名前の表を作成するDDLをフィルタ処理で除外する場合は、ACCOUNTS表がTABLE文またはMAP文で指定されないようにするか、適切な除外パラメータを使用してワイルドカードの解決から除外する必要があります。ワイルドカード除外パラメータのリストについては、Oracle GoldenGateリファレンスfor Windows and UNIXを参照してください。

  • DDLパラメータによるフィルタ: トリガーベースとネイティブDDLの両方で有効です。これは推奨されるフィルタリング方法で、Oracle GoldenGate内で実行され、ExtractとReplicatの両方でフィルタ基準を実行できます。Extractでフィルタリングを行うか、すべてのDDLを証跡に送り、Replicatでフィルタリングを行います。あるいは、異なる場所の組合せでフィルタすることもできます。DDLパラメータでは、フィルタリングを行う場所を制御でき、DDLスコープに基づいてまとめてフィルタする(すべてのMAPPEDスコープを含めるなど)機能など、トリガーの方法よりも多くのフィルタリング・オプションがあります。

    注意:

    TRANSACTIONの実行中にDDL操作が失敗すると、コミットが強制されます(DDLにまたがるトランザクションが2つに分割されます)。前半はコミットされ、後半を再起動できます。リカバリが実行されると、トランザクションのヘッダーに含まれる情報がなくなるため、トランザクションの後半をフィルタすることはできません。

13.8.1 PL/SQLコードによるフィルタ

この方法は、トリガーベースのキャプチャでのみ有効です。

PL/SQLコードを記述して、DDLをExtractに渡すかどうかを判断する関数にDDLに関する情報を渡します。Extractに送信するDDL操作を少なくすることでキャプチャのパフォーマンスを向上させることができます。

  1. Oracle GoldenGateのインストール・ディレクトリにあるddl_filter.sqlファイルを、これから記述するコードをテストできるテスト・マシンにコピーします。
  2. ファイルを編集用に開きます。filterDDLという名前のPL/SQL関数が含まれており、これを変更してif/thenフィルタ基準を指定できます。この関数に渡される情報は、次のとおりです。
    • ora_owner: DDLオブジェクトのスキーマ

    • ora_name: オブジェクトの定義されている名前

    • ora_objtype: オブジェクトのタイプ(TABLEINDEXなど)

    • ora_optype: 操作のタイプ(CREATEALTERなど)

    • ora_login_user: DDLを実行したユーザー

    • retVal: Extractの処理にDDLを含める場合はINCLUDE。DDLを除外する場合はEXCLUDE

    'compute retVal here'コメントの後ろに、フィルタするDDLのタイプごとにフィルタ・コードを記述します。次に例を示します。

    if ora_owner='SYS' then
    retVal:='EXCLUDE';
    end if;
    if ora_objtype='USER' and ora_optype ='DROP' then
    retVal:='EXCLUDE';
    end if;
    if ora_owner='JOE' and ora_name like 'TEMP%' then
    retVal:='EXCLUDE';
    end if;
    

    この例では、次のDDLが、DDLトリガーによる処理から除外されます。

    • SYSによって所有されているオブジェクトに対するDDL

    • 任意のDROP USER

    • JOE.TEMP%に対する任意のDDL

  3. (オプション)フィルタリングをトレースするには、PL/SQLの各if/then文に次の構文を追加します。
    if ora_owner='JOE' and ora_name like 'TEMP%' then
    retVal:='EXCLUDE';
    if "&gg_user" .DDLReplication.trace_level >= 1 then
    "&gg_user" .trace_put_line ('DDLFILTER', 'excluded JOE.TEMP%');
    end if;
     

    説明:

    • &gg_userは、Oracle GoldenGate DDLサポート・オブジェクトのスキーマです。

    • .DDLReplication.trace_levelは、DDLトレースのレベルです。トリガー・トレースを使用するには、Extractパラメータ・ファイルでDDLまたはDDLONLYオプションを指定してTRACEまたはTRACE2パラメータを使用する必要があります。.DDLReplication.trace_levelパラメータを>=1に設定する必要があります。

    • trace_put_lineは、Extractがトレース・ファイルに書き込む、フィルタされたDDLのタイプを表すユーザー定義テキスト文字列です。

  4. コードを保存します。
  5. テスト・システムでDDLアクティビティを停止します。
  6. SQL*Plusで次のようにddl_filter.sqlファイルをコンパイルします。ここで、schema_nameは、Oracle GoldenGate DDLオブジェクトがインストールされているスキーマです。
    @ddl_filter schema_name
    
  7. テスト環境でテストし、フィルタリングが機能することを確認します。コード内のエラーによってソースとターゲットのDDLが同期しなくなることがあるため、このテストを実行することは重要です。
  8. テストが成功したら、ファイルをソース本番システムのOracle GoldenGateのインストール・ディレクトリにコピーします。
  9. ソース・システムでDDLアクティビティを停止します。
  10. 前に行ったようにddl_filter.sqlファイルをコンパイルします。
    @ddl_filter schema_name
    
  11. ソース・システムでDDLアクティビティを停止します。

13.8.2 組込みフィルタ・ルールによるフィルタ

この方法は、トリガーベースのキャプチャでのみ有効です。

選択ルールまたは除外ルールを追加して、DDLトリガーによってExtractに送信されるDDL操作を制御できます。ルールを格納し、Extractに送信するDDL操作を少なくすることでキャプチャのパフォーマンスを向上させることができます。

  1. DDLAUX.addRule()関数を使用して、次のガイドに則したルールを定義します。この関数は、ddl_setup.sqlスクリプトを使用してDDLオブジェクトがインストールされた後にOracle GoldenGate DDLスキーマにインストールされます。
  2. ルールをアクティブにするには、SQL*Plusで関数を実行するか、SQLファイルに一連のルールを入力してそのファイルをSQL*Plusで実行します。

13.8.2.1 DDLAUX.addRule()関数の定義

FUNCTION addRule( obj_name IN VARCHAR2 DEFAULT NULL,
base_obj_name IN VARCHAR2 DEFAULT NULL,
owner_name IN VARCHAR2 DEFAULT NULL,
base_owner_name IN VARCHAR2 DEFAULT NULL,
base_obj_property IN NUMBER DEFAULT NULL,
obj_type IN NUMBER DEFAULT NULL,
command IN VARCHAR2 DEFAULT NULL,
inclusion IN boolean DEFAULT NULL ,
sno IN NUMBER DEFAULT NULL)
RETURN NUMBER;

13.8.2.2 DDLAUX.addRule()のパラメータ

この関数に渡される情報は次のパラメータで、オブジェクトの属性と関連しています。すべてのパラメータがオプションで、複数のパラメータを指定できます。

  • sno: ルールを識別するシリアル番号を指定します。ルールの評価は、シリアル番号の小さいものから大きいものの順に、一致が見つかるまで行われます。snoを使用して除外ルールの前に選択ルールを置き、除外ルールの例外を作成できます。これはファンクションでプロシージャではないため、ルールのシリアル番号を返します。これを使用して削除するルールをDDLAUX.dropRule()に指定します。コードの冒頭でDECLARE sno NUMBER; BEGIN sno :=を使用して指定しないかぎり、シリアル番号は自動的に生成されます。

    次に例を示します。

    DECLARE 
      sno NUMBER; 
    BEGIN 
      sno := tkggadmin..DDLAUX.ADDRULE(obj_name => 'GGS%' , 
                                       obj_type => TYPE_TABLE); 
    END;
    /
    
  • obj_name: オブジェクト名を指定します。名前に大文字と小文字の区別がある場合は、二重引用符で囲みます。

  • owner_name: オブジェクトのスキーマの名前を指定します。

  • base_obj_name: DDLオブジェクトのベース・オブジェクト名を指定します(オブジェクトが索引の場合のベース表など)。名前に大文字と小文字の区別がある場合は、二重引用符で囲みます。

  • base_owner_name: ベース・オブジェクトのスキーマ名を指定します。

  • base_obj_property: ベース・オブジェクトのプロパティを指定します。「DDLAUX.addRule()に対して有効なDDLコンポーネント」を参照してください。

  • obj_type: オブジェクト・タイプを指定します。「DDLAUX.addRule()に対して有効なDDLコンポーネント」を参照してください。

  • command: コマンドを指定します。「DDLAUX.addRule()に対して有効なDDLコンポーネント」を参照してください。

  • inclusion = TRUE: 指定されたオブジェクトがDDLトリガーによってキャプチャされることを示します。このパラメータが指定されない場合、ルールは除外ルールとなり、指定されたオブジェクトはキャプチャされません。除外ルールと選択ルールの両方を指定できます。DDLがルールのいずれにも一致しない場合、デフォルトで選択されます(Extractに渡されます)。パラメータなしでDDLAUX.addRule()をコールすると、すべてのオブジェクトに対するすべてのDDLを除外する空のルールが生成されます。

13.8.2.3 DDLAUX.addRule()に対して有効なDDLコンポーネント

関数コードで指定できる定義済DDLオブジェクト・タイプ、ベース・オブジェクト・プロパティおよびDDLコマンドは次のとおりです。

有効なオブジェクトは次のとおりです。

  • TYPE_INDEX
  • TYPE_TABLE
  • TYPE_VIEW
  • TYPE_SYNONYM
  • TYPE_SEQUENCE
  • TYPE_PROCEDURE
  • TYPE_FUNCTION
  • TYPE_PACKAGE
  • TYPE_TRIGGER

有効なベース・オブジェクト・プロパティは次のとおりです。

  • TB_IOT
  • TB_CLUSTER
  • TB_NESTED
  • TB_TEMP
  • TB_EXTERNAL

有効なコマンドは次のとおりです。

  • CMD_CREATE
  • CMD_DROP
  • CMD_TRUNCATE
  • CMD_ALTER

13.8.2.4 ルールベースのトリガーのフィルタの例

次の例では、名前がIMPTEMPで始まる表以外のすべての一時表を除外します。

1. DDLAUX.ADDRULE(obj_name => 'IMPTEMP%', base_obj_property => TB_TEMP, obj_type => TYPE_TABLE, INCLUSION => TRUE);
2. DDLAUX.ADDRULE(base_obj_property => TB_TEMP, obj_type => TYPE_TABLE); 

注意:

IMPTEMP%表を含めるため、そのルールを先にします。

次の例では、名前が'GGS%'のすべての表を除外します。

DECLARE sno NUMBER; BEGIN sno := DDLAUX.ADDRULE(obj_name => 'GGS%' , obj_type => TYPE_TABLE); END 

次の例では、すべての一時表を除外します。

DDLAUX.ADDRULE(base_obj_property => TB_TEMP, obj_type => TYPE_TABLE); 

次の例では、TEMP表のすべての索引を除外します。

DDLAUX.ADDRULE(base_obj_property => TB_TEMP, obj_type => TYPE_INDEX); 

次の例では、スキーマTKGGADMINのすべてのオブジェクトを除外します。

DDLAUX.ADDRULE(owner_name => 'TKGGADMIN'); 

次の例では、TEMP表に対するTRUNCATE操作のすべてのオブジェクトを除外します。

DDLAUX.ADDRULE(base_obj_property => TB_TEMP, obj_type => TYPE_TABLE, command => CMD_TRUNCATE)

13.8.2.5 フィルタ・ルールの削除

削除するルールを指定してDDLAUX.dropRule()関数を使用します。この関数は、ddl_setup.sqlスクリプトを使用してDDLオブジェクトがインストールされた後にOracle GoldenGate DDLスキーマにインストールされます。入力として、削除するルールのシリアル番号を指定します。

FUNCTION dropRule(sno IN NUMBER) RETURN BOOLEAN;

13.8.3 DDLパラメータを使用したフィルタリング

この方法は、トリガーベースのキャプチャ・モードおよび統合キャプチャ・モードでのみ有効です。

DDLパラメータは、ExtractおよびReplicatプロセス内でDDLをフィルタリングするための主要なOracle GoldenGateパラメータです。

オプションを指定せずに使用すると、DDLパラメータによるフィルタリングが実行されず、すべてのDDL操作が次のように伝播されます。

  • Extractパラメータとして、サポートされているすべてのデータベース・オブジェクトで生成された、サポートされている全DDL操作が取得されて証跡に送信されます。

  • Replicatパラメータとして、Oracle GoldenGateの証跡からすべてのDDL操作がレプリケートされ、ターゲットに適用されます。これは、このパラメータを使用しない場合のデフォルトの動作と同じです。

オプションを指定して使用すると、DDLパラメータがフィルタリング・エージェントとして機能し、次に基づいてDDL操作が含まれるか除外されます。

  • スコープ

  • オブジェクト・タイプ

  • 操作タイプ

  • オブジェクト名

  • DDLコマンド構文またはコメント、あるいはその両方の文字列

パラメータ・ファイルで使用できるDDLパラメータは1つのみですが、他のオプションとともに複数の選択オプションと除外オプションを組み合せて、必要なレベルまでDDLをフィルタできます。

  • DDLフィルタリング・オプションは、トランザクション・ソースから取得するプライマリExtractには有効ですが、データ・ポンプExtractには無効です。

  • 複数のフィルタ・オプションの指定を組み合せた場合、AND文として論理的にリンクされます。

  • レプリケートされるDDL文では、複数のオプションが指定されたすべてのフィルタ基準を満たしている必要があります。

  • 複雑なDDLフィルタリング基準を使用する場合、本番環境で使用する前にテスト環境で構成をテストすることをお薦めします。

DDLパラメータ構文およびその他の使用方法のガイドラインについては、Oracle GoldenGateリファレンスfor Windows and UNIXを参照してください。

注意:

DDLサポートを構成する前に、「処理でDDLが評価される仕組み」を参照することをお薦めします。