ヘッダーをスキップ
Oracle® Streamsレプリケーション管理者ガイド
11g リリース2 (11.2)
B61352-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

13 データの比較および収束

この章では、DBMS_COMPARISONパッケージを使用して、異なる2つのデータベースでデータベース・オブジェクトのデータを比較および収束する方法について説明します。また、作成した比較を管理する方法、およびデータ・ディクショナリ・ビューを問い合せて比較と比較結果に関する情報を取得する方法についても説明します。

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


関連項目:

DBMS_COMPARISONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

データの比較および収束

DBMS_COMPARISONパッケージを使用すると、異なるデータベースのデータベース・オブジェクトを比較して違いを識別できます。また、このパッケージを使用すると、異なるデータベースでデータベース・オブジェクトの一貫性が保持されるようにデータベース・オブジェクトを収束できます。通常、このパッケージは、複数のデータベースで1つのデータベース・オブジェクトを共有する環境で使用されます。同じデータベース・オブジェクトのコピーが複数のデータベースに存在する場合、そのデータベース・オブジェクトは共有データベース・オブジェクトとなります。

共有データベース・オブジェクトは、データ・レプリケーションによって保持できます。たとえば、マテリアライズド・ビューまたはOracle Streamsコンポーネントによって、データベース・オブジェクトをレプリケートして複数のデータベースで保持できます。また、カスタム・アプリケーションによって、共有データベース・オブジェクトを保持することもできます。データベース・オブジェクトが共有されている場合、そのデータベース・オブジェクトを共有するデータベースでデータベース・オブジェクトが拡散する可能性があります。DBMS_COMPARISONパッケージを使用すると、共有データベース・オブジェクト間での違いを識別できます。違いの識別後、必要に応じて、このパッケージを使用して共有データベース・オブジェクトを同期化することもできます。

DBMS_COMPARISONパッケージでは、次のタイプのデータベース・オブジェクトを比較できます。

  • 単一表ビュー

  • マテリアライズド・ビュー

  • 表、単一表ビューおよびマテリアライズド・ビューのシノニム

異なるデータベースで、様々なタイプのデータベース・オブジェクトを比較および収束できます。たとえば、このパッケージを使用して、あるデータベースの表と別のデータベースのマテリアライズド・ビューを比較および収束できます。

2つのデータベース・オブジェクト間の比較を作成するには、DBMS_COMPARISONパッケージのCREATE_COMPARISONプロシージャを使用します。比較の作成後、COMPAREファンクションを使用して比較を随時実行できます。COMPAREファンクションを実行すると、適切なデータ・ディクショナリ・ビューに比較結果が記録されます。COMPAREファンクションを実行するたびに、個別の比較結果が生成されます。

スキャン

COMPAREファンクションを実行するたびに、指定した比較に対して、1回以上の新しいスキャンが実行されます。スキャンでは、共有データベース・オブジェクトの一部またはすべての行で、特定の時点における違いが確認されます。COMPAREファンクションを1回実行すると、その比較結果に、1回以上のスキャンが含まれる場合があります。データベース・オブジェクトは複数回比較することができ、比較結果の各スキャンは一意のスキャンIDによって識別されます。

バケット

バケットとは、比較されているデータベース・オブジェクトの一定範囲の行です。バケットを使用すると、データベース・オブジェクトが複数の範囲に分割され、別々に比較されるため、パフォーマンスが向上します。それぞれの比較で、比較される行が適切な数のバケットに分割されます。使用されるバケットの数は、データベース・オブジェクトのサイズによって異なり、CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータで指定されている、比較用のバケットの最大数より常に少なくなります。

COMPAREファンクションを使用してバケットを比較する場合、結果は次のいずれかになります。

  • 違いが検出されなかった場合。この場合、次のバケットの比較へ進みます。

  • 違いが検出された場合。この場合、バケットはより小さいバケットに分割され、それぞれの小さいバケットが比較されます。小さいバケットで違いが検出された場合、そのバケットはさらに小さいバケットに分割されます。このプロセスが、バケットで許容される行の最小数に達するまで繰り返されます。比較用のバケットの行の最小数は、CREATE_COMPARISONプロシージャのmin_rows_in_bucketパラメータで指定されています。

    バケットの行の最小数に達すると、COMPAREファンクションによって、バケットに違いがあるかどうかがレポートされます。COMPAREファンクションには、perform_row_difパラメータが含まれています。このパラメータによって、違いが検出されたバケットの各行の違いをCOMPAREファンクションで識別するかどうかが制御されます。このパラメータがTRUEに設定されている場合、COMPAREファンクションで各行の違いが識別されます。このパラメータがFALSEに設定されている場合、COMPAREファンクションで特定の行の違いは識別されません。かわりに、バケットに違いがあることのみがレポートされます。

CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータとmin_rows_in_bucketパラメータを調整して、特定のデータベース・オブジェクトを比較する際に最高のパフォーマンスを実現できます。比較の作成後、DBA_COMPARISONデータ・ディクショナリ・ビューのMAX_NUM_BUCKETS列およびMIN_ROWS_IN_BUCKET列を問い合せると、比較用のバケットの指定を参照できます。

DBMS_COMPARISONパッケージでは、バケットのすべての行の指定列に対してORA_HASHファンクションを使用して、そのバケットのハッシュ値を計算します。2つの対応するバケットのハッシュ値が一致した場合、それらのバケットの内容は一致しているとみなされます。行の値はデータベース間で転送されないため、ORA_HASHファンクションによってバケットを効率的に比較できます。かわりにハッシュ値のみが転送されます。


注意:

比較用の索引列がVARCHAR2またはCHAR列の場合、バケットの数が、max_num_bucketsパラメータで指定されている値を超える場合があります。


関連項目:

  • ORA_HASHファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 索引列の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。


親スキャンおよびルート・スキャン

COMPAREファンクションによってバケットが小さいバケットに分割されるたびに、小さいバケットに対して新しいスキャンが実行されます。大きいバケットを分析するスキャンは、大きいバケットから分割された小さいバケットを分析する各スキャンの親スキャンです。比較結果のルート・スキャンは、最も高いレベルの親スキャンです。ルート・スキャンには親は存在しません。親スキャンIDおよびルート・スキャンIDを確認するには、DBA_COMPARISON_SCANデータ・ディクショナリ・ビューを問い合せます。

スキャンを再チェックするにはRECHECKファンクションを使用し、スキャンを収束するにはCONVERGEプロシージャを使用します。比較結果のすべての行を再チェックまたは収束する場合は、適切なサブプログラムで比較結果のルート・スキャンIDを指定します。比較結果の一部の行を再チェックまたは収束する場合は、相違点が含まれているスキャンのスキャンIDを指定します。

たとえば、20個のバケットに違いが存在するスキャンは、違いが存在するそれぞれのバケットに比較用のバケットの行の最小数として指定されている数より多くの行が含まれている場合、親スキャンとなり、さらに20回のスキャンが実行されます。比較用のバケットの行の最小数を参照するには、DBA_COMPARISONデータ・ディクショナリ・ビューのMIN_ROWS_IN_BUCKET列を問い合せます。


関連項目:

DBMS_COMPARISONパッケージに関連するビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

スキャンおよびバケットでの違いの識別方法

ここでは、2つの異なる比較の例を示し、スキャンおよびバケットでの共有データベース・オブジェクトの違いの識別方法について説明します。それぞれの例で、CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータは3に設定されています。したがって、この比較でCOMPAREまたはRECHECKファンクションが実行される場合、各スキャンで最大3つのバケットが使用されます。

図13-1に、1つ目の例を示します。

図13-1 max_num_buckets=3が設定された比較および各スキャンのそれぞれのバケットでの違い

図13-1の説明が続きます。
図13-1「max_num_buckets=3が設定された比較および各スキャンのそれぞれのバケットでの違い」の説明

図13-1には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用されるそれぞれのバケットに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示しています。

max_num_bucketsパラメータが3に設定されているため、次の手順で比較が実行されます。

  1. この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用され、各バケットで違いが検出されます。

  2. 前述の手順のルート・スキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では3回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計9つのバケットが使用されます。各バケットで違いが検出されます。図13-1では、矢印によって、この手順の各スキャンのためにルート・スキャンの各バケットが3つのバケットに分割される状況が示されています。

  3. 手順2のスキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では9回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計27個のバケットが使用されます。図13-1では、矢印によって、この手順の各スキャンのために手順2の各バケットが3つのバケットに分割される状況が示されています。

手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。

図13-2に、2つ目の例を示します。

図13-2 max_num_buckets=3が設定された比較および各スキャンの1つのバケットでの違い

図13-2の説明が続きます。
図13-2「max_num_buckets=3が設定された比較および各スキャンの1つのバケットでの違い」の説明

図13-2には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用される1つのバケットのみに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示します。

max_num_bucketsパラメータが3に設定されているため、次の手順で比較が実行されます。

  1. この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用されますが、1つのバケットのみで違いが検出されます。

  2. 違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。1つのバケットのみで違いが検出されます。図13-2では、矢印によって、この手順のスキャンのためにルート・スキャンで違いが検出されたバケットが3つのバケットに分割される状況が示されています。

  3. 手順2で違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。図13-2では、矢印によって、この手順のスキャンのために手順2で違いが検出されたバケットが3つのバケットに分割される状況が示されています。

手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。


注意:

この項の例では、CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータは3に設定されています。この設定は、スキャンおよびバケットで違いが識別される方法を示すことを目的としています。通常、max_num_bucketsパラメータは、より高い値に設定されます。このパラメータのデフォルト値は1000です。このパラメータの設定を調整して、最高のパフォーマンスを実現できます。

