この章では、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パラメータで指定されている値を超える場合があります。 |
|
関連項目:
|
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には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用されるそれぞれのバケットに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示しています。
max_num_bucketsパラメータが3に設定されているため、次の手順で比較が実行されます。
この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用され、各バケットで違いが検出されます。
前述の手順のルート・スキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では3回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計9つのバケットが使用されます。各バケットで違いが検出されます。図13-1では、矢印によって、この手順の各スキャンのためにルート・スキャンの各バケットが3つのバケットに分割される状況が示されています。
手順2のスキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では9回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計27個のバケットが使用されます。図13-1では、矢印によって、この手順の各スキャンのために手順2の各バケットが3つのバケットに分割される状況が示されています。
手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。
図13-2に、2つ目の例を示します。
図13-2 max_num_buckets=3が設定された比較および各スキャンの1つのバケットでの違い

図13-2には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用される1つのバケットのみに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示します。
max_num_bucketsパラメータが3に設定されているため、次の手順で比較が実行されます。
この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用されますが、1つのバケットのみで違いが検出されます。
違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。1つのバケットのみで違いが検出されます。図13-2では、矢印によって、この手順のスキャンのためにルート・スキャンで違いが検出されたバケットが3つのバケットに分割される状況が示されています。
手順2で違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。図13-2では、矢印によって、この手順のスキャンのために手順2で違いが検出されたバケットが3つのバケットに分割される状況が示されています。
手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。
|
注意: この項の例では、CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータは3に設定されています。この設定は、スキャンおよびバケットで違いが識別される方法を示すことを目的としています。通常、max_num_bucketsパラメータは、より高い値に設定されます。このパラメータのデフォルト値は1000です。このパラメータの設定を調整して、最高のパフォーマンスを実現できます。 |
この章で説明するタスクを実行する前に、次のマニュアルを参照してください。
次に示す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.comのadminユーザーに接続するデータベース・リンクを作成します。
SQL*Plusで、adminユーザーとしてローカル・データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
データベース・リンクを作成します。
CREATE DATABASE LINK comp2.example.com CONNECT TO admin
IDENTIFIED BY password USING 'comp2.example.com';
次の項では、2つのデータベースの共有データベース・オブジェクトを比較および収束する例を示します。
これらの例のほとんどでは、oe.orders表のデータを比較および収束します。この表は、oeサンプル・スキーマに含まれ、デフォルトでOracle Databaseとともにインストールされます。これらの例では、データベースのグローバル名はcomp1.example.comおよびcomp2.example.comですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。
これらの例のために、次の手順を実行してoe.orders表を2つのデータベースで拡散させます。
SQL*Plusで、oeユーザーとしてcomp2.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
customer_idが147の注文をoe.orders表から削除します。
DELETE FROM oe.orders WHERE customer_id=147;
oe.orders表で行のデータを変更します。
UPDATE oe.orders SET sales_rep_id=163 WHERE order_id=2440;
oe.orders表に行を挿入します。
INSERT INTO oe.orders VALUES(3000, TIMESTAMP '2006-01-01 2:00:00', 'direct', 107, 3, 16285.21, 156, NULL);
変更をコミットしてSQL*Plusを終了します。
COMMIT; EXIT
|
注意: 通常、これらの手順は必要ありません。これらの手順は、2つのデータベースでoe.orders表を確実に拡散させるために記載されています。 |
この項の例では、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_id、order_dateおよびcustomer_id列を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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プロシージャを実行するユーザーによって所有されます。
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表全体を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
CREATE_COMPARISONプロシージャを実行して、比較を作成します。
BEGIN
DBMS_COMPARISON.CREATE_COMPARISON(
comparison_name => 'compare_orders',
schema_name => 'oe',
object_name => 'orders',
dblink_name => 'comp2.example.com');
END;
/
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表の一部をランダムに比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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に設定されています。
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表を循環比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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に設定されています。
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.
この比較のスキャンでは、比較される表の部分に応じて、違いが検出される場合と検出されない場合があります。
データベース・オブジェクトで前回の比較が終了した箇所の次の部分を比較するために、手順4で実行したCOMPAREファンクションを再実行します。この例では、手順3でscan_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表のカスタム部分を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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索引を指定しています。
次の問合せを実行して、手順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が表示されます。
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.
DBMS_COMPARISONパッケージでは、CLOBまたはBLOBデータ型の列を含む共有データベース・オブジェクトの比較を直接サポートしていません。ただし、次の基本的な手順を完了することで、CLOBまたはBLOB列を含む表を比較できます。
各データベースで、表に基づくビューを作成し、CLOBまたはBLOB列を、DBMS_CRYPTO.HASHファンクションを使用して生成したRAWデータ型列に置き換えます。
手順1で作成したビューを比較します。
例では、NUMBER例およびCLOB列を含む単純な表に対してこれらの手順を実行する方法を示します。この例では、データベースのグローバル名はcomp1.example.comおよびcomp2.example.comですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。
|
注意: DBMS_COMPARISONパッケージでは、LOB列を含む共有データベース・オブジェクトを収束できません。 |
手順は次のとおりです。
「共有データベース・オブジェクトの比較および収束の準備」で説明されているタスクを実行します。
comp1.example.comデータベースで、CLOBまたはBLOB列を含む表を所有しているユーザーまたは所有する予定のユーザーが、DBMS_CRYPTOパッケージのEXECUTE権限を持っていることを確認します。
この例では、表を所有する予定のユーザーはoeであると想定しています。次の手順を完了して、この権限をoeユーザーに付与します。
権限を付与できる管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
DBMS_CRYPTOパッケージのEXECUTEをユーザーに付与します。
GRANT EXECUTE ON DBMS_CRYPTO TO oe;
comp2.example.comデータベースで、CLOBまたはBLOB列を含む表を所有しているユーザーまたは所有する予定のユーザーが、DBMS_CRYPTOパッケージのEXECUTE権限を持っていることを確認します。
この例では、表を所有する予定のユーザーはoeであると想定しています。次の手順を完了して、この権限をoeユーザーに付与します。
権限を付与できる管理ユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。
DBMS_CRYPTOパッケージのEXECUTEをユーザーに付与します。
GRANT EXECUTE ON DBMS_CRYPTO TO oe;
comp1.example.comデータベースでCLOB列を含む表およびこの表に基づいたビューを作成します。
表を所有する予定のユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
次のように表を作成します。
CREATE TABLE oe.tab_lob(
c1 NUMBER PRIMARY KEY,
c2 CLOB DEFAULT to_clob('c2'));
tab_lob表に行を挿入して、変更をコミットします。
INSERT INTO oe.tab_lob VALUES(1, TO_CLOB('row 1'));COMMIT;
次のようにビューを作成します。
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パッケージおよびタイプ・リファレンス』を参照してください。 |
comp2.example.comデータベースでCLOB列を含む表およびこの表に基づいたビューを作成します。
表を所有する予定のユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
次のように表を作成します。
CREATE TABLE oe.tab_lob(
c1 NUMBER PRIMARY KEY,
c2 CLOB DEFAULT to_clob('c2'));
tab_lob表に行を挿入して、変更をコミットします。
INSERT INTO oe.tab_lob VALUES(1, TO_CLOB('row 1'));COMMIT;
次のようにビューを作成します。
BEGIN
EXECUTE IMMEDIATE 'CREATE VIEW view_lob AS SELECT
c1,
DBMS_CRYPTO.HASH(c2, '||DBMS_CRYPTO.HASH_SH1||') c2_hash
FROM tab_lob';
END;
/
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
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列を含む表は指定しないことに注意してください。
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.
次の手順を実行してoe.tab_lob表を2つのデータベースで拡散させます。
表を所有するユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
行を挿入して、変更をコミットします。
INSERT INTO oe.tab_lob VALUES(2, TO_CLOB('row a'));
COMMIT;
表を所有するユーザーとして、SQL*Plusからcomp2.example.comデータベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
行を挿入して、変更をコミットします。
INSERT INTO oe.tab_lob VALUES(2, TO_CLOB('row b'));
COMMIT;
再び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_NAME、REMOTE_OBJECT_NAMEおよびREMOTE_OBJECT_TYPE列を問い合せると、この情報を表示できます。
スキャン・モード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 DIF、FINAL BUCKET DIFまたはROW DIFの場合、CONVERGEプロシージャを実行してスキャンIDを指定すると、スキャンで検出された違いを収束できます。ただし、特定のスキャンで確認された部分ではなく、比較結果のすべての行を収束するには、CONVERGEプロシージャの実行時に比較結果のルート・スキャンIDを指定します。
また、違いが検出されたことがスキャンで示された場合は、RECHECKファンクションを使用してスキャンを再確認できます。比較結果のすべての行を再確認するには、RECHECKファンクションを実行して、比較結果のルート・スキャン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?がYesでRemote Row Exists?がNoの場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。
行に対するLocal Row Exists?がNoでRemote 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_idが2430の行からorder_idが2445の行までが比較されています。
スキャンID 12では、order_idが2446の行からorder_idが2458の行までが比較されています。
スキャンで検出された違いを再確認または収束するには、それぞれ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比較のスキャンを収束するには、次の手順を実行します。
比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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比較のスキャンを収束するには、次の手順を実行します。
比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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比較のスキャンを収束するには、次の手順を実行します。
比較を所有する管理ユーザーとして、SQL*Plusからcomp1.example.comデータベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
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比較は、「行の違いを識別しない共有データベース・オブジェクトの比較」で作成されます。
|
注意:
|
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;
/
比較の特定のスキャンの比較結果をパージするには、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パッケージの一般的な使用方法について説明します。次の使用方法があります。
インスタンス化の後、DBMS_COMPARISONパッケージを使用して、インスタンス化されたデータベース・オブジェクトの一貫性を検証できます。通常、Oracle Streamsレプリケーション環境で変更がレプリケートされる前に一貫性を検証する必要があります。ソース・データベース・オブジェクトおよびインスタンス化されたデータベース・オブジェクトに対する変更を許可する前に、一貫性を確認してください。これらのデータベース・オブジェクトに対する変更は、DBMS_COMPARISONパッケージによって違いとして識別されます。
インスタンス化されたデータベース・オブジェクトの一貫性を検証するには、次の手順を実行します。
CREATE_COMPARISONプロシージャを使用して、インスタンス化された各データベース・オブジェクトに対して比較を作成します。各比較に対して、インスタンス化されたデータベース・オブジェクトおよびソース・データベースの対応するデータベース・オブジェクトを指定する必要があります。
CREATE_COMPARISONプロシージャを実行する場合は、comparison_mode、scan_modeおよびscan_percentパラメータが、それぞれデフォルト値のCMP_COMPARE_MODE_OBJECT、CMP_SCAN_MODE_FULLおよびNULLに設定されていることを確認します。
COMPAREファンクションを実行して、インスタンス化された各データベース・オブジェクトを比較します。違いが検出されなかった場合、データベース・オブジェクトで一貫性が保持されています。
COMPAREファンクションを実行する場合、min_value、max_valueおよびperform_row_difパラメータが、それぞれデフォルト値のNULL、NULLおよびFALSEに設定されていることを確認します。
COMPAREファンクションで違いが検出された場合は、データベース・オブジェクトを再インスタンス化するか、またはCONVERGEプロシージャを使用してデータベース・オブジェクトを収束することができます。CONVERGEプロシージャを使用する場合は、通常、収束時にソース・データベース・オブジェクトを優先する必要があります。
データベース・オブジェクトで一貫性が保持されていることが比較結果に示されている場合は、PURGE_COMPARISONプロシージャを使用して比較結果をパージできます。
|
関連項目:
|
Oracle Streamsレプリケーション環境では、データベース・オブジェクトに対する変更が常にレプリケートされます。したがって、レプリケートされたデータベース・オブジェクトに次の内容が適用されます。
レプリケートされたデータベースは、ほとんどの場合、ほぼ同期化されています。Oracle Streamsコンポーネントによって変更がレプリケートおよび適用され、レプリケートされたデータベース・オブジェクトの同期状態が保持されるためです。
レプリケートされたデータベース・オブジェクトに違いが存在する場合は、通常、短期間のうちにOracle Streamsコンポーネントによって変更が送信および適用され、データベース・オブジェクトが同期化されます。したがって、COMPAREファンクションでは、レプリケート中の違いが示される場合があります。
変更のレプリケート中にデータベース・オブジェクトに違いが存在することが予測されるため、レプリケートされたデータベース・オブジェクトの比較にDBMS_COMPARISONパッケージを使用することが難しくなる場合があります。たとえば、2つのデータベースで表全体を比較する既存の比較が存在するとし、次の状況について考えてみます。
いずれかのデータベースで表の行が変更されます。
この変更がOracle Streamsの取得プロセスによって取得されます。ただし、この変更は他方のデータベースには伝播されていません。
COMPAREファンクションが実行され、2つのデータベースで表が比較されます。
COMPAREファンクションによって、手順 1で変更された行の違いが識別されます。
変更が伝播され、宛先データベースで適用されます。したがって、手順4で識別された違いは存在しなくなります。
検出された違いが一時的であると考えられる場合は、一定時間が経過した後にRECHECKファンクションを実行できます。Oracle Streamsによってデータベース・オブジェクトが同期化されている場合、違いは検出されません。
レプリケートされたデータベース・オブジェクトで一部の行が継続的に更新される場合、それらの行の違いが常に比較結果に示される可能性があります。この場合は、環境を監視する際に、次のことを確認します。
宛先データベースで、それらの行に対して適用エラーが蓄積されていないこと。
宛先データベースで、それらの行がOracle Streamsの適用プロセスによって正しく更新されていること。宛先データベースでそれらの行が含まれている表を問い合せて、レプリケートされた変更が適用されていることを確認できます。
行がこれら両方の条件に該当する場合、比較結果でその行の違いを無視することができます。
COMPAREファンクションでは、レプリケート中の違いが示される場合があるため、このファンクションは、使用している環境のレプリケーション・アクティビティが最も少ない時間帯に実行することをお薦めします。レプリケーション・アクティビティが比較的少ない時間帯の比較結果には、Oracle Streamsレプリケーション環境で次のような違いが示されます。
管理者またはプロシージャが一方のデータベースでのみ行を手動で操作する場合に発生する違い。たとえば、管理者またはプロシージャが変更を行う前にセッション・タグを設定し、このセッション・タグによって取得プロセスで変更を取得できなくなる場合があります。
一方のデータベースでデータが失われ、別のデータベースでデータを確認してリカバリする必要がある場合に発生する違い。
適用エラーによって発生する違い。この場合は、適用エラーのため、一方のデータベースでエラー・トランザクションが適用されません。
いずれの場合も、必要に応じて、CONVERGEプロシージャを実行してデータベース・オブジェクトを同期化できます。たとえば、適用エラーが存在し、エラー・トランザクションを簡単に再実行できない場合、CONVERGEプロシージャを使用してデータベース・オブジェクトを同期化できます。
|
関連項目:
|