この章では、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_SUMMARY
データ・ディクショナリ・ビューを問い合せます。
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つのバケットが使用されます。
図12-1に、1つ目の例を示します。
図12-1 max_num_buckets=3が設定された比較および各スキャンのそれぞれのバケットでの違いの検出
図12-1には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用されるそれぞれのバケットに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示しています。
max_num_buckets
パラメータが3
に設定されているため、次の手順で比較が実行されます。
この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用され、各バケットで違いが検出されます。
前述の手順のルート・スキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では3回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計9つのバケットが使用されます。各バケットで違いが検出されます。図12-1では、矢印によって、この手順の各スキャンのためにルート・スキャンの各バケットが3つのバケットに分割される状況が示されています。
手順2のスキャンによって使用された各バケットの行に対して、個別のスキャンが実行されます。この手順では9回のスキャンが実行され、各スキャンで3つのバケットが使用されます。したがって、この手順では合計27個のバケットが使用されます。図12-1では、矢印によって、この手順の各スキャンのために手順2の各バケットが3つのバケットに分割される状況が示されています。
手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。
図12-2に、2つ目の例を示します。
図12-2 max_num_buckets=3が設定された比較および各スキャンの1つのバケットでの違いの検出
図12-2には、共有データベース・オブジェクトで比較されている行を表す線が示されています。この図は、各スキャンで使用される1つのバケットのみに違いが存在する場合に、スキャンおよびバケットで違いが識別される方法を示します。
max_num_buckets
パラメータが3
に設定されているため、次の手順で比較が実行されます。
この比較では、ルート・スキャンによってすべての行が比較されます。ルート・スキャンでは3つのバケットが使用されますが、1つのバケットのみで違いが検出されます。
違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。1つのバケットのみで違いが検出されます。図12-2では、矢印によって、この手順のスキャンのためにルート・スキャンで違いが検出されたバケットが3つのバケットに分割される状況が示されています。
手順2で違いが検出された1つのバケットの行に対して、個別のスキャンが実行されます。この手順では1回のスキャンが実行され、そのスキャンで3つのバケットが使用されます。図12-2では、矢印によって、この手順のスキャンのために手順2で違いが検出されたバケットが3つのバケットに分割される状況が示されています。
手順3の後、比較結果が、適切なデータ・ディクショナリ・ビューに記録されます。
注意: この項の例では、CREATE_COMPARISON プロシージャのmax_num_buckets パラメータは3 に設定されています。この設定は、スキャンおよびバケットで違いが識別される方法を示すことを目的としています。通常、max_num_buckets パラメータは、より高い値に設定されます。このパラメータのデフォルト値は1000 です。このパラメータの設定を調整して、最高のパフォーマンスを実現できます。 |
この章で説明するタスクを実行する前に、次のマニュアルを参照してください。
次に示すDBMS_COMPARISON
パッケージの基本的な情報については、『Oracle Database 2日でデータ・レプリケーションおよび統合ガイド』を参照してください。
DBMS_COMPARISON
パッケージの基本概念
このパッケージを使用してデータベース・オブジェクトを比較および収束する場合の簡単な例
比較結果に基づいて、異なるデータベースのデータベース・オブジェクト間の違いについての情報を示す問合せの例
次に示すDBMS_COMPARISON
パッケージの高度な概念およびDBMS_COMPARISON
パッケージのサブプログラムの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_COMPARISON
パッケージに関する章を参照してください。
このパッケージを使用するための要件
このパッケージで使用される定数の説明
このパッケージの各サブプログラムおよびそのパラメータの説明
2つのデータベースの共有データベース・オブジェクトを比較および収束するには、次の前提条件を満たす必要があります。
2つのデータベースが相互に通信できるようにネットワーク接続を構成します。データベース間のネットワーク接続を構成する方法については、『Oracle Database Net Services管理者ガイド』を参照してください。
比較を作成、実行および管理するデータベース・ユーザーを指定または作成します。このデータベース・ユーザーは、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_COMPARISON
パッケージに関する項に示されている権限の要件を満たす必要があります。
必要な権限を持つユーザーを指定または作成した後、DBMS_COMPARISON
パッケージのサブプログラムを実行するデータベースからデータベース・オブジェクトを共有するもう一方のデータベースへのデータベース・リンクを作成します。指定したユーザーがデータベース・リンクを所有している必要があります。また、このリンクは、リモート・データベース上の必要な権限を持つユーザーに接続する必要があります。
たとえば、次の例では、データベースcomp1.net
のユーザーadmin
が所有し、リモート・データベースcomp2.net
のadmin
ユーザーに接続するデータベース・リンクを作成します。
SQL*Plusで、admin
ユーザーとしてローカル・データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
データベース・リンクを作成します。
CREATE DATABASE LINK comp2.net CONNECT TO admin
IDENTIFIED BY password USING 'comp2.net';
次の項では、2つのデータベースの共有データベース・オブジェクトを比較および収束する例を示します。
これらの例では、oe.orders
表のデータを比較および収束します。この表は、oe
サンプル・スキーマに含まれ、デフォルトでOracle Databaseとともにインストールされます。これらの例では、データベースのグローバル名はcomp1.net
およびcomp2.net
ですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。
これらの例のために、次の手順を実行してoe.orders
表を2つのデータベースで拡散させます。
SQL*Plusで、oe
ユーザーとしてcomp2.net
データベースに接続します。
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.net
およびcomp2.net
データベースのoe.orders
表を比較します。例では、このパッケージを使用して異なるタイプの比較を作成し、その比較を使用して表を比較します。
この項の例は、次のとおりです。
CREATE_COMPARISON
プロシージャのcolumn_list
パラメータを使用すると、データベース・オブジェクトの列のサブセットを比較できます。列のサブセットを比較する理由は次のとおりです。
データベース・オブジェクトに、比較対象のデータベース・オブジェクトに存在しない追加の列が含まれている。この場合、column_list
パラメータには、両方のデータベース・オブジェクトに存在する列のみを含める必要があります。
特定の列セットに比較を限定する必要がある。たとえば、表に何百もの列が含まれている場合、column_list
パラメータに特定の列を指定して、効率的に比較できます。
一部の列に違いが存在すると予測される。この場合、違いが存在すると予測される列をcolumn_list
パラメータから除外します。
列リストの列は、次の要件を満たしている必要があります。
列リストは、DBMS_COMPARISON
パッケージの索引列の要件を満たしている必要があります。索引列の要件の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
CONVERGE
プロシージャを使用して比較結果に基づいてデータベース・オブジェクトを変更する場合は、そのデータベース・オブジェクト内のNOT
NULL
制約が指定され、デフォルト値が指定されていないすべての列を、列リストに含める必要があります。
この例では、comp1.net
データベースとcomp2.net
データベースのoe.orders
表のorder_id
、order_date
およびcustomer_id
列を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。
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.net', 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.net
データベースとcomp2.net
データベースのoe.orders
表全体を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
CREATE_COMPARISON
プロシージャを実行して、比較を作成します。
BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'compare_orders', schema_name => 'oe', object_name => 'orders', dblink_name => 'comp2.net'); 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.net
データベースとcomp2.net
データベースのoe.orders
表の一部をランダムに比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
CREATE_COMPARISON
プロシージャを実行して、比較を作成します。
BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'compare_random', schema_name => 'oe', object_name => 'orders', dblink_name => 'comp2.net', 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.net
データベースとcomp2.net
データベースのoe.orders
表を循環比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
CREATE_COMPARISON
プロシージャを実行して、比較を作成します。
BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'compare_cyclic', schema_name => 'oe', object_name => 'orders', dblink_name => 'comp2.net', 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.net
データベースとcomp2.net
データベースのoe.orders
表のカスタム部分を比較します。
「共有データベース・オブジェクトの比較および収束の準備」および「2つのデータベースのデータベース・オブジェクトの拡散の例」で説明されているタスクを実行します。
「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。
SQL*Plusでデータベースに接続する手順については、『Oracle Database管理者ガイド』を参照してください。
CREATE_COMPARISON
プロシージャを実行して、比較を作成します。
BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'compare_custom', schema_name => 'oe', object_name => 'orders', dblink_name => 'comp2.net', 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
パッケージで作成された比較に関する情報が含まれています。
DBA_COMPARISON
USER_COMPARISON
DBA_COMPARISON_COLUMNS
USER_COMPARISON_COLUMNS
DBA_COMPARISON_SCAN
USER_COMPARISON_SCAN
DBA_COMPARISON_SCAN_SUMMARY
USER_COMPARISON_SCAN_SUMMARY
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 A10 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.NET ADMIN COMPARE_ORDERS OE ORDERS TABLE FULL COMP2.NET ADMIN COMPARE_RANDOM OE ORDERS TABLE RANDOM COMP2.NET ADMIN COMPARE_CYCLIC OE ORDERS TABLE CYCLIC COMP2.NET ADMIN COMPARE_CUSTOM OE ORDERS TABLE CUSTOM COMP2.NET
比較では、ローカル・データベース・オブジェクトがリモート・データベースのデータベース・オブジェクトと比較されます。比較は、問合せで示されているデータベース・リンクを使用してリモート・データベースに接続し、実行されます。
デフォルトでは、比較対象のデータベース・オブジェクトの所有者、名前およびデータ型は、両方のデータベースで同じであると想定されます。ただし、ローカル・データベースとリモート・データベースでこれらが異なる場合があります。この項の問合せではリモート・データベース・オブジェクトに関する情報は表示されませんが、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_SUMMARY 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_SUMMARY 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_SUMMARY WHERE COMPARISON_NAME = 'COMPARE_ORDERS';
複数の値が戻される場合、比較は複数回実行されています。この場合、戻された最大のスキャンIDを使用します。
比較結果のすべての行を収束する場合は、比較結果のルート・スキャンIDを指定します。ただし、比較結果の一部の行を収束する場合は、収束する違いが存在するスキャンのスキャンIDを指定できます。
参照:
|
CONVERGE
プロシージャのconverge_options
パラメータは、収束時に優先するデータベースを決定します。ローカル・データベースを優先するように指定するには、converge_options
パラメータをDBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINS
に設定します。ローカル・データベースを優先するように指定した場合、指定した比較スキャンで検出されたそれぞれの違いに対して、リモート・データベースのデータベース・オブジェクトのデータがローカル・データベースのデータベース・オブジェクトのデータに置き換えられます。
両方のデータベース・オブジェクトがローカル・データベースと一貫性を持つようにcompare_orders
比較のスキャンを収束するには、次の手順を実行します。
比較を所有する管理ユーザーとして、SQL*Plusからcomp1.net
データベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
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.net
データベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
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.net
データベースに接続します。また、このユーザーは、「共有データベース・オブジェクトの比較および収束の準備」で作成したデータベース・リンクに対するアクセス権を持っている必要があります。
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_SUMMARY
データ・ディクショナリ・ビューの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
プロシージャを使用してデータベース・オブジェクトを同期化できます。
参照:
|