DBMS_COMPARISONパッケージに関する他のマニュアル

この章で説明するタスクを実行する前に、次のマニュアルを参照してください。

  • 次に示すDBMS_COMPARISONパッケージの基本的な情報については、『Oracle Database 2日でデータ・レプリケーションおよび統合ガイド』を参照してください。

    • DBMS_COMPARISONパッケージの基本概念

    • このパッケージを使用してデータベース・オブジェクトを比較および収束する場合の簡単な例

    • 比較結果に基づいて、異なるデータベースのデータベース・オブジェクト間の違いについての情報を示す問合せの例

  • 次に示すパッケージの高度な概念およびサブプログラムの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』DBMS_COMPARISONパッケージに関する章を参照してください。

    • このパッケージを使用するための要件

    • このパッケージで使用される定数の説明

    • このパッケージの各サブプログラムおよびそのパラメータの説明

共有データベース・オブジェクトの比較および収束の準備

2つのデータベースの共有データベース・オブジェクトを比較および収束するには、次の前提条件を満たす必要があります。

  • 2つのデータベースが相互に通信できるようにネットワーク接続を構成します。データベース間のネットワーク接続を構成する方法については、『Oracle Database Net Services管理者ガイド』を参照してください。

  • 比較を作成、実行および管理するデータベース・ユーザーを指定または作成します。このデータベース・ユーザーは、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』DBMS_COMPARISONパッケージに関する項に示されている権限の要件を満たす必要があります。

    必要な権限を持つユーザーを指定または作成した後、DBMS_COMPARISONパッケージのサブプログラムを実行するデータベースからデータベース・オブジェクトを共有するもう一方のデータベースへのデータベース・リンクを作成します。指定したユーザーがデータベース・リンクを所有している必要があり、このリンクは、リモート・データベース上の必要な権限を持つユーザーに接続している必要があります。

    たとえば、次の例では、データベースcomp1.example.comのユーザーadminが所有し、リモート・データベースcomp2.example.comadminユーザーに接続するデータベース・リンクを作成します。

    1. SQL*Plusで、adminユーザーとしてローカル・データベースに接続します。

      SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

    2. データベース・リンクを作成します。

      CREATE DATABASE LINK comp2.example.com CONNECT TO admin
         IDENTIFIED BY password USING 'comp2.example.com';
      

2つのデータベースのデータベース・オブジェクトの拡散の例

次の項では、2つのデータベースの共有データベース・オブジェクトを比較および収束する例を示します。

これらの例のほとんどでは、oe.orders表のデータを比較および収束します。この表は、oeサンプル・スキーマに含まれ、デフォルトでOracle Databaseとともにインストールされます。これらの例では、データベースのグローバル名はcomp1.example.comおよびcomp2.example.comですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。

これらの例のために、次の手順を実行してoe.orders表を2つのデータベースで拡散させます。

  1. SQL*Plusで、oeユーザーとしてcomp2.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  2. customer_id147の注文をoe.orders表から削除します。

    DELETE FROM oe.orders WHERE customer_id=147;
    
  3. oe.orders表で行のデータを変更します。

    UPDATE oe.orders SET sales_rep_id=163 WHERE order_id=2440;
    
  4. oe.orders表に行を挿入します。

    INSERT INTO oe.orders VALUES(3000, TIMESTAMP '2006-01-01 2:00:00', 'direct', 107, 3, 16285.21, 156, NULL);
    
  5. 変更をコミットしてSQL*Plusを終了します。

    COMMIT;
    EXIT
    

注意:

通常、これらの手順は必要ありません。これらの手順は、2つのデータベースでoe.orders表を確実に拡散させるために記載されています。

2つのデータベースの共有データベース・オブジェクトの比較

この項の例では、DBMS_COMPARISONパッケージを使用して、comp1.example.comおよびcomp2.example.comデータベースのoe.orders表を比較します。例では、このパッケージを使用して異なるタイプの比較を作成し、その比較を使用して表を比較します。

この項の例は、次のとおりです。

共有データベース・オブジェクトの列のサブセットの比較

CREATE_COMPARISONプロシージャのcolumn_listパラメータを使用すると、データベース・オブジェクトの列のサブセットを比較できます。列のサブセットを比較する理由は次のとおりです。

  • データベース・オブジェクトに、比較対象のデータベース・オブジェクトに存在しない追加の列が含まれている。この場合、column_listパラメータには、両方のデータベース・オブジェクトに存在する列のみを含める必要があります。

  • 特定の列セットに比較を限定する必要がある。たとえば、表に何百もの列が含まれている場合、column_listパラメータに特定の列を指定して、効率的に比較できます。

  • 一部の列に違いが存在すると予測される。この場合、違いが存在すると予測される列をcolumn_listパラメータから除外します。

列リストの列は、次の要件を満たしている必要があります。

  • 列リストは、DBMS_COMPARISONパッケージの索引列の要件を満たしている必要があります。索引列の要件の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

  • CONVERGEプロシージャを使用して比較結果に基づいてデータベース・オブジェクトを変更する場合は、そのデータベース・オブジェクト内のNOT NULL制約が指定され、デフォルト値が指定されていないすべての列を、列リストに含める必要があります。

この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表のorder_idorder_dateおよびcustomer_id列を比較します。

  1. 「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。

  2. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  3. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'compare_subset_columns',
        schema_name     => 'oe',
        object_name     => 'orders',
        dblink_name     => 'comp2.example.com',
        column_list     => 'order_id,order_date,customer_id');
    END;
    /
    

    新しい比較の名前はcompare_subset_columnsです。この比較は、CREATE_COMPARISONプロシージャを実行するユーザーによって所有されます。

  4. COMPAREファンクションを実行して、2つのデータベースのoe.orders表を比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_subset_columns',
                      scan_info       => scan_info,
                      perform_row_dif => TRUE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
    

    COMPAREファンクションのperform_row_difパラメータがTRUEに設定されていることに注意してください。この設定によって、COMPAREファンクションは、表の個々の行の違いを識別します。perform_row_difパラメータがFALSEに設定されている場合、COMPAREファンクションは、表に違いが存在するかどうかは記録しますが、個々の行の違いは記録しません。

    出力は次のようになります。

    Scan ID: 1
    Differences were found.
    
    PL/SQL procedure successfully completed.
    

関連項目:


行の違いを識別しない共有データベース・オブジェクトの比較

既存の比較に対してCOMPAREプロシージャを実行する場合は、perform_row_difパラメータによって、COMPAREプロシージャでデータベース・オブジェクトの個々の行の違いを識別するかどうかが制御されます。

  • perform_row_difパラメータがTRUEに設定されている場合、COMPAREプロシージャは、データベース・オブジェクトに違いが存在するかどうかを記録し、個々の行の違いを記録します。データベース・オブジェクトのそれぞれの違いを識別する必要がある場合は、このパラメータをTRUEに設定します。

  • perform_row_difパラメータがFALSEに設定されている場合、COMPAREプロシージャは、データベース・オブジェクトに違いが存在するかどうかは記録しますが、個々の行の違いは記録しません。データベース・オブジェクトに違いが存在するかどうかを知る必要があり、個々の違いを識別する必要がない場合は、このパラメータをFALSEに設定します。このパラメータをFALSEに設定すると、最も効率的に比較を実行できます。

COMPAREファンクションのperform_row_difパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

この例では、個々の行の違いを識別せずに、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表全体を比較します。

  1. 「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。

  2. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  3. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'compare_orders',
        schema_name     => 'oe',
        object_name     => 'orders',
        dblink_name     => 'comp2.example.com');
    END;
    /
    
  4. COMPAREファンクションを実行して、2つのデータベースのoe.orders表を比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_orders',
                      scan_info       => scan_info,
                      perform_row_dif => FALSE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
    

    COMPAREファンクションのperform_row_difパラメータがFALSEに設定されていることに注意してください。

    出力は次のようになります。

    Scan ID: 4
    Differences were found.
    
    PL/SQL procedure successfully completed.
    

関連項目:


共有データベース・オブジェクトのランダム部分の比較

CREATE_COMPARISONプロシージャのscan_percentおよびscan_modeパラメータを使用すると、共有データベース・オブジェクト全体ではなく、共有データベース・オブジェクトの一部をランダムに比較できます。通常、このオプションは、次の場合に使用します。

  • 比較的大きい共有データベース・オブジェクトを比較しており、データベース・オブジェクト全体の比較にリソースおよび時間を費やすことなく、違いが存在するかどうかを判別する場合。

  • 後続の比較を使用してデータベース・オブジェクトの別の部分を比較しない場合。後続の比較でデータベース・オブジェクトの別の部分を比較する場合の手順については、「共有データベース・オブジェクトの循環比較」を参照してください。

この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表の一部をランダムに比較します。

  1. 「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。

  2. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  3. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'compare_random',
        schema_name     => 'oe',
        object_name     => 'orders',
        dblink_name     => 'comp2.example.com',
        scan_mode       =>  DBMS_COMPARISON.CMP_SCAN_MODE_RANDOM,
        scan_percent    =>  50);
    END;
    /
    

    比較時に表の半分がスキャンされるように指定するためにscan_percentパラメータが50に設定されていることに注意してください。表のランダムな行が比較されるように指定するためにscan_modeパラメータはDBMS_COMPARISON.CMP_SCAN_MODE_RANDOMに設定されています。

  4. COMPAREファンクションを実行して、2つのデータベースのoe.orders表を比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_random',
                      scan_info       => scan_info,
                      perform_row_dif => TRUE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
    

    COMPAREファンクションのperform_row_difパラメータがTRUEに設定されていることに注意してください。この設定によって、COMPAREファンクションは、表の個々の行の違いを識別します。perform_row_difパラメータがFALSEに設定されている場合、COMPAREファンクションは、表に違いが存在するかどうかは記録しますが、個々の行の違いは記録しません。

    出力は次のようになります。

    Scan ID: 7
    Differences were found.
    
    PL/SQL procedure successfully completed.
    

    この比較のスキャンでは、比較される表の部分に応じて、違いが検出される場合と検出されない場合があります。


