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: password
SQL*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
)です。また、出力には、各行の違いのタイプも示されています。-
行に対する
Local
Row
Exists?
とRemote
Row
Exists?
の両方がYes
の場合、その行はデータベース・オブジェクトの両方のインスタンスに存在しますが、行に含まれるデータは異なります。 -
行に対する
Local
Row
Exists?
がYes
でRemote
Row
Exists?
がNo
の場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。 -
行に対する
Local
Row
Exists?
がNo
でRemote
Row
Exists?
が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: password
SQL*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
プロシージャを使用して比較結果に基づいてデータベース・オブジェクトを変更する場合は、そのデータベース・オブジェクト内のNOT
NULL
制約が指定され、デフォルト値が指定されていないすべての列を、列リストに含める必要があります。
この例では、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つのバケットが一致したことを示します。 -
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の表示」を参照してください
-
スキャンおよびバケットの詳細は、「データの比較および収束」を参照してください
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
)です。また、出力には、各行の違いのタイプも示されています。
-
行に対する
Local
Row
Exists?
とRemote
Row
Exists?
の両方がYes
の場合、その行はデータベース・オブジェクトの両方のインスタンスに存在しますが、行に含まれるデータは異なります。 -
行に対する
Local
Row
Exists?
がYes
でRemote
Row
Exists?
がNo
の場合、その行はローカル・データベース・オブジェクトには存在しますが、リモート・データベース・オブジェクトには存在しません。 -
行に対する
Local
Row
Exists?
がNo
でRemote
Row
Exists?
が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概要および管理』を参照してください。