13 データの比較および収束
この章では、DBMS_COMPARISONパッケージを使用して、異なる2つのデータベースでデータベース・オブジェクトのデータを比較および収束する方法について説明します。また、作成した比較を管理する方法、およびデータ・ディクショナリ・ビューを問い合せて比較と比較結果に関する情報を取得する方法についても説明します。
この章には次のトピックが含まれます:
関連項目:
DBMS_COMPARISONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.1 データの比較および収束
DBMS_COMPARISONパッケージを使用すると、異なるデータベースのデータベース・オブジェクトを比較して違いを識別できます。このパッケージでは、異なるデータベースで一貫するようにデータベース・オブジェクトを収束させることもできます。通常、このパッケージは、複数のデータベースでデータベース・オブジェクトを共有している環境で使用されます。複数のデータベースに同じデータベース・オブジェクトのコピーが存在する場合、そのデータベース・オブジェクトは共有データベース・オブジェクトです。
共有データベース・オブジェクトは、データ・レプリケーションによって保持できます。たとえば、マテリアライズド・ビューまたはOracle Streamsコンポーネントによって、データベース・オブジェクトをレプリケートして複数のデータベースで保持できます。また、カスタム・アプリケーションによって、共有データベース・オブジェクトを保持することもできます。データベース・オブジェクトが共有されている場合、そのデータベース・オブジェクトを共有するデータベースでデータベース・オブジェクトが拡散する可能性があります。DBMS_COMPARISONパッケージを使用すると、共有データベース・オブジェクト間での違いを識別できます。違いの識別後、必要に応じて、このパッケージを使用して共有データベース・オブジェクトを同期化することもできます。
DBMS_COMPARISONパッケージでは、次のタイプのデータベース・オブジェクトを比較できます。
-
表
-
単一表ビュー
-
マテリアライズド・ビュー
-
表、単一表ビューおよびマテリアライズド・ビューのシノニム
異なるデータベースで、様々なタイプのデータベース・オブジェクトを比較および収束できます。たとえば、このパッケージを使用して、あるデータベースの表と別のデータベースのマテリアライズド・ビューを比較および収束できます。
2つのデータベース・オブジェクト間の比較を作成するには、DBMS_COMPARISONパッケージのCREATE_COMPARISONプロシージャを使用します。比較の作成後、COMPAREファンクションを使用して比較を随時実行できます。COMPAREファンクションを実行すると、適切なデータ・ディクショナリ・ビューに比較結果が記録されます。COMPAREファンクションを実行するたびに、個別の比較結果が生成されます。
13.1.1 スキャン
COMPAREファンクションを実行するたびに、指定した比較に対して、1回以上の新しいスキャンが実行されます。スキャンでは、共有データベース・オブジェクトの一部またはすべての行で、特定の時点における違いが確認されます。COMPAREファンクションを1回実行すると、その比較結果に、1回以上のスキャンが含まれる場合があります。データベース・オブジェクトは複数回比較することができ、比較結果の各スキャンは一意のスキャンIDによって識別されます。
13.1.2 バケット
バケットとは、比較されているデータベース・オブジェクトの一定範囲の行です。バケットを使用すると、データベース・オブジェクトが複数の範囲に分割され、別々に比較されるため、パフォーマンスが向上します。それぞれの比較で、比較される行が適切な数のバケットに分割されます。使用されるバケットの数は、データベース・オブジェクトのサイズによって異なり、CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータで指定されている、比較用のバケットの最大数より常に少なくなります。
COMPAREファンクションを使用してバケットを比較する場合、結果は次のいずれかになります。
-
違いが検出されなかった場合。この場合、次のバケットの比較へ進みます。
-
違いが検出された場合。この場合、バケットはより小さいバケットに分割され、それぞれの小さいバケットが比較されます。小さいバケットで違いが検出された場合、そのバケットはさらに小さいバケットに分割されます。このプロセスが、バケットで許容される行の最小数に達するまで繰り返されます。比較用のバケットの行の最小数は、
CREATE_COMPARISONプロシージャのmin_rows_in_bucketパラメータで指定されています。バケットの行の最小数に達すると、
COMPAREファンクションによって、バケットに違いがあるかどうかがレポートされます。COMPAREファンクションには、perform_row_difパラメータが含まれています。このパラメータによって、違いが検出されたバケットの各行の違いをCOMPAREファンクションで識別するかどうかが制御されます。このパラメータがTRUEに設定されている場合、COMPAREファンクションで各行の違いが識別されます。このパラメータがFALSEに設定されている場合、COMPAREファンクションで特定の行の違いは識別されません。かわりに、バケットに違いがあることのみがレポートされます。
CREATE_COMPARISONプロシージャのmax_num_bucketsパラメータとmin_rows_in_bucketパラメータを調整して、特定のデータベース・オブジェクトを比較する際に最高のパフォーマンスを実現できます。比較の作成後、DBA_COMPARISONデータ・ディクショナリ・ビューのMAX_NUM_BUCKETS列およびMIN_ROWS_IN_BUCKET列を問い合せると、比較用のバケットの指定を参照できます。
DBMS_COMPARISONパッケージでは、バケットのすべての行の指定列に対してORA_HASHファンクションを使用して、そのバケットのハッシュ値を計算します。2つの対応するバケットのハッシュ値が一致した場合、それらのバケットの内容は一致しているとみなされます。行の値はデータベース間で転送されないため、ORA_HASHファンクションによってバケットを効率的に比較できます。かわりにハッシュ値のみが転送されます。
注意:
比較用の索引列がVARCHAR2またはCHAR列の場合、バケットの数が、max_num_bucketsパラメータで指定されている値を超える場合があります。
関連項目:
-
ORA_HASHファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 -
索引列の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.1.3 親スキャンおよびルート・スキャン
COMPAREファンクションによってバケットが小さいバケットに分割されるたびに、小さいバケットに対して新しいスキャンが実行されます。大きいバケットを分析するスキャンは、大きいバケットが分割されて生成された小さいバケットを分析する各スキャンの親スキャンとなります。比較結果のルート・スキャンは、最上位の親スキャンです。ルート・スキャンに親スキャンはありません。親スキャンIDおよびルート・スキャンIDを確認するには、DBA_COMPARISON_SCANデータ・ディクショナリ・ビューを問い合せます。
スキャンを再チェックするにはRECHECKファンクションを使用し、スキャンを収束するにはCONVERGEプロシージャを使用します。比較結果のすべての行を再チェックまたは収束する場合は、適切なサブプログラムで比較結果のルート・スキャンIDを指定します。比較結果の一部の行を再チェックまたは収束する場合は、相違点が含まれているスキャンのスキャンIDを指定します。
たとえば、20個のバケットに違いが存在するスキャンは、違いが存在するそれぞれのバケットに比較用のバケットの行の最小数として指定されている数より多くの行が含まれている場合、親スキャンとなり、さらに20回のスキャンが実行されます。比較用のバケットの行の最小数を参照するには、DBA_COMPARISONデータ・ディクショナリ・ビューのMIN_ROWS_IN_BUCKET列を問い合せます。
関連項目:
DBMS_COMPARISONパッケージに関連するビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
13.1.4 スキャンおよびバケットでの違いの識別方法
ここでは、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が設定された比較および各スキャンのそれぞれのバケットでの違い」の説明
図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「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です。このパラメータの設定を調整して、最高のパフォーマンスを実現できます。
13.2 DBMS_COMPARISONパッケージに関する他のマニュアル
次に示すパッケージの高度な概念およびサブプログラムの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』のDBMS_COMPARISONパッケージに関する章を参照してください。
-
このパッケージを使用するための要件
-
このパッケージで使用される定数の説明
-
このパッケージの各サブプログラムおよびそのパラメータの説明
13.3 クイック・スタート: 簡単な比較および収束の例
この項では、hr.departments表を比較および収束する簡単な例について説明します。この項は、単一の表を比較および収束する方法を示すことにより、DBMS_COMPARISONパッケージの使用を開始することを目的としています。
この項では、次の項目について説明します。
13.3.1 チュートリアル: データの比較および収束の準備
2つのデータベースでhr.departments表を共有するとします。この表を異なるデータベースで比較して、データが一貫しているかどうかを確認します。2つのデータベースで表が拡散している場合は、これらを収束させて一貫させます。
このチュートリアルを実行する前に、次の前提条件を満たします。
-
2つのデータベースが相互に通信できるようにネットワーク接続を構成します。データベース間のネットワーク接続の構成については、『Oracle Database 2日でデータベース管理者』を参照してください。
-
hrサンプル・スキーマが両方のデータベースにインストールされていることを確認します。
この例では、データベースのグローバル名はii1.example.comおよびii2.example.comですが、使用している環境で、前提条件を満たす任意の2つのデータベースをかわりに使用できます。
ii1.example.comおよびii2.example.comデータベースのhr.departments表の比較および収束を準備するには:
-
この例の目的を満たすために、2つのデータベースで
hr.departments表を拡散させます。-
コマンドラインでSQL*Plusを開き、
ii2.example.comデータベースにhrユーザーとして接続してください。SQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
-
hr.departments表で、department_idが270と等しい部門を削除します。DELETE FROM hr.departments WHERE department_id=270; COMMIT;
-
hr.departments表で、ある行のデータを変更します。UPDATE hr.departments SET manager_id=114 WHERE department_id=10; COMMIT;
-
hr.departments表に行を挿入します。INSERT INTO hr.departments VALUES(280, 'Bean Counters', 108, 2700); COMMIT;
-
SQL*Plusを終了します。
EXIT;
注意:
通常、手順1は不要です。この例では、2つのデータベースで
hr.departments表を分散するために含まれています。 -
-
ii1.example.comデータベースからii2.example.comデータベースへのデータベース・リンクを作成します。データベース・リンクは、
ii1.example.comの管理ユーザーのスキーマからii2.example.comの管理ユーザーのスキーマに接続する必要があります。両方のデータベースの管理ユーザーは、hr.departments表にアクセスして変更するために必要な権限と、DBMS_COMPARISONパッケージのサブプログラムを実行するために必要な権限を持っている必要があります。どのユーザーがこれらの権限を持っているかが不明な場合は、SYSTEMユーザーを使用します。また、データベース・リンクの名前とサービス名は、どちらもii2.example.comである必要があります。詳細は、「ネットワーク接続性とデータベース・リンクの構成」を参照してください。
関連項目:
DBMS_COMPARISONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.3.2 チュートリアル: 2つの異なるデータベース内のデータの比較
この例は、「チュートリアル: データの比較および収束の準備」で説明したシナリオの続きです。先に進む前に、その項の手順を完了してください。
DBMS_COMPARISONパッケージのCREATE_COMPARISONプロシージャを使用して、2つの異なるデータベースにある共有データベース・オブジェクトの比較を定義できます。比較が定義された後で、このパッケージのCOMPAREファンクションを使用して、比較で指定したデータベース・オブジェクトを現在の時点で比較できます。 COMPAREファンクションは、特定の比較に対して複数回実行できます。ファンクションを実行するたびに、データベース・オブジェクトのスキャンが1回以上行われ、各スキャンが独自のスキャンIDを持ちます。
ii1.example.comおよびii2.example.comデータベースのhr.departments表全体を比較するには:
-
コマンドラインでSQL*Plusを開き、「チュートリアル: データの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして
ii1.example.comデータベースに接続します。たとえば、SYSTEMユーザーがデータベース・リンクを所有する場合は、SYSTEMユーザーとして接続します。sqlplus system@ii1.example.com Enter password: passwordSQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
-
CREATE_COMPARISONプロシージャを実行して、hr.departments表の比較を作成します。BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'compare_departments', schema_name => 'hr', object_name => 'departments', dblink_name => 'ii2.example.com'); END; /新しい比較の名前は
compare_departmentsであることに注意してください。この比較は、CREATE_COMPARISONプロシージャを実行するユーザーによって所有されます。 -
COMPAREファンクションを実行して、2つのデータベースのhr.departments表を比較します。SET SERVEROUTPUT ON DECLARE consistent BOOLEAN; scan_info DBMS_COMPARISON.COMPARISON_TYPE; BEGIN consistent := DBMS_COMPARISON.COMPARE( comparison_name => 'compare_departments', 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 Differences were found. PL/SQL procedure successfully completed.手順2で作成した比較の名前を
comparison_nameパラメータに指定します。ファクションは、比較のスキャンIDを出力します。比較に関する情報をデータ・ディクショナリ・ビューに問い合せる場合、およびデータベース・オブジェクトを収束させる場合は、スキャンIDが重要です。
ファンクションは、2つのデータベースで表に差異が見つかったかどうかも出力します。
-
ファンクションが
「違いが見つかりません」と出力する場合、表は2つのデータベースで一貫しています。 -
ファンクションが
「違いが見つかりました」と出力する場合は、表が2つのデータベースで拡散しています。
-
-
前の手順でファンクションから返されたスキャンIDを記録しておきます。この例では、スキャンIDが
1であると想定します。 -
手順3で差異が見つかった場合は、次の問合せを実行して、見つかった差異の数を表示します。
COLUMN OWNER HEADING 'Comparison Owner' FORMAT A16 COLUMN COMPARISON_NAME HEADING 'Comparison Name' FORMAT A20 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 = 1;問合せの
WHERE句に、手順4で記録したスキャンIDを指定します。出力は、次のようなものです:
Comparison Owner Comparison Name Schema Name Object Name Differences ---------------- -------------------- ----------- ----------- ----------- SYSTEM COMPARE_DEPARTMENTS HR DEPARTMENTS 3
-
比較されているデータベース・オブジェクトのどの行が異なるかを確認するには、次の問合せを実行します。
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_DEPARTMENTS' AND r.SCAN_ID = s.SCAN_ID AND s.PARENT_SCAN_ID = 1 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;WHERE句には、比較の名前と比較のスキャンIDを指定します。この例では、比較の名前はcompare_departmentsで、スキャンIDは1です。出力は、次のようなものです:
Index Column Index Value Local Row Exists? Remote Row Exists? --------------- --------------- -------------------- -------------------- DEPARTMENT_ID 10 Yes Yes DEPARTMENT_ID 270 Yes No DEPARTMENT_ID 280 No Yes
この出力には、比較する表の索引列と、共有データベース・オブジェクトで異なるそれぞれの行の索引値が示されています。この例では、索引列は
hr.departments表の主キー列(department_id)です。また、出力には、各行の違いのタイプも示されています。-
行に対する
LocalRowExists?とRemoteRowExists?の両方がYesの場合、その行はデータベース・オブジェクトの両方のインスタンスに存在しますが、行に含まれるデータは異なります。 -
行に対する
LocalRowExists?がYesでRemoteRowExists?がNoの場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。 -
行に対する
LocalRowExists?がNoでRemoteRowExists?がYesの場合、その行はリモート・データベース・オブジェクトには存在しますが、ローカル・データベース・オブジェクトには存在しません。
-
関連項目:
DBMS_COMPARISONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.3.3 チュートリアル: 相違データの収束
この例は、「チュートリアル: 2つの異なるデータベース内のデータの比較」で説明したシナリオの続きです。先に進む前に、その項の手順を完了してください。
共有データベース・オブジェクトが2つの異なるデータベースで拡散した場合は、DBMS_COMPARISONパッケージのCONVERGEプロシージャを使用して、データベース・オブジェクトの2つのインスタンスを収束させることができます。CONVERGEプロシージャを正常に実行すると、共有データベース・オブジェクトが2つのデータベースで一貫します。CONVERGEプロシージャを実行するには、次の情報を指定する必要があります。
-
DBMS_COMPARISONパッケージのCREATE_COMPARISONプロシージャを使用して作成した既存の比較の名前 -
収束させる比較のスキャンID
スキャンIDには、収束させる差異に関する情報が含まれます。この例では、比較の名前はcompare_departmentsで、スキャンIDは 1です。
また、CONVERGEプロシージャを実行する際には、共有データベース・オブジェクトが収束するときに「優先」されるデータベースを指定する必要があります。ローカル・データベースが優先されることを指定した場合は、データが異なるときに、ローカル・データベースのデータベース・オブジェクト内のデータでリモート・データベースのデータベース・オブジェクト内のデータが置換されます。リモート・データベースが優先されることを指定した場合は、データが異なるときに、リモート・データベースのデータベース・オブジェクト内のデータでローカル・データベースのデータベース・オブジェクト内のデータが置換されます。この例では、ローカル・データベースii1.example.comが優先されます。
ii1.example.comおよびii2.example.comデータベースのhr.departments表の相違データを収束させるには:
-
コマンドラインでSQL*Plusを開き、「チュートリアル: データの比較および収束の準備」で作成したデータベース・リンクを所有する管理ユーザーとして
ii1.example.comデータベースに接続します。たとえば、SYSTEMユーザーがデータベース・リンクを所有する場合は、SYSTEMユーザーとして接続します。sqlplus system@ii1.example.com Enter password: passwordSQL*Plusの起動の詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
-
CONVERGEプロシージャを実行して、2つのデータベースのhr.departments表を収束させます。SET SERVEROUTPUT ON DECLARE scan_info DBMS_COMPARISON.COMPARISON_TYPE; BEGIN DBMS_COMPARISON.CONVERGE( comparison_name => 'compare_departments', scan_id => 1, 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: 2 Local Rows Deleted: 0 Remote Rows Deleted: 1 PL/SQL procedure successfully completed.
CONVERGEプロシージャは、指定されたスキャンで比較されるデータベース・オブジェクトの部分を同期し、行われた変更に関する情報を返します。一部のスキャンは、データベース・オブジェクトのサブセットを比較することがあります。この例では、指定されたスキャンは表全体を比較しました。このため、比較スキャンの完了後に新しい差異が追加されていないと想定すると、表全体が同期されています。
この例では、プロシージャでconverge_optionsパラメータがDBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINSに設定されているためローカル表が優先されます。つまり、2つのデータベースで異なる行については、ローカル・データベースの行によって、リモート・データベースの対応する行が置換されます。一部の行がリモート・データベースに存在し、ローカル・データベースには存在しない場合は、リモート・データベースの余分な行が削除されます。リモート・データベースを優先する場合は、プロシージャでconverge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_REMOTE_WINSに設定します。
また、Oracle Streamsレプリケーション環境の一部である共有データベース・オブジェクトに対してCONVERGEプロシージャを実行する場合は、プロシージャによって行われた変更を他のデータベースにレプリケートしたくないことがあります。この場合は、CONVERGEプロシージャで、次のパラメータを変更がレプリケートされない値に設定できます。
-
local_converge_tag -
remote_converge_tag
これらのパラメータのいずれかがNULL以外の値に設定されている場合、収束中に変更を行うセッションでタグが設定されます。local_converge_tagパラメータはセッション中にローカル・データベースにタグを設定しますが、remote_converge_tagパラメータはセッション中にリモート・データベースにタグを設定します。CONVERGEプロシージャによって行われた変更をレプリケートしない場合は、これらのパラメータを、Oracle Streams取得プロセスおよび同期取得が変更を取得しないようにする値に設定します。
関連項目:
DBMS_COMPARISONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.4 共有データベース・オブジェクトの比較および収束の準備
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';
-
13.5 2つのデータベースのデータベース・オブジェクトの拡散の例
次の項では、2つのデータベースの共有データベース・オブジェクトを比較および収束する例を示します。
これらの例のほとんどでは、oe.orders表のデータを比較および収束します。この表はoeサンプル・スキーマの一部です。これらの例では、データベースのグローバル名はcomp1.example.comおよびcomp2.example.comですが、使用している環境内では、「共有データベース・オブジェクトの比較および収束の準備」に示されている前提条件を満たす任意の2つのデータベースに置き換えることができます。
これらの例のために、次の手順を実行してoe.orders表を2つのデータベースで拡散させます。
注意:
通常、これらの手順は必要ありません。これらの手順は、2つのデータベースでoe.orders表を確実に拡散させるために記載されています。
13.6 2つのデータベースの共有データベース・オブジェクトの比較
この項の例では、DBMS_COMPARISONパッケージを使用して、comp1.example.comおよびcomp2.example.comデータベースのoe.orders表を比較します。例では、このパッケージを使用して異なるタイプの比較を作成し、その比較を使用して表を比較します。
この項には次の例が含まれます:
13.6.1 共有データベース・オブジェクトの列のサブセットの比較
CREATE_COMPARISONプロシージャのcolumn_listパラメータを使用すると、データベース・オブジェクトの列のサブセットを比較できます。列のサブセットを比較する理由は次のとおりです。
-
データベース・オブジェクトに、比較対象のデータベース・オブジェクトに存在しない追加の列が含まれている。この場合、
column_listパラメータには、両方のデータベース・オブジェクトに存在する列のみを含める必要があります。 -
特定の列セットに比較を限定する必要がある。たとえば、表に何百もの列が含まれている場合、
column_listパラメータに特定の列を指定して、効率的に比較できます。 -
一部の列に違いが存在すると予測される。この場合、違いが存在すると予測される列を
column_listパラメータから除外します。
列リストの列は、次の要件を満たしている必要があります。
-
列リストは、
DBMS_COMPARISONパッケージの索引列の要件を満たしている必要があります。索引列の要件の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 -
CONVERGEプロシージャを使用して比較結果に基づいてデータベース・オブジェクトを変更する場合は、そのデータベース・オブジェクト内のNOTNULL制約が指定され、デフォルト値が指定されていないすべての列を、列リストに含める必要があります。
この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表のorder_id、order_dateおよびcustomer_id列を比較します。
関連項目:
-
比較結果で検出された違いを収束する場合は、「共有データベース・オブジェクトの収束」を参照してください
-
比較結果を再確認する場合は、「比較の比較結果の再確認」を参照してください
13.6.2 行の違いを識別しない共有データベース・オブジェクトの比較
既存の比較に対して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表全体を比較します。
関連項目:
-
比較結果で検出された違いを収束する場合は、「共有データベース・オブジェクトの収束」を参照してください
-
比較結果を再確認する場合は、「比較の比較結果の再確認」を参照してください
13.6.3 共有データベース・オブジェクトのランダム部分の比較
CREATE_COMPARISONプロシージャのscan_percentおよびscan_modeパラメータを使用すると、共有データベース・オブジェクト全体ではなく、共有データベース・オブジェクトの一部をランダムに比較できます。通常、このオプションは、次の場合に使用します。
-
比較的大きい共有データベース・オブジェクトを比較しており、データベース・オブジェクト全体の比較にリソースおよび時間を費やすことなく、違いが存在するかどうかを判別する場合。
-
後続の比較を使用してデータベース・オブジェクトの別の部分を比較しない場合。後続の比較でデータベース・オブジェクトの別の部分を比較する場合の手順については、「共有データベース・オブジェクトの循環比較」を参照してください。
この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表の一部をランダムに比較します。
関連項目:
-
比較結果で検出された違いを収束する場合は、「共有データベース・オブジェクトの収束」を参照してください
-
比較結果を再確認する場合は、「比較の比較結果の再確認」を参照してください
13.6.4 共有データベース・オブジェクトの循環比較
CREATE_COMPARISONプロシージャのscan_percentおよびscan_modeパラメータを使用すると、共有データベース・オブジェクトの一部を循環比較できます。循環比較では、1回の比較で比較対象のデータベース・オブジェクトの一部がスキャンされます。このデータベース・オブジェクトを再度比較すると、前回の比較が終了した箇所から、データベース・オブジェクトの別の部分が比較されます。
通常、このオプションは、次の場合に使用します。
-
比較的大きい共有データベース・オブジェクトを比較しており、データベース・オブジェクト全体の比較にリソースおよび時間を費やすことなく、違いが存在するかどうかを判別する場合。
-
各比較で共有データベース・オブジェクトの別の部分を比較して、データベース・オブジェクト全体が適切な回数のスキャンで比較されるようにする場合。たとえば、共有データベース・オブジェクトの25%を比較する場合、データベース・オブジェクト全体は4回の比較で比較されます。後続の比較でデータベース・オブジェクトの別の部分を比較しない場合の手順については、「共有データベース・オブジェクトのランダム部分の比較」を参照してください。
この例では、comp1.example.comデータベースとcomp2.example.comデータベースのoe.orders表を循環比較します。
関連項目:
-
比較結果で検出された違いを収束する場合は、「共有データベース・オブジェクトの収束」を参照してください
-
比較結果を再確認する場合は、「比較の比較結果の再確認」を参照してください
13.6.5 共有データベース・オブジェクトのカスタム部分の比較
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表のカスタム部分を比較します。
関連項目:
-
比較結果で検出された違いを収束する場合は、「共有データベース・オブジェクトの収束」を参照してください
-
比較結果を再確認する場合は、「比較の比較結果の再確認」を参照してください
13.6.6 CLOB列またはBLOB列を含む共有データベース・オブジェクトの比較
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.
13.7 比較および比較結果に関する情報の表示
次のデータ・ディクショナリ・ビューには、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リファレンス』を参照してください。
13.7.1 データベース内の比較に関する一般的な情報の表示
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列を問い合せると、この情報を表示できます。
関連項目:
この問合せの出力に示されている比較を作成する方法の詳細は、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください。
13.7.2 ランダム比較および循環比較固有の情報の表示
スキャン・モードRANDOMまたはCYCLICを使用する比較を作成する場合は、比較する共有データベース・オブジェクトの割合を指定します。この項の問合せでは、ランダム比較および循環比較に関する次の情報が表示されます。
-
比較の所有者。
-
比較の名前。
-
比較によって比較されたデータベース・オブジェクトが含まれているスキーマ。
-
比較によって比較されたデータベース・オブジェクトの名前。
-
比較によって比較されたデータベース・オブジェクトのデータ型。
-
比較におけるスキャンの割合。
COMPAREファンクションが実行されて比較スキャンが実行されるたびに、データベース・オブジェクトで、指定されている割合が比較されます。 -
比較で使用されたリード索引列の最後の値。
COMPAREファンクションが次回実行される際は、問合せで示されたリード索引列の値の直後の値の行から開始されます。この値は、循環比較にのみ適用されます。
この情報を表示するには、次の問合せを実行します。
COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A22
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A8
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A8
COLUMN OBJECT_TYPE HEADING 'Object|Type' FORMAT A8
COLUMN SCAN_PERCENT HEADING 'Scan|Percent' FORMAT 999
COLUMN CYCLIC_INDEX_VALUE HEADING 'Cyclic|Index|Value' FORMAT A10
SELECT OWNER,
COMPARISON_NAME,
SCHEMA_NAME,
OBJECT_NAME,
OBJECT_TYPE,
SCAN_PERCENT,
CYCLIC_INDEX_VALUE
FROM DBA_COMPARISON
WHERE SCAN_PERCENT IS NOT NULL;
出力は次のようになります。
Cyclic Comparison Comparison Schema Object Object Scan Index Owner Name Name Name Type Percent Value ---------- ---------------------- -------- -------- -------- ------- ---------- ADMIN COMPARE_RANDOM OE ORDERS TABLE 50 ADMIN COMPARE_CYCLIC OE ORDERS TABLE 50 2677
13.7.3 データベース内の各比較によって比較された列の表示
比較を作成する場合は、比較で共有データベース・オブジェクトのすべての列を比較するか、または列のサブセットを比較するように指定できます。また、比較で使用する索引を指定するか、または索引がシステムによって自動的に指定されるように設定できます。
この項の問合せでは、次の情報が表示されます。
-
比較の所有者。
-
比較の名前。
-
比較によって比較されたデータベース・オブジェクトが含まれているスキーマ。
-
比較によって比較されたデータベース・オブジェクトの名前。
-
各データベース・オブジェクトで比較される各列の列名。
-
各列の列位置。
-
列が索引列かどうか。
これらの情報を表示するには、次の問合せを実行します。
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 . . .
13.7.4 データベース内の各スキャンに関する一般的な情報の表示
各スキャンでは、ローカル・データベースのバケットとリモート・データベースのバケットが比較されます。比較されるバケットには、共有データベース・オブジェクトの同じ範囲の行が含まれます。COMPAREファンクションを1回実行して生成された比較結果に、複数のバケットおよび複数回のスキャンが含まれる場合があります。各スキャンには一意のスキャンIDが存在します。
この項の問合せでは、各スキャンに関する次の情報が表示されます。
-
スキャンが実行された比較の所有者。
-
スキャンが実行された比較の名前。
-
スキャンによって比較されたデータベース・オブジェクトが含まれているスキーマ。
-
スキャンによって比較されたデータベース・オブジェクトの名前。
-
スキャンのスキャンID。
-
スキャンの状態。状態の値は次のいずれかになります。
-
SUC: 前回このデータ・ディクショナリの行が更新された際に2つの表の2つのバケットが一致したことを示します。 -
BUCKETDIF: 2つの表の2つのバケットが一致しなかったことを示します。各バケットは、さらに小さいバケットで構成されています。 -
FINALBUCKETDIF: 2つの表の2つのバケットが一致しなかったことを示します。いずれのバケットも、さらに小さいバケットで構成されていません。COMPAREファンクションまたはRECHECKファンクションのperform_row_difパラメータがFALSEに設定されていたため、バケットで個々の行の違いは識別されませんでした。 -
ROWDIF: 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の表示」を参照してください
-
スキャンおよびバケットの詳細は、「データの比較および収束」を参照してください
13.7.5 データベース内の各スキャンの親スキャンIDおよびルート・スキャンIDの表示
この項の問合せでは、データベースの各スキャンの親スキャンIDおよびルート・スキャンIDが表示されます。具体的には、この問合せによって次の情報が表示されます。
-
スキャンが実行された比較の所有者。
-
スキャンが実行された比較の名前。
-
スキャンによって比較されたデータベース・オブジェクトが含まれているスキーマ。
-
スキャンによって比較されたデータベース・オブジェクトの名前。
-
スキャンのスキャンID。
-
スキャンの親スキャンのスキャンID。
-
スキャンのルート・スキャンのスキャンID。
この情報を表示するには、次の問合せを実行します。
COLUMN OWNER HEADING 'Comparison|Owner' FORMAT A10
COLUMN COMPARISON_NAME HEADING 'Comparison|Name' FORMAT A15
COLUMN SCHEMA_NAME HEADING 'Schema|Name' FORMAT A10
COLUMN OBJECT_NAME HEADING 'Object|Name' FORMAT A10
COLUMN SCAN_ID HEADING 'Scan|ID' FORMAT 9999
COLUMN PARENT_SCAN_ID HEADING 'Parent|Scan ID' FORMAT 9999
COLUMN ROOT_SCAN_ID HEADING 'Root|Scan ID' FORMAT 9999
SELECT c.OWNER,
c.COMPARISON_NAME,
c.SCHEMA_NAME,
c.OBJECT_NAME,
s.SCAN_ID,
s.PARENT_SCAN_ID,
s.ROOT_SCAN_ID
FROM DBA_COMPARISON c, DBA_COMPARISON_SCAN s
WHERE c.OWNER = s.OWNER AND
c.COMPARISON_NAME = s.COMPARISON_NAME
ORDER BY s.SCAN_ID;
出力は次のようになります。
Comparison Comparison Schema Object Scan Parent Root
Owner Name Name Name ID Scan ID Scan ID
---------- --------------- ---------- ---------- ----- ------- -------
ADMIN COMPARE_SUBSET_ OE ORDERS 1 1
COLUMNS
ADMIN COMPARE_SUBSET_ OE ORDERS 2 1 1
COLUMNS
ADMIN COMPARE_SUBSET_ OE ORDERS 3 1 1
COLUMNS
ADMIN COMPARE_ORDERS OE ORDERS 4 4
ADMIN COMPARE_ORDERS OE ORDERS 5 4 4
ADMIN COMPARE_ORDERS OE ORDERS 6 4 4
ADMIN COMPARE_RANDOM OE ORDERS 7 7
ADMIN COMPARE_CYCLIC OE ORDERS 8 8
ADMIN COMPARE_CYCLIC OE ORDERS 9 8 8
ADMIN COMPARE_CUSTOM OE ORDERS 10 10
ADMIN COMPARE_CUSTOM OE ORDERS 11 10 10
ADMIN COMPARE_CUSTOM OE ORDERS 12 10 10
たとえば、この出力には、スキャンID 1のスキャンがCOMPARE_SUBSET_COLUMNS比較の比較結果のルート・スキャンであることが示されています。このルート・スキャンでは違いが検出され、このルート・スキャンは2つの小さいバケットに分割されています。スキャンID 2およびスキャンID 3のスキャンは、これらの小さいバケットに対するスキャンです。
特定のスキャンで違いが検出されたかどうかを確認するには、「データベース内の各スキャンに関する一般的な情報の表示」に示されている問合せを実行します。違いに対してRECHECKを実行する場合または共有データベース・オブジェクトの違いに対してCONVERGEを実行する場合は、再確認または収束するスキャンのスキャンIDを指定します。比較結果のすべての行を再確認または収束するには、比較結果のルート・スキャンIDを指定します。
13.7.6 スキャンで検出された行の違いの詳細の表示
この項の問合せでは、比較結果で検出された行の違いに関する詳細が表示されます。この項の問合せの情報を表示するには、比較を実行した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)です。また、出力には、各行の違いのタイプも示されています。
-
行に対する
LocalRowExists?とRemoteRowExists?の両方がYesの場合、その行はデータベース・オブジェクトの両方のインスタンスに存在しますが、行に含まれるデータは異なります。 -
行に対する
LocalRowExists?がYesでRemoteRowExists?がNoの場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。 -
行に対する
LocalRowExists?がNoでRemoteRowExists?がYesの場合、その行はリモート・データベース・オブジェクトには存在しますが、ローカル・データベース・オブジェクトには存在しません。
13.7.7 特定のスキャンで比較された行に関する情報の表示
各スキャンでは、共有データベース・オブジェクトの一定範囲の行が比較されます。この項の問合せでは、データベースの各スキャンで比較された行に関する次の情報が表示されます。
-
スキャンが実行された比較の所有者。
-
スキャンが実行された比較の名前。
-
問合せで表示された行の値の列位置。
-
スキャンによって比較された行の範囲の最小値。
-
スキャンによって比較された行の範囲の最大値。
スキャンでは、データベース・オブジェクト内の最小値の行、最大値の行および最小値と最大値の間のすべての行が比較されます。問合せによって戻された各行に最小値および最大値として表示された値は、表示された列位置にある列の値です。列位置は、比較用の索引列です。
この情報を表示するには、次の問合せを実行します。
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はルート・スキャンです。このスキャンでは、違いが検出され、スキャンID11およびスキャンID12で表される2つのバケットに行が分割されています。 -
スキャンID
11では、order_idが2430の行からorder_idが2445の行までが比較されています。 -
スキャンID
12では、order_idが2446の行からorder_idが2458の行までが比較されています。
スキャンで検出された違いを再確認または収束するには、それぞれRECHECKファンクションまたはCONVERGEプロシージャを実行できます。再確認または収束するスキャンのスキャンIDを指定します。比較結果のすべての行を再確認または収束するには、比較結果のルート・スキャンIDを指定します。
13.8 共有データベース・オブジェクトの収束
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を指定できます。
関連項目:
-
データベース・オブジェクトを比較する方法および比較スキャンの詳細は、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください
-
違いが検出されたスキャンを表示する問合せについては、「データベース内の各スキャンに関する一般的な情報の表示」を参照してください
-
各スキャンのルート・スキャンIDを表示する問合せについては、「データベース内の各スキャンの親スキャンIDおよびルート・スキャンIDの表示」を参照してください
-
CONVERGEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
13.8.1 ローカル・オブジェクトとの一貫性を保持するための共有データベース・オブジェクトの収束
CONVERGEプロシージャのconverge_optionsパラメータは、収束時に優先するデータベースを決定します。ローカル・データベースを優先するように指定するには、converge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINSに設定します。ローカル・データベースを優先するように指定した場合、指定した比較スキャンで検出されたそれぞれの違いに対して、リモート・データベースのデータベース・オブジェクトのデータがローカル・データベースのデータベース・オブジェクトのデータに置き換えられます。
両方のデータベース・オブジェクトがローカル・データベースと一貫性を持つようにcompare_orders比較のスキャンを収束するには、次の手順を実行します。
13.8.2 リモート・オブジェクトとの一貫性を保持するための共有データベース・オブジェクトの収束
CONVERGEプロシージャのconverge_optionsパラメータは、収束時に優先するデータベースを決定します。リモート・データベースを優先するように指定するには、converge_optionsパラメータをDBMS_COMPARISON.CMP_CONVERGE_REMOTE_WINSに設定します。リモート・データベースを優先するように指定した場合、指定した比較スキャンで検出されたそれぞれの違いに対して、ローカル・データベースのデータベース・オブジェクトのデータがリモート・データベースのデータベース・オブジェクトのデータに置き換えられます。
両方のデータベース・オブジェクトがリモート・データベースと一貫性を持つようにcompare_orders比較のスキャンを収束するには、次の手順を実行します。
13.8.3 セッション・タグ・セットによる共有データベース・オブジェクトの収束
収束する共有データベース・オブジェクトが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比較のスキャンを収束するには、次の手順を実行します。
注意:
CREATE_COMPARISONプロシージャで、ローカルおよびリモートの収束タグ値を設定することもできます。CONVERGEプロシージャのタグ・パラメータが非NULLの場合、このパラメータは、CREATE_COMPARISONプロシージャの対応するタグ・パラメータより優先されます。CONVERGEプロシージャのタグ・パラメータがNULLの場合、このパラメータは無視され、CREATE_COMPARISONプロシージャの対応するタグの値が使用されます。
13.9 比較の比較結果の再確認
DBMS_COMPARISONパッケージのRECHECKファンクションを使用すると、前回の比較スキャンを再確認できます。RECHECKファンクションは、指定した比較スキャンに記録された違いを、データベース・オブジェクトの現行のデータで確認します。
たとえば、compare_orders比較のスキャンID 4の結果を再確認するには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。
SET SERVEROUTPUT ON
DECLARE
consistent BOOLEAN;
BEGIN
consistent := DBMS_COMPARISON.RECHECK(
comparison_name => 'compare_orders',
scan_id => 4);
IF consistent=TRUE THEN
DBMS_OUTPUT.PUT_LINE('No differences were found.');
ELSE
DBMS_OUTPUT.PUT_LINE('Differences were found.');
END IF;
END;
/
出力は次のようになります。
Differences were found. PL/SQL procedure successfully completed.
このファンクションは、違いが検出されなかった場合はTRUE、違いが検出された場合はFALSEを戻します。compare_orders比較は、「行の違いを識別しない共有データベース・オブジェクトの比較」で作成されます。
注意:
-
RECHECKファンクションは、共有データベース・オブジェクトで、指定した比較スキャンに記録されていない違いは比較しません。このような違いを確認するには、COMPAREファンクションを実行します。 -
指定した比較スキャンが正常に完了していない場合、
RECHECKファンクションは、前回の比較スキャンが終了した箇所から開始されます。
関連項目:
COMPAREファンクションの詳細は、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください
13.10 比較結果のパージ
DBMS_COMPARISONパッケージのPURGE_COMPARISONプロシージャを使用すると、不要になった1つ以上の比較の比較結果をパージできます。比較のすべての比較結果または比較結果のサブセットのいずれかをパージできます。比較結果をパージすると、比較の再確認または拡散したデータの収束に使用できなくなります。また、比較結果に関する情報が、データ・ディクショナリ・ビューから削除されます。
この項には、次の項目が含まれます。
関連項目:
13.10.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;
/13.10.2 比較の特定のスキャンIDの比較結果のパージ
比較の特定のスキャンの比較結果をパージするには、comparison_nameパラメータに比較名、scan_idパラメータにスキャンIDを指定します。指定するスキャンIDは、ルート・スキャンである必要があります。比較結果のルート・スキャンは、最も高いレベルの親スキャンです。ルート・スキャンに親スキャンはありません。ルート・スキャンIDを確認するには、DBA_COMPARISON_SCANデータ・ディクショナリ・ビューのROOT_SCAN_ID列を問い合せます。
PURGE_COMPARISONプロシージャを実行し、ルート・スキャンを指定すると、そのルート・スキャンはパージされます。また、指定したルート・スキャンのすべての直接的および間接的な子スキャンがパージされます。他のスキャンの結果はパージされません。
たとえば、compare_orders比較のスキャンID 4の比較結果をパージするには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。
BEGIN
DBMS_COMPARISON.PURGE_COMPARISON(
comparison_name => 'compare_orders',
scan_id => 4); -- Substitute the scan ID from your scan.
END;
/
13.10.3 指定した時間より前の比較の比較結果のパージ
比較で特定の日時またはそれより前に記録された比較結果をパージするには、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;
/13.11 比較の削除
比較およびそのすべての比較結果を削除するには、DBMS_COMPARISONパッケージのDROP_COMPARISONプロシージャを使用します。たとえば、compare_subset_columns比較を削除するには、比較の所有者としてSQL*Plusにログインして、次のプロシージャを実行します。
exec DBMS_COMPARISON.DROP_COMPARISON('compare_subset_columns');
13.12 Oracle Streamsレプリケーション環境でのDBMS_COMPARISONの使用
この項では、Oracle Streamsレプリケーション環境でのDBMS_COMPARISONパッケージの一般的な使用方法について説明します。次の使用方法があります。
13.12.1 インスタンス化の後の一貫性の確認
インスタンス化の後、DBMS_COMPARISONパッケージを使用して、インスタンス化されたデータベース・オブジェクトの一貫性を検証できます。通常、Oracle Streamsレプリケーション環境で変更がレプリケートされる前に一貫性を検証する必要があります。ソース・データベース・オブジェクトおよびインスタンス化されたデータベース・オブジェクトに対する変更を許可する前に、一貫性を確認してください。これらのデータベース・オブジェクトに対する変更は、DBMS_COMPARISONパッケージによって違いとして識別されます。
インスタンス化されたデータベース・オブジェクトの一貫性を検証するには、次の手順を実行します。
関連項目:
-
CREATE_COMPARISONプロシージャで比較を作成する手順およびCOMPAREファンクションでデータベース・オブジェクトを比較する手順については、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください
13.12.2 稼働中のOracle Streamsレプリケーション環境での一貫性の確認
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プロシージャを使用してデータベース・オブジェクトを同期化できます。
関連項目:
-
CREATE_COMPARISONプロシージャで比較を作成する手順およびCOMPAREファンクションでデータベース・オブジェクトを比較する手順については、「2つのデータベースの共有データベース・オブジェクトの比較」を参照してください -
RECHECKファンクションの詳細は、「比較の比較結果の再確認」を参照してください。 -
適用エラーの詳細は、『Oracle Streams概要および管理』を参照してください。