関連項目:


共有データベース・オブジェクトの循環比較

CREATE_COMPARISONプロシージャのscan_percentおよびscan_modeパラメータを使用すると、共有データベース・オブジェクトの一部を循環比較できます。循環比較では、1回の比較で比較対象のデータベース・オブジェクトの一部がスキャンされます。このデータベース・オブジェクトを再度比較すると、前回の比較が終了した箇所から、データベース・オブジェクトの別の部分が比較されます。

通常、このオプションは、次の場合に使用します。

  • 比較的大きい共有データベース・オブジェクトを比較しており、データベース・オブジェクト全体の比較にリソースおよび時間を費やすことなく、違いが存在するかどうかを判別する場合。

  • 各比較で共有データベース・オブジェクトの別の部分を比較して、データベース・オブジェクト全体が適切な回数のスキャンで比較されるようにする場合。たとえば、共有データベース・オブジェクトの25%を比較する場合、データベース・オブジェクト全体は4回の比較で比較されます。後続の比較でデータベース・オブジェクトの別の部分を比較しない場合の手順については、「共有データベース・オブジェクトのランダム部分の比較」を参照してください。

この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表を循環比較します。

  1. 「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。

  2. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  3. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'compare_cyclic',
        schema_name     => 'oe',
        object_name     => 'orders',
        dblink_name     => 'comp2.example.com',
        scan_mode       =>  DBMS_COMPARISON.CMP_SCAN_MODE_CYCLIC,
        scan_percent    =>  50);
    END;
    /
    

    比較時に表の半分がスキャンされるように指定するためにscan_percentパラメータが50に設定されていることに注意してください。表の行が循環比較されるように指定するためにscan_modeパラメータはDBMS_COMPARISON.CMP_SCAN_MODE_CYCLICに設定されています。

  4. COMPAREファンクションを実行して、2つのデータベースのoe.orders表を比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_cyclic',
                      scan_info       => scan_info,
                      perform_row_dif => TRUE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
    

    COMPAREファンクションのperform_row_difパラメータがTRUEに設定されていることに注意してください。この設定によって、COMPAREファンクションは、表の個々の行の違いを識別します。perform_row_difパラメータがFALSEに設定されている場合、COMPAREファンクションは、表に違いが存在するかどうかは記録しますが、個々の行の違いは記録しません。

    出力は次のようになります。

    Scan ID: 8
    Differences were found.
    
    PL/SQL procedure successfully completed.
    

    この比較のスキャンでは、比較される表の部分に応じて、違いが検出される場合と検出されない場合があります。

  5. データベース・オブジェクトで前回の比較が終了した箇所の次の部分を比較するために、手順4で実行したCOMPAREファンクションを再実行します。この例では、手順3scan_percentパラメータが50に設定されているため、COMPAREファンクションを2回実行すると、データベース・オブジェクト全体が比較されます。


関連項目:


共有データベース・オブジェクトのカスタム部分の比較

CREATE_COMPARISONプロシージャのscan_modeパラメータを使用すると、共有データベース・オブジェクトのカスタム部分を比較できます。CREATE_COMPARISONプロシージャのscan_modeパラメータをCMP_SCAN_MODE_CUSTOMに設定して比較を作成すると、COMPAREファンクションの実行時に比較されるデータベース・オブジェクトの部分を指定できます。

通常、このオプションは、次の場合に使用します。

  • 共有データベース・オブジェクトの特定の部分を比較する場合。

  • 比較的大きい共有データベース・オブジェクトを比較しており、データベース・オブジェクト全体の比較にリソースおよび時間を費やすことなく、データベース・オブジェクトの特定の部分に違いが存在するかどうかを判別する場合。

CREATE_COMPARISONプロシージャのscan_modeパラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表のカスタム部分を比較します。

  1. 「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。

  2. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  3. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name   => 'compare_custom',
        schema_name       => 'oe',
        object_name       => 'orders',
        dblink_name       => 'comp2.example.com',
        index_schema_name => 'oe',
        index_name        => 'order_pk',
        scan_mode         =>  DBMS_COMPARISON.CMP_SCAN_MODE_CUSTOM);
    END;
    /
    

    scan_modeパラメータがDBMS_COMPARISON.CMP_SCAN_MODE_CUSTOMに設定されていることに注意してください。このスキャン・モードを指定した場合は、比較で使用する索引を指定する必要があります。この例では、or.order_pk索引を指定しています。

  4. 次の問合せを実行して、手順3で作成した比較に索引列を指定します。

    SELECT COLUMN_NAME, COLUMN_POSITION FROM DBA_COMPARISON_COLUMNS 
      WHERE COMPARISON_NAME = 'COMPARE_CUSTOM' AND
            INDEX_COLUMN    = 'Y';
    

    カスタム比較では、索引列を使用して、次の手順でCOMPAREファンクションを実行する際に比較する表の部分を指定します。この例では、問合せによって次の出力が戻されます。

    COLUMN_NAME                    COLUMN_POSITION
    ------------------------------ ---------------
    ORDER_ID                                     1
    

    この出力には、oe.orders表のorder_id列が比較用の索引列であることが示されています。

    他のデータベース・オブジェクトでは、CREATE_COMPARISONプロシージャによって複数の索引列を識別できます。複数の索引列が存在する場合は、次の手順でリード索引列の値を指定します。リード索引列のCOLUMN_POSITION値には1が表示されます。

  5. COMPAREファンクションを実行して、2つのデータベースのoe.orders表を比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_custom',
                      scan_info       => scan_info,
                      min_value       => '2430',
                      max_value       => '2460',
                      perform_row_dif => TRUE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
    

    COMPAREファンクションの次のパラメータ設定に注意してください。

    • min_valueおよびmax_valueパラメータは、それぞれ2430および2460に設定されています。したがって、COMPAREファンクションでは、order_id列が2430から2460の範囲の行のみが比較されます。

    • order_id列の列データ型はNUMBERですが、min_valueおよびmax_valueパラメータはVARCHAR2データ型値として指定されています。

    • COMPAREファンクションのperform_row_difパラメータがTRUEに設定されています。この設定によって、COMPAREファンクションは、表の個々の行の違いを識別します。perform_row_difパラメータがFALSEに設定されている場合、COMPAREファンクションは、表に違いが存在するかどうかは記録しますが、個々の行の違いは記録しません。

    出力は次のようになります。

    Scan ID: 10
    Differences were found.
     
    PL/SQL procedure successfully completed.
    

関連項目:


CLOB列またはBLOB列を含む共有データベース・オブジェクトの比較

DBMS_COMPARISONパッケージでは、CLOBまたはBLOBデータ型の列を含む共有データベース・オブジェクトの比較を直接サポートしていません。ただし、次の基本的な手順を完了することで、CLOBまたはBLOB列を含む表を比較できます。

  1. 各データベースで、表に基づくビューを作成し、CLOBまたはBLOB列を、DBMS_CRYPTO.HASHファンクションを使用して生成したRAWデータ型列に置き換えます。

  2. 手順1で作成したビューを比較します。

例では、NUMBER例およびCLOB列を含む単純な表に対してこれらの手順を実行する方法を示します。この例では、データベースのグローバル名はcomp1.example.comおよびcomp2.example.comですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。


注意:

DBMS_COMPARISONパッケージでは、LOB列を含む共有データベース・オブジェクトを収束できません。

手順は次のとおりです。

  1. 「共有データベース・オブジェクトの比較および収束の準備」で説明されているタスクを実行します。

  2. comp1.example.comデータベースで、CLOBまたはBLOB列を含む表を所有しているユーザーまたは所有する予定のユーザーが、DBMS_CRYPTOパッケージのEXECUTE権限を持っていることを確認します。

    この例では、表を所有する予定のユーザーはoeであると想定しています。次の手順を完了して、この権限をoeユーザーに付与します。

    1. 権限を付与できる管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

    2. DBMS_CRYPTOパッケージのEXECUTEをユーザーに付与します。

      GRANT EXECUTE ON DBMS_CRYPTO TO oe;
      
  3. comp2.example.comデータベースで、CLOBまたはBLOB列を含む表を所有しているユーザーまたは所有する予定のユーザーが、DBMS_CRYPTOパッケージのEXECUTE権限を持っていることを確認します。

    この例では、表を所有する予定のユーザーはoeであると想定しています。次の手順を完了して、この権限をoeユーザーに付与します。

    1. 権限を付与できる管理ユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。

    2. DBMS_CRYPTOパッケージのEXECUTEをユーザーに付与します。

      GRANT EXECUTE ON DBMS_CRYPTO TO oe;
      
  4. comp1.example.comデータベースでCLOB列を含む表およびこの表に基づいたビューを作成します。

    1. 表を所有する予定のユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

      SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

    2. 次のように表を作成します。

      CREATE TABLE oe.tab_lob(
        c1 NUMBER PRIMARY KEY, 
        c2 CLOB DEFAULT to_clob('c2'));
      
    3. tab_lob表に行を挿入して、変更をコミットします。

      INSERT INTO oe.tab_lob VALUES(1, TO_CLOB('row 1'));COMMIT;
      
    4. 次のようにビューを作成します。

      BEGIN
        EXECUTE IMMEDIATE 'CREATE VIEW view_lob AS SELECT 
            c1, 
            DBMS_CRYPTO.HASH(c2, '||DBMS_CRYPTO.HASH_SH1||') c2_hash 
          FROM tab_lob';
      END;
      /
      

    関連項目:

    DBMS_CRYPTOパッケージで使用される暗号ハッシュ・ファンクションの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

  5. comp2.example.comデータベースでCLOB列を含む表およびこの表に基づいたビューを作成します。

    1. 表を所有する予定のユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。

      SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

    2. 次のように表を作成します。

      CREATE TABLE oe.tab_lob(
        c1 NUMBER PRIMARY KEY, 
        c2 CLOB DEFAULT to_clob('c2'));
      
    3. tab_lob表に行を挿入して、変更をコミットします。

      INSERT INTO oe.tab_lob VALUES(1, TO_CLOB('row 1'));COMMIT;
      
    4. 次のようにビューを作成します。

      BEGIN
        EXECUTE IMMEDIATE 'CREATE VIEW view_lob AS SELECT 
            c1, 
            DBMS_CRYPTO.HASH(c2, '||DBMS_CRYPTO.HASH_SH1||') c2_hash 
          FROM tab_lob';
      END;
      /
      
  6. 「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

  7. CREATE_COMPARISONプロシージャを実行して、比較を作成します。

    BEGIN
      DBMS_COMPARISON.CREATE_COMPARISON(
        comparison_name => 'compare_lob',
        schema_name     => 'oe',
        object_name     => 'view_lob',
        dblink_name     => 'comp2.example.com');
    END;
    /
    

    schema_nameおよびobject_nameパラメータでは、oe.view_lobビューを指定しますが、CLOB列を含む表は指定しないことに注意してください。

  8. COMPAREファンクションを実行して、2つのデータベースのoe.view_lobビューを比較します。

    SET SERVEROUTPUT ON
    DECLARE
      consistent   BOOLEAN;
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      consistent := DBMS_COMPARISON.COMPARE(
                      comparison_name => 'compare_lob',
                      scan_info       => scan_info,
                      perform_row_dif => TRUE);
      DBMS_OUTPUT.PUT_LINE('Scan ID: '||scan_info.scan_id);
      IF consistent=TRUE THEN
        DBMS_OUTPUT.PUT_LINE('No differences were found.');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Differences were found.');
      END IF;
    END;
    /
     
    Scan ID: 1
    No differences were found.
     
    PL/SQL procedure successfully completed.
    
  9. 次の手順を実行してoe.tab_lob表を2つのデータベースで拡散させます。

    1. 表を所有するユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。

      SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

    2. 行を挿入して、変更をコミットします。

      INSERT INTO oe.tab_lob VALUES(2, TO_CLOB('row a'));
      COMMIT;
      
    3. 表を所有するユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。

      SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

    4. 行を挿入して、変更をコミットします。

      INSERT INTO oe.tab_lob VALUES(2, TO_CLOB('row b'));
      COMMIT;
      
  10. 再びCOMPAREファンクションを実行して、2つのデータベースのoe.view_lobビューを比較します。手順8を参照してください。

    CLOB列を含む共有表は、2つのデータベースで拡散されました。したがって、ビューを比較すると、COMPAREファンクションによって次の出力が戻されます。

    Scan ID: 2
    Differences were found.
     
    PL/SQL procedure successfully completed.
    

比較および比較結果に関する情報の表示

次のデータ・ディクショナリ・ビューには、DBMS_COMPARISONパッケージで作成された比較に関する情報が含まれています。

  • DBA_COMPARISON

  • USER_COMPARISON

  • DBA_COMPARISON_COLUMNS

  • USER_COMPARISON_COLUMNS

  • DBA_COMPARISON_SCAN

  • USER_COMPARISON_SCAN

  • DBA_COMPARISON_SCAN_VALUES

  • USER_COMPARISON_SCAN_VALUES

  • DBA_COMPARISON_ROW_DIF

  • USER_COMPARISON_ROW_DIF

ここでは、比較および比較結果を監視するために使用できる問合せの例を示します。


関連項目:

比較に関連するデータ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。

データベース内の比較に関する一般的な情報の表示

DBA_COMPARISONデータ・ディクショナリ・ビューには、ローカル・データベース内の比較に関する情報が含まれています。この項の問合せでは、各比較に関する次の情報が表示されます。

  • 比較の所有者。

  • 比較の名前。

  • 比較によって比較されたデータベース・オブジェクトが含まれているスキーマ。

  • 比較によって比較されたデータベース・オブジェクトの名前。

  • 比較によって比較されたデータベース・オブジェクトのデータ型。

  • 比較で使用されたスキャン・モード。スキャン・モードは次のいずれかになります。

    • FULL: データベース・オブジェクト全体が比較されることを示します。

    • RANDOM: データベース・オブジェクトのランダム部分が比較されることを示します。

    • CYCLIC: 1回の比較でデータベース・オブジェクトの一部が比較されることを示します。このデータベース・オブジェクトを再度比較すると、前回の比較が終了した箇所から、データベース・オブジェクトの別の部分が比較されます。

    • CUSTOM: COMPAREファンクションによってデータベース・オブジェクトで比較する範囲が指定されることを示します。

  • リモート・データベースへの接続に使用されたデータベース・リンクの名前。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A22
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A8
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A8
COLUMN OBJECT_TYPE HEADING 'Object|Type' FORMAT A8
COLUMN SCAN_MODE HEADING 'Scan|Mode' FORMAT A6
COLUMN DBLINK_NAME HEADING 'Database|Link' FORMAT A15
 
SELECT OWNER,
       COMPARISON_NAME,
       SCHEMA_NAME,
       OBJECT_NAME,
       OBJECT_TYPE,
       SCAN_MODE,
       DBLINK_NAME
  FROM DBA_COMPARISON;

出力は次のようになります。

Comparison Comparison             Schema   Object   Object   Scan   Database
Owner      Name                   Name     Name     Type     Mode   Link
---------- ---------------------- -------- -------- -------- ------ ----------
ADMIN      COMPARE_SUBSET_COLUMNS OE       ORDERS   TABLE    FULL   COMP2.EXAM
                                                                    PLE
ADMIN      COMPARE_ORDERS         OE       ORDERS   TABLE    FULL   COMP2.EXAM
                                                                    PLE
ADMIN      COMPARE_RANDOM         OE       ORDERS   TABLE    RANDOM COMP2.EXAM
                                                                    PLE
ADMIN      COMPARE_CYCLIC         OE       ORDERS   TABLE    CYCLIC COMP2.EXAM
                                                                    PLE
ADMIN      COMPARE_CUSTOM         OE       ORDERS   TABLE    CUSTOM COMP2.EXAM
                                                                    PLE

比較では、ローカル・データベース・オブジェクトがリモート・データベースのデータベース・オブジェクトと比較されます。比較は、問合せで示されているデータベース・リンクを使用してリモート・データベースに接続し、実行されます。

デフォルトでは、比較対象のデータベース・オブジェクトの所有者、名前およびデータ型は、両方のデータベースで同じであると想定されます。ただし、ローカル・データベースとリモート・データベースでこれらが異なる場合があります。この項の問合せではリモート・データベース・オブジェクトに関する情報は表示されませんが、REMOTE_SCHEMA_NAMEREMOTE_OBJECT_NAMEおよびREMOTE_OBJECT_TYPE列を問い合せると、この情報を表示できます。


関連項目:

この問合せの出力に示されている比較を作成する方法の詳細は、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください。

ランダム比較および循環比較固有の情報の表示

スキャン・モードRANDOMまたはCYCLICを使用する比較を作成する場合は、比較する共有データベース・オブジェクトの割合を指定します。この項の問合せでは、ランダム比較および循環比較に関する次の情報が表示されます。

  • 比較の所有者。

  • 比較の名前。

  • 比較によって比較されたデータベース・オブジェクトが含まれているスキーマ。

  • 比較によって比較されたデータベース・オブジェクトの名前。

  • 比較によって比較されたデータベース・オブジェクトのデータ型。

  • 比較におけるスキャンの割合。COMPAREファンクションが実行されて比較スキャンが実行されるたびに、データベース・オブジェクトで、指定されている割合が比較されます。

  • 比較で使用されたリード索引列の最後の値。COMPAREファンクションが次回実行される際は、問合せで示されたリード索引列の値の直後の値の行から開始されます。この値は、循環比較にのみ適用されます。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A22
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A8
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A8
COLUMN OBJECT_TYPE HEADING 'Object|Type' FORMAT A8
COLUMN SCAN_PERCENT HEADING 'Scan|Percent' FORMAT 999
COLUMN CYCLIC_INDEX_VALUE HEADING 'Cyclic|Index|Value' FORMAT A10
 
SELECT OWNER,
       COMPARISON_NAME,
       SCHEMA_NAME,
       OBJECT_NAME,
       OBJECT_TYPE,
       SCAN_PERCENT,
       CYCLIC_INDEX_VALUE
  FROM DBA_COMPARISON
  WHERE SCAN_PERCENT IS NOT NULL;

出力は次のようになります。

                                                                     Cyclic
Comparison Comparison             Schema   Object   Object      Scan Index
Owner      Name                   Name     Name     Type     Percent Value
---------- ---------------------- -------- -------- -------- ------- ----------
ADMIN      COMPARE_RANDOM         OE       ORDERS   TABLE         50
ADMIN      COMPARE_CYCLIC         OE       ORDERS   TABLE         50 2677

データベース内の各比較によって比較された列の表示

比較を作成する場合は、比較で共有データベース・オブジェクトのすべての列を比較するか、または列のサブセットを比較するように指定できます。また、比較で使用する索引を指定するか、または索引がシステムによって自動的に指定されるように設定できます。

この項の問合せでは、次の情報が表示されます。

  • 比較の所有者。

  • 比較の名前。

  • 比較によって比較されたデータベース・オブジェクトが含まれているスキーマ。

  • 比較によって比較されたデータベース・オブジェクトの名前。

  • 各データベース・オブジェクトで比較される各列の列名。

  • 各列の列位置。

  • 列が索引列かどうか。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A15
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A10
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A10
COLUMN COLUMN_NAME HEADING 'Column|Name' FORMAT A12
COLUMN COLUMN_POSITION HEADING 'Column|Position' FORMAT 9999
COLUMN INDEX_COLUMN HEADING 'Index|Column?' FORMAT A7
 
SELECT c.OWNER,
       c.COMPARISON_NAME,
       c.SCHEMA_NAME,
       c.OBJECT_NAME,
       o.COLUMN_NAME,
       o.COLUMN_POSITION,
       o.INDEX_COLUMN
  FROM DBA_COMPARISON c, DBA_COMPARISON_COLUMNS o
  WHERE c.OWNER           = o.OWNER AND
        c.COMPARISON_NAME = o.COMPARISON_NAME
  ORDER BY COMPARISON_NAME, COLUMN_POSITION;

出力は次のようになります。

Comparison Comparison      Schema     Object     Column         Column Index
Owner      Name            Name       Name       Name         Position Column?
---------- --------------- ---------- ---------- ------------ -------- -------
ADMIN      COMPARE_CUSTOM  OE         ORDERS     ORDER_ID            1 Y
ADMIN      COMPARE_CUSTOM  OE         ORDERS     ORDER_DATE          2 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     ORDER_MODE          3 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     CUSTOMER_ID         4 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     ORDER_STATUS        5 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     ORDER_TOTAL         6 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     SALES_REP_ID        7 N
ADMIN      COMPARE_CUSTOM  OE         ORDERS     PROMOTION_ID        8 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     ORDER_ID            1 Y
ADMIN      COMPARE_CYCLIC  OE         ORDERS     ORDER_DATE          2 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     ORDER_MODE          3 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     CUSTOMER_ID         4 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     ORDER_STATUS        5 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     ORDER_TOTAL         6 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     SALES_REP_ID        7 N
ADMIN      COMPARE_CYCLIC  OE         ORDERS     PROMOTION_ID        8 N
.
.
.

関連項目:


データベース内の各スキャンに関する一般的な情報の表示

各スキャンでは、ローカル・データベースのバケットとリモート・データベースのバケットが比較されます。比較されるバケットには、共有データベース・オブジェクトの同じ範囲の行が含まれます。COMPAREファンクションを1回実行して生成された比較結果に、複数のバケットおよび複数回のスキャンが含まれる場合があります。各スキャンには一意のスキャンIDが存在します。

この項の問合せでは、各スキャンに関する次の情報が表示されます。

  • スキャンが実行された比較の所有者。

  • スキャンが実行された比較の名前。

  • スキャンによって比較されたデータベース・オブジェクトが含まれているスキーマ。

  • スキャンによって比較されたデータベース・オブジェクトの名前。

  • スキャンのスキャンID。

  • スキャンの状態。状態の値は次のいずれかになります。

    • SUC: 前回このデータ・ディクショナリの行が更新された際に2つの表の2つのバケットが一致したことを示します。

    • BUCKET DIF: 2つの表の2つのバケットが一致しなかったことを示します。各バケットは、さらに小さいバケットで構成されています。

    • FINAL BUCKET DIF: 2つの表の2つのバケットが一致しなかったことを示します。いずれのバケットも、さらに小さいバケットで構成されていません。COMPAREファンクションまたはRECHECKファンクションのperform_row_difパラメータがFALSEに設定されていたため、バケットで個々の行の違いは識別されませんでした。

    • ROW DIF: 2つの表の2つのバケットが一致しなかったことを示します。いずれのバケットも、さらに小さいバケットで構成されていません。COMPAREファンクションまたはRECHECKファンクションのperform_row_difパラメータがTRUEに設定されていたため、バケットで個々の行の違いが識別されました。

  • スキャンで比較された行の数。

  • スキャンが前回更新された日時。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A15
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A6
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A6
COLUMN SCAN_ID HEADING 'Scan|ID' FORMAT 9999
COLUMN STATUS HEADING 'Scan|Status' FORMAT A10
COLUMN COUNT_ROWS HEADING 'Number|of|Rows' FORMAT 9999999
COLUMN SCAN_NULLS HEADING 'Scan|NULLs?' FORMAT A6
COLUMN LAST_UPDATE_TIME HEADING 'Last|Update' FORMAT A11

SELECT c.OWNER,
       c.COMPARISON_NAME,
       c.SCHEMA_NAME,
       c.OBJECT_NAME,
       s.SCAN_ID,
       s.STATUS,
       s.COUNT_ROWS,
       TO_CHAR(s.LAST_UPDATE_TIME, 'DD-MON-YYYY HH24:MI:SS') LAST_UPDATE_TIME 
  FROM DBA_COMPARISON c, DBA_COMPARISON_SCAN s
  WHERE c.OWNER           = s.OWNER AND
        c.COMPARISON_NAME = s.COMPARISON_NAME
  ORDER BY SCAN_ID;

出力は次のようになります。

                                                            Number
Comparison Comparison      Schema Object  Scan Scan             of Last
Owner      Name            Name   Name      ID Status         Rows Update
---------- --------------- ------ ------ ----- ---------- -------- -----------
ADMIN      COMPARE_SUBSET_ OE     ORDERS     1 BUCKET DIF          20-DEC-2006
           COLUMNS                                                  09:46:34
ADMIN      COMPARE_SUBSET_ OE     ORDERS     2 ROW DIF         105 20-DEC-2006
           COLUMNS                                                  09:46:34
ADMIN      COMPARE_SUBSET_ OE     ORDERS     3 ROW DIF           1 20-DEC-2006
           COLUMNS                                                  09:46:35
ADMIN      COMPARE_ORDERS  OE     ORDERS     4 BUCKET DIF          20-DEC-2006
                                                                    09:47:02
ADMIN      COMPARE_ORDERS  OE     ORDERS     5 FINAL BUCK      105 20-DEC-2006
                                               ET DIF               09:47:02
ADMIN      COMPARE_ORDERS  OE     ORDERS     6 FINAL BUCK        1 20-DEC-2006
                                               ET DIF               09:47:02
ADMIN      COMPARE_RANDOM  OE     ORDERS     7 SUC                 20-DEC-2006
                                                                    09:47:37
ADMIN      COMPARE_CYCLIC  OE     ORDERS     8 BUCKET DIF          20-DEC-2006
                                                                    09:48:22
ADMIN      COMPARE_CYCLIC  OE     ORDERS     9 ROW DIF         105 20-DEC-2006
                                                                    09:48:22
ADMIN      COMPARE_CUSTOM  OE     ORDERS    10 BUCKET DIF          20-DEC-2006
                                                                    09:49:15
ADMIN      COMPARE_CUSTOM  OE     ORDERS    11 ROW DIF          16 20-DEC-2006
                                                                    09:49:15
ADMIN      COMPARE_CUSTOM  OE     ORDERS    12 ROW DIF          13 20-DEC-2006
                                                                    09:49:15

スキャンの状態がBUCKET DIFFINAL BUCKET DIFまたはROW DIFの場合、CONVERGEプロシージャを実行してスキャンIDを指定すると、スキャンで検出された違いを収束できます。ただし、特定のスキャンで確認された部分ではなく、比較結果のすべての行を収束するには、CONVERGEプロシージャの実行時に比較結果のルート・スキャンIDを指定します。

また、違いが検出されたことがスキャンで示された場合は、RECHECKファンクションを使用してスキャンを再確認できます。比較結果のすべての行を再確認するには、RECHECKファンクションを実行して、比較結果のルート・スキャンIDを指定します。


関連項目:


データベース内の各スキャンの親スキャンIDおよびルート・スキャンIDの表示

この項の問合せでは、データベースの各スキャンの親スキャンIDおよびルート・スキャンIDが表示されます。具体的には、この問合せによって次の情報が表示されます。

  • スキャンが実行された比較の所有者。

  • スキャンが実行された比較の名前。

  • スキャンによって比較されたデータベース・オブジェクトが含まれているスキーマ。

  • スキャンによって比較されたデータベース・オブジェクトの名前。

  • スキャンのスキャンID。

  • スキャンの親スキャンのスキャンID。

  • スキャンのルート・スキャンのスキャンID。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A15
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A10
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A10
COLUMN SCAN_ID HEADING 'Scan|ID' FORMAT 9999
COLUMN PARENT_SCAN_ID HEADING 'Parent|Scan ID' FORMAT 9999
COLUMN ROOT_SCAN_ID HEADING 'Root|Scan ID' FORMAT 9999
 
SELECT c.OWNER,
       c.COMPARISON_NAME,
       c.SCHEMA_NAME,
       c.OBJECT_NAME,
       s.SCAN_ID,
       s.PARENT_SCAN_ID,
       s.ROOT_SCAN_ID
  FROM DBA_COMPARISON c, DBA_COMPARISON_SCAN s
  WHERE c.OWNER           = s.OWNER AND
        c.COMPARISON_NAME = s.COMPARISON_NAME
  ORDER BY s.SCAN_ID;

出力は次のようになります。

Comparison Comparison      Schema     Object      Scan  Parent    Root
Owner      Name            Name       Name          ID Scan ID Scan ID
---------- --------------- ---------- ---------- ----- ------- -------
ADMIN      COMPARE_SUBSET_ OE         ORDERS         1               1
           COLUMNS
ADMIN      COMPARE_SUBSET_ OE         ORDERS         2       1       1
           COLUMNS
ADMIN      COMPARE_SUBSET_ OE         ORDERS         3       1       1
           COLUMNS
ADMIN      COMPARE_ORDERS  OE         ORDERS         4               4
ADMIN      COMPARE_ORDERS  OE         ORDERS         5       4       4
ADMIN      COMPARE_ORDERS  OE         ORDERS         6       4       4
ADMIN      COMPARE_RANDOM  OE         ORDERS         7               7
ADMIN      COMPARE_CYCLIC  OE         ORDERS         8               8
ADMIN      COMPARE_CYCLIC  OE         ORDERS         9       8       8
ADMIN      COMPARE_CUSTOM  OE         ORDERS        10              10
ADMIN      COMPARE_CUSTOM  OE         ORDERS        11      10      10
ADMIN      COMPARE_CUSTOM  OE         ORDERS        12      10      10

たとえば、この出力には、スキャンID 1のスキャンがCOMPARE_SUBSET_COLUMNS比較の比較結果のルート・スキャンであることが示されています。このルート・スキャンでは違いが検出され、このルート・スキャンは2つの小さいバケットに分割されています。スキャンID 2およびスキャンID 3のスキャンは、これらの小さいバケットに対するスキャンです。

特定のスキャンで違いが検出されたかどうかを確認するには、「データベース内の各スキャンに関する一般的な情報の表示」に示されている問合せを実行します。違いに対してRECHECKを実行する場合または共有データベース・オブジェクトの違いに対してCONVERGEを実行する場合は、再確認または収束するスキャンのスキャンIDを指定します。比較結果のすべての行を再確認または収束するには、比較結果のルート・スキャンIDを指定します。


関連項目:


スキャンで検出された行の違いの詳細の表示

この項の問合せでは、比較結果で検出された行の違いに関する詳細が表示されます。この項の問合せの情報を表示するには、比較を実行したCOMPAREファンクションまたはRECHECKファンクションのperform_row_difパラメータをTRUEに設定しておく必要があります。

このパラメータをFALSEに設定した場合、DBA_COMPARISON_SCANビューのSTATUS列を問い合せて、違いの詳細を表示せずに、スキャンで違いが検出されたかどうかを判別できます。詳細および問合せの例については、「データベース内の各スキャンに関する一般的な情報の表示」を参照してください。

次の問合せでは、スキャンID 8のスキャンで検出された違いの合計数が表示されます。

COLUMN OWNER HEADING 'Comparison Owner' FORMAT A16
COLUMN COMPARISON_NAME HEADING 'Comparison Name' FORMAT A25
COLUMN SCHEMA_NAME HEADING 'Schema Name' FORMAT A11
COLUMN OBJECT_NAME HEADING 'Object Name' FORMAT A11
COLUMN CURRENT_DIF_COUNT HEADING 'Differences' FORMAT 9999999

SELECT c.OWNER, 
       c.COMPARISON_NAME, 
       c.SCHEMA_NAME, 
       c.OBJECT_NAME, 
       s.CURRENT_DIF_COUNT 
  FROM DBA_COMPARISON c, DBA_COMPARISON_SCAN s
  WHERE c.COMPARISON_NAME = s.COMPARISON_NAME AND
        c.OWNER           = s.OWNER AND
        s.SCAN_ID         = 8;

出力は次のようになります。

Comparison Owner Comparison Name           Schema Name Object Name Differences
---------------- ------------------------- ----------- ----------- -----------
ADMIN            COMPARE_CYCLIC            OE          ORDERS                6

COMPARE_CYCLIC比較の比較結果のスキャンID 8のスキャンで検出された各行の違いに関する詳細を表示するには、次の問合せを実行します。

COLUMN COLUMN_NAME HEADING 'Index Column' FORMAT A15
COLUMN INDEX_VALUE HEADING 'Index Value' FORMAT A15
COLUMN LOCAL_ROWID HEADING 'Local Row Exists?' FORMAT A20
COLUMN REMOTE_ROWID HEADING 'Remote Row Exists?' FORMAT A20

SELECT c.COLUMN_NAME,
       r.INDEX_VALUE, 
       DECODE(r.LOCAL_ROWID,
                NULL, 'No',
                      'Yes') LOCAL_ROWID,
       DECODE(r.REMOTE_ROWID,
                NULL, 'No',
                      'Yes') REMOTE_ROWID
  FROM DBA_COMPARISON_COLUMNS c,
       DBA_COMPARISON_ROW_DIF r,
       DBA_COMPARISON_SCAN s
  WHERE c.COMPARISON_NAME = 'COMPARE_CYCLIC' AND
        r.SCAN_ID         = s.SCAN_ID AND
        s.PARENT_SCAN_ID  = 8 AND
        r.STATUS          = 'DIF' AND
        c.INDEX_COLUMN    = 'Y' AND
        c.COMPARISON_NAME = r.COMPARISON_NAME AND
        c.OWNER           = r.OWNER
  ORDER BY r.INDEX_VALUE;

出力は次のようになります。

Index Column    Index Value     Local Row Exists?    Remote Row Exists?
--------------- --------------- -------------------- --------------------
ORDER_ID        2366            Yes                  No
ORDER_ID        2385            Yes                  No
ORDER_ID        2396            Yes                  No
ORDER_ID        2425            Yes                  No
ORDER_ID        2440            Yes                  Yes
ORDER_ID        2450            Yes                  No

この出力には、比較する表の索引列と、共有データベース・オブジェクトで異なるそれぞれの行の索引値が示されています。この例では、索引列はoe.orders表の主キー列(order_id)です。また、出力には、各行の違いのタイプも示されています。

  • 行に対するLocal Row Exists?Remote Row Exists?の両方がYesの場合、その行はデータベース・オブジェクトの両方のインスタンスに存在しますが、行に含まれるデータは異なります。

  • 行に対するLocal Row Exists?YesRemote Row Exists?Noの場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。

  • 行に対するLocal Row Exists?NoRemote Row Exists?Yesの場合、その行はリモート・データベース・オブジェクトには存在しますが、ローカル・データベース・オブジェクトには存在しません。

特定のスキャンで比較された行に関する情報の表示

各スキャンでは、共有データベース・オブジェクトの一定範囲の行が比較されます。この項の問合せでは、データベースの各スキャンで比較された行に関する次の情報が表示されます。

  • スキャンが実行された比較の所有者。

  • スキャンが実行された比較の名前。

  • 問合せで表示された行の値の列位置。

  • スキャンによって比較された行の範囲の最小値。

  • スキャンによって比較された行の範囲の最大値。

スキャンでは、データベース・オブジェクト内の最小値の行、最大値の行および最小値と最大値の間のすべての行が比較されます。問合せによって戻された各行に最小値および最大値として表示された値は、表示された列位置にある列の値です。列位置は、比較用の索引列です。

これらの情報を表示するには、次の問合せを実行します。

COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A22
COLUMN SCAN_ID HEADING 'Scan|ID' FORMAT 9999
COLUMN COLUMN_POSITION HEADING 'Column|Position' FORMAT 999
COLUMN MIN_VALUE HEADING 'Minimum|Value' FORMAT A15
COLUMN MAX_VALUE HEADING 'Maximum|Value' FORMAT A15
 
SELECT OWNER,
       COMPARISON_NAME,
       SCAN_ID,
       COLUMN_POSITION,
       MIN_VALUE,
       MAX_VALUE
  FROM DBA_COMPARISON_SCAN_VALUES
  ORDER BY SCAN_ID;

出力は次のようになります。

Comparison Comparison              Scan   Column Minimum         Maximum
Owner      Name                      ID Position Value           Value
---------- ---------------------- ----- -------- --------------- ---------------
ADMIN      COMPARE_SUBSET_COLUMNS     1        1 2354            3000
ADMIN      COMPARE_SUBSET_COLUMNS     2        1 2354            2458
ADMIN      COMPARE_SUBSET_COLUMNS     3        1 3000            3000
ADMIN      COMPARE_ORDERS             4        1 2354            3000
ADMIN      COMPARE_ORDERS             5        1 2354            2458
ADMIN      COMPARE_ORDERS             6        1 3000            3000
ADMIN      COMPARE_RANDOM             7        1 2617.3400241505 2940.3400241505
                                                 667163579712423 667163579712423
                                                 44590999096     44590999096
ADMIN      COMPARE_CYCLIC             8        1 2354            2677
ADMIN      COMPARE_CYCLIC             9        1 2354            2458
ADMIN      COMPARE_CUSTOM            10        1 2430            2460
ADMIN      COMPARE_CUSTOM            11        1 2430            2445
ADMIN      COMPARE_CUSTOM            12        1 2446            2458

この出力には、各スキャンで比較された行が示されています。一部の比較ではスキャンが小さいバケットに分割されており、問合せによって、それぞれの小さいバケットで比較された行が表示されます。

たとえば、COMPARE_CUSTOM比較の比較結果の出力について考えてみます。

  • 比較結果の各スキャンによって、列位置1が表示されます。スキャンの列位置1にある列を判別するには、「データベース内の各比較によって比較された列の表示」に示されている問合せを実行します。この例では、COMPARE_CUSTOM比較の列位置1にある列は、oe.orders表のorder_id列です。

  • スキャンID 10はルート・スキャンです。このスキャンでは、違いが検出され、スキャンID 11およびスキャンID 12で表される2つのバケットに行が分割されています。

  • スキャンID 11では、order_id2430の行からorder_id2445の行までが比較されています。

  • スキャンID 12では、order_id2446の行からorder_id2458の行までが比較されています。

スキャンで検出された違いを再確認または収束するには、それぞれRECHECKファンクションまたはCONVERGEプロシージャを実行できます。再確認または収束するスキャンのスキャンIDを指定します。比較結果のすべての行を再確認または収束するには、比較結果のルート・スキャンIDを指定します。


関連項目:


共有データベース・オブジェクトの収束

DBMS_COMPARISONパッケージのCONVERGEプロシージャは、データベース・オブジェクトの、指定した比較スキャンで比較された部分を同期化し、その変更に関する情報を戻します。CONVERGEプロシージャは、指定したスキャンで識別された違いのみを収束します。スキャンでは、表の行または列のサブセットの違いのみが識別され、指定したスキャンの完了後に違いが発生する場合があります。この場合、CONVERGEプロシージャによって、共有データベース・オブジェクトの一貫性が完全には保持されない可能性があります。

スキャンで最新の違いを処理するために、通常は、収束する比較スキャンの実行後できるかぎりすぐにCONVERGEプロシージャを実行することをお薦めします。また、いずれのデータベースでも更新されていない行のみを収束する必要があります。たとえば、共有データベース・オブジェクトがレプリケーション・コンポーネントによって更新されている場合は、レプリケーションによる変更が適用済の行のみを収束し、これらの行で新しい変更がレプリケート中でないことを確認します。


注意:

2つのデータベースで共有データベース・オブジェクトの行が異なることがスキャンで識別され、スキャン後にその行が変更された場合、CONVERGEプロシージャの実行後に、予期しないデータが行に含まれる可能性があります。

この項の例は、次のとおりです。

これらの例では、「行の違いを識別しない共有データベース・オブジェクトの比較」で生成される比較結果を収束します。その比較結果の例では、比較名はcompare_orders、戻されるスキャンIDは4です。この例を完了済の場合は、システムに戻されるスキャンIDが異なることがあります。スキャンIDを判別するには、次の問合せを実行します。

SELECT DISTINCT ROOT_SCAN_ID FROM DBA_COMPARISON_SCAN 
  WHERE COMPARISON_NAME = 'COMPARE_ORDERS';

複数の値が戻される場合、比較は複数回実行されています。この場合、戻された最大のスキャンIDを使用します。

比較結果のすべての行を収束する場合は、比較結果のルート・スキャンIDを指定します。ただし、比較結果の一部の行を収束する場合は、収束する違いが存在するスキャンのスキャンIDを指定できます。


関連項目:


ローカル・オブジェクトとの一貫性を保持するための共有データベース・オブジェクトの収束

CONVERGEプロシージャのconverge_optionsパラメータは、収束時に優先するデータベースを決定します。ローカル・データベースを優先するように指定するには、converge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINSに設定します。ローカル・データベースを優先するように指定した場合、指定した比較スキャンで検出されたそれぞれの違いに対して、リモート・データベースのデータベース・オブジェクトのデータがローカル・データベースのデータベース・オブジェクトのデータに置き換えられます。

両方のデータベース・オブジェクトがローカル・データベースと一貫性を持つようにcompare_orders比較のスキャンを収束するには、次の手順を実行します。

  1. 比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  2. CONVERGEプロシージャを実行します。

    SET SERVEROUTPUT ON
    DECLARE
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      DBMS_COMPARISON.CONVERGE(
        comparison_name  => 'compare_orders',
        scan_id          => 4, -- Substitute the scan ID from your scan.
        scan_info        => scan_info,
        converge_options => DBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINS);
    DBMS_OUTPUT.PUT_LINE('Local Rows Merged: '||scan_info.loc_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Merged: '||scan_info.rmt_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Local Rows Deleted: '||scan_info.loc_rows_deleted);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Deleted: '||scan_info.rmt_rows_deleted);
    END;
    /
    

    出力は次のようになります。

    Local Rows Merged: 0
    Remote Rows Merged: 6
    Local Rows Deleted: 0
    Remote Rows Deleted: 1
     
    PL/SQL procedure successfully completed.
    

リモート・オブジェクトとの一貫性を保持するための共有データベース・オブジェクトの収束

CONVERGEプロシージャのconverge_optionsパラメータは、収束時に優先するデータベースを決定します。リモート・データベースを優先するように指定するには、converge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_REMOTE_WINSに設定します。リモート・データベースを優先するように指定した場合、指定した比較スキャンで検出されたそれぞれの違いに対して、ローカル・データベースのデータベース・オブジェクトのデータがリモート・データベースのデータベース・オブジェクトのデータに置き換えられます。

両方のデータベース・オブジェクトがリモート・データベースと一貫性を持つようにcompare_orders比較のスキャンを収束するには、次の手順を実行します。

  1. 比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  2. CONVERGEプロシージャを実行します。

    SET SERVEROUTPUT ON
    DECLARE
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      DBMS_COMPARISON.CONVERGE(
        comparison_name  => 'compare_orders',
        scan_id          => 4, -- Substitute the scan ID from your scan.
        scan_info        => scan_info,
        converge_options => DBMS_COMPARISON.CMP_CONVERGE_REMOTE_WINS);
    DBMS_OUTPUT.PUT_LINE('Local Rows Merged: '||scan_info.loc_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Merged: '||scan_info.rmt_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Local Rows Deleted: '||scan_info.loc_rows_deleted);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Deleted: '||scan_info.rmt_rows_deleted);
    END;
    /
    

    出力は次のようになります。

    Local Rows Merged: 2
    Remote Rows Merged: 0
    Local Rows Deleted: 5
    Remote Rows Deleted: 0
    
    PL/SQL procedure successfully completed.
    

セッション・タグ・セットによる共有データベース・オブジェクトの収束

収束する共有データベース・オブジェクトがOracle Streamsレプリケーション環境に含まれている場合は、CONVERGEプロシージャによって行われた変更がレプリケートされないようにセッション・タグを設定できます。通常は、変更の循環(変更元のデータベースにその変更が再送信されること)を回避するために、CONVERGEプロシージャによって行われた変更はレプリケートしないようにする必要があります。Oracle Streamsレプリケーション環境では、セッション・タグを使用して、CONVERGEプロシージャによって行われた変更がOracle Streamsの取得プロセスまたは同期取得によって取得されず、レプリケートされないように設定できます。

CONVERGEプロシージャを実行しているセッションでセッション・タグを設定するには、次のプロシージャ・パラメータを使用します。

  • local_converge_tagパラメータ: ローカル・データベースのセッション・タグを設定します。このパラメータには、リモート・データベースを優先し、CONVERGEプロシージャによってローカル・データベースに対して変更が行われる場合にレプリケーションを防止する値を設定します。

  • remote_converge_tagパラメータ: リモート・データベースのセッション・タグを設定します。このパラメータには、ローカル・データベースを優先し、CONVERGEプロシージャによってリモート・データベースに対して変更が行われる場合にレプリケーションを防止する値を設定します。

セッション・タグの適切な値は、Oracle Streamsレプリケーション環境に応じて異なります。このタグには、セッションによって行われた変更が取得プロセスおよび同期取得によって取得されることを防止する値を設定します。

この項の例では、converge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINSに設定して、収束操作でローカル・データベースが優先されるように指定します。したがって、この例では、remote_converge_tagパラメータが'11'と等価の16進値に設定されます。セッション・タグは、CONVERGEプロシージャによってリモート・データベースに対して行われた変更がレプリケートされることを防止する任意の非NULL値に設定できます。

データベース・オブジェクトがローカル・データベースと一貫性を持ち、リモート・データベースでセッション・タグが設定されるようにcompare_orders比較のスキャンを収束するには、次の手順を実行します。

  1. 比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。

    SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。

  2. CONVERGEプロシージャを実行します。

    SET SERVEROUTPUT ON
    DECLARE
      scan_info    DBMS_COMPARISON.COMPARISON_TYPE;
    BEGIN
      DBMS_COMPARISON.CONVERGE(
        comparison_name     => 'compare_orders',
        scan_id             => 4, -- Substitute the scan ID from your scan.
        scan_info           => scan_info,
        converge_options    => DBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINS,
        remote_converge_tag => HEXTORAW('11'));
    DBMS_OUTPUT.PUT_LINE('Local Rows Merged: '||scan_info.loc_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Merged: '||scan_info.rmt_rows_merged);
    DBMS_OUTPUT.PUT_LINE('Local Rows Deleted: '||scan_info.loc_rows_deleted);
    DBMS_OUTPUT.PUT_LINE('Remote Rows Deleted: '||scan_info.rmt_rows_deleted);
    END;
    /
    

    出力は次のようになります。

    Local Rows Merged: 0
    Remote Rows Merged: 6
    Local Rows Deleted: 0
    Remote Rows Deleted: 1
    
    PL/SQL procedure successfully completed.
    

注意:

CREATE_COMPARISONプロシージャで、ローカルおよびリモートの収束タグ値を設定することもできます。CONVERGEプロシージャのタグ・パラメータが非NULLの場合、このパラメータは、CREATE_COMPARISONプロシージャの対応するタグ・パラメータより優先されます。CONVERGEプロシージャのタグ・パラメータがNULLの場合、このパラメータは無視され、CREATE_COMPARISONプロシージャの対応するタグの値が使用されます。

比較の比較結果の再確認

DBMS_COMPARISONパッケージのRECHECKファンクションを使用すると、前回の比較スキャンを再確認できます。RECHECKファンクションは、指定した比較スキャンに記録された違いを、データベース・オブジェクトの現行のデータで確認します。

たとえば、compare_orders比較のスキャンID 4の結果を再確認するには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。

SET SERVEROUTPUT ON
DECLARE
  consistent   BOOLEAN;
BEGIN
  consistent := DBMS_COMPARISON.RECHECK(
                  comparison_name => 'compare_orders',
                  scan_id         => 4);
  IF consistent=TRUE THEN
    DBMS_OUTPUT.PUT_LINE('No differences were found.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Differences were found.');
  END IF;
END;
/

出力は次のようになります。

Differences were found.

PL/SQL procedure successfully completed.

このファンクションは、違いが検出されなかった場合はTRUE、違いが検出された場合はFALSEを戻します。compare_orders比較は、「行の違いを識別しない共有データベース・オブジェクトの比較」で作成されます。


注意:

  • RECHECKファンクションは、共有データベース・オブジェクトで、指定した比較スキャンに記録されていない違いは比較しません。このような違いを確認するには、COMPAREファンクションを実行します。

  • 指定した比較スキャンが正常に完了していない場合、RECHECKファンクションは、前回の比較スキャンが終了した箇所から開始されます。



関連項目:

COMPAREファンクションの詳細は、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください。

比較結果のパージ

DBMS_COMPARISONパッケージのPURGE_COMPARISONプロシージャを使用すると、不要になった1つ以上の比較の比較結果をパージできます。比較のすべての比較結果または比較結果のサブセットのいずれかをパージできます。比較結果をパージすると、比較の再確認または拡散したデータの収束に使用できなくなります。また、比較結果に関する情報が、データ・ディクショナリ・ビューから削除されます。

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

比較のすべての比較結果のパージ

比較のすべての比較結果をパージするには、comparison_nameパラメータに比較名、scan_idおよびpurge_timeパラメータにデフォルト値のNULLを指定します。

たとえば、compare_orders比較のすべての比較結果をパージするには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。

BEGIN
  DBMS_COMPARISON.PURGE_COMPARISON(
    comparison_name => 'compare_orders',
    scan_id         => NULL,
    purge_time      => NULL);
END;
/

比較の特定のスキャンIDの比較結果のパージ

比較の特定のスキャンの比較結果をパージするには、comparison_nameパラメータに比較名、scan_idパラメータにスキャンIDを指定します。指定するスキャンIDは、ルート・スキャンである必要があります。比較結果のルート・スキャンは、最も高いレベルの親スキャンです。ルート・スキャンには親は存在しません。ルート・スキャンIDを確認するには、DBA_COMPARISON_SCANデータ・ディクショナリ・ビューのROOT_SCAN_ID列を問い合せます。

PURGE_COMPARISONプロシージャを実行し、ルート・スキャンを指定すると、そのルート・スキャンはパージされます。また、指定したルート・スキャンのすべての直接的および間接的な子スキャンがパージされます。他のスキャンの結果はパージされません。

たとえば、compare_orders比較のスキャンID 4の比較結果をパージするには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。

BEGIN
  DBMS_COMPARISON.PURGE_COMPARISON(
    comparison_name => 'compare_orders',
    scan_id         => 4); -- Substitute the scan ID from your scan.
END;
/

関連項目:


指定した時間より前の比較の比較結果のパージ

比較で特定の日時またはそれより前に記録された比較結果をパージするには、comparison_nameパラメータに比較名、purge_timeパラメータに日時を指定します。結果は、スキャンIDに関係なくパージされます。指定した日時より後に記録された比較結果は保持されます。

たとえば、現行セッションのNLS_TIMESTAMP_FORMAT初期化パラメータの設定がYYYY-MM-DD HH24:MI:SSであるとします。compare_orders比較で2006年8月16日午後1時より前に記録されたすべてのスキャンの結果をパージするには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。

BEGIN
  DBMS_COMPARISON.PURGE_COMPARISON(
    comparison_name => 'compare_orders',
    purge_time      => '2006-08-16 13:00:00');
END;
/

比較の削除

比較およびそのすべての比較結果を削除するには、DBMS_COMPARISONパッケージのDROP_COMPARISONプロシージャを使用します。たとえば、compare_subset_columns比較を削除するには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。

exec DBMS_COMPARISON.DROP_COMPARISON('compare_subset_columns');

Oracle Streamsレプリケーション環境でのDBMS_COMPARISONの使用

この項では、Oracle Streamsレプリケーション環境でのDBMS_COMPARISONパッケージの一般的な使用方法について説明します。次の使用方法があります。

インスタンス化の後の一貫性の確認

インスタンス化の後、DBMS_COMPARISONパッケージを使用して、インスタンス化されたデータベース・オブジェクトの一貫性を検証できます。通常、Oracle Streamsレプリケーション環境で変更がレプリケートされる前に一貫性を検証する必要があります。ソース・データベース・オブジェクトおよびインスタンス化されたデータベース・オブジェクトに対する変更を許可する前に、一貫性を確認してください。これらのデータベース・オブジェクトに対する変更は、DBMS_COMPARISONパッケージによって違いとして識別されます。

インスタンス化されたデータベース・オブジェクトの一貫性を検証するには、次の手順を実行します。

  1. CREATE_COMPARISONプロシージャを使用して、インスタンス化された各データベース・オブジェクトに対して比較を作成します。各比較に対して、インスタンス化されたデータベース・オブジェクトおよびソース・データベースの対応するデータベース・オブジェクトを指定する必要があります。

    CREATE_COMPARISONプロシージャを実行する場合は、comparison_modescan_modeおよびscan_percentパラメータが、それぞれデフォルト値のCMP_COMPARE_MODE_OBJECTCMP_SCAN_MODE_FULLおよびNULLに設定されていることを確認します。

  2. COMPAREファンクションを実行して、インスタンス化された各データベース・オブジェクトを比較します。違いが検出されなかった場合、データベース・オブジェクトで一貫性が保持されています。

    COMPAREファンクションを実行する場合、min_valuemax_valueおよびperform_row_difパラメータが、それぞれデフォルト値のNULLNULLおよびFALSEに設定されていることを確認します。

  3. COMPAREファンクションで違いが検出された場合は、データベース・オブジェクトを再インスタンス化するか、またはCONVERGEプロシージャを使用してデータベース・オブジェクトを収束することができます。CONVERGEプロシージャを使用する場合は、通常、収束時にソース・データベース・オブジェクトを優先する必要があります。

  4. データベース・オブジェクトで一貫性が保持されていることが比較結果に示されている場合は、PURGE_COMPARISONプロシージャを使用して比較結果をパージできます。


関連項目:


稼働中のOracle Streamsレプリケーション環境での一貫性の確認

Oracle Streamsレプリケーション環境では、データベース・オブジェクトに対する変更が常にレプリケートされます。したがって、レプリケートされたデータベース・オブジェクトに次の内容が適用されます。

  • レプリケートされたデータベースは、ほとんどの場合、ほぼ同期化されています。Oracle Streamsコンポーネントによって変更がレプリケートおよび適用され、レプリケートされたデータベース・オブジェクトの同期状態が保持されるためです。

  • レプリケートされたデータベース・オブジェクトに違いが存在する場合は、通常、短期間のうちにOracle Streamsコンポーネントによって変更が送信および適用され、データベース・オブジェクトが同期化されます。したがって、COMPAREファンクションでは、レプリケート中の違いが示される場合があります。

変更のレプリケート中にデータベース・オブジェクトに違いが存在することが予測されるため、レプリケートされたデータベース・オブジェクトの比較にDBMS_COMPARISONパッケージを使用することが難しくなる場合があります。たとえば、2つのデータベースで表全体を比較する既存の比較が存在するとし、次の状況について考えてみます。

  1. いずれかのデータベースで表の行が変更されます。

  2. この変更がOracle Streamsの取得プロセスによって取得されます。ただし、この変更は他方のデータベースには伝播されていません。

  3. COMPAREファンクションが実行され、2つのデータベースで表が比較されます。

  4. COMPAREファンクションによって、手順 1で変更された行の違いが識別されます。

  5. 変更が伝播され、宛先データベースで適用されます。したがって、手順4で識別された違いは存在しなくなります。

検出された違いが一時的であると考えられる場合は、一定時間が経過した後にRECHECKファンクションを実行できます。Oracle Streamsによってデータベース・オブジェクトが同期化されている場合、違いは検出されません。

レプリケートされたデータベース・オブジェクトで一部の行が継続的に更新される場合、それらの行の違いが常に比較結果に示される可能性があります。この場合は、環境を監視する際に、次のことを確認します。

  • 宛先データベースで、それらの行に対して適用エラーが蓄積されていないこと。

  • 宛先データベースで、それらの行がOracle Streamsの適用プロセスによって正しく更新されていること。宛先データベースでそれらの行が含まれている表を問い合せて、レプリケートされた変更が適用されていることを確認できます。

行がこれら両方の条件に該当する場合、比較結果でその行の違いを無視することができます。

COMPAREファンクションでは、レプリケート中の違いが示される場合があるため、このファンクションは、使用している環境のレプリケーション・アクティビティが最も少ない時間帯に実行することをお薦めします。レプリケーション・アクティビティが比較的少ない時間帯の比較結果には、Oracle Streamsレプリケーション環境で次のような違いが示されます。

  • 管理者またはプロシージャが一方のデータベースでのみ行を手動で操作する場合に発生する違い。たとえば、管理者またはプロシージャが変更を行う前にセッション・タグを設定し、このセッション・タグによって取得プロセスで変更を取得できなくなる場合があります。

  • 一方のデータベースでデータが失われ、別のデータベースでデータを確認してリカバリする必要がある場合に発生する違い。

  • 適用エラーによって発生する違い。この場合は、適用エラーのため、一方のデータベースでエラー・トランザクションが適用されません。

いずれの場合も、必要に応じて、CONVERGEプロシージャを実行してデータベース・オブジェクトを同期化できます。たとえば、適用エラーが存在し、エラー・トランザクションを簡単に再実行できない場合、CONVERGEプロシージャを使用してデータベース・オブジェクトを同期化できます。


関連項目: