Advanced usage#

LiveCompareが実行されると、作業ディレクトリにlc_session_<session_id> という名前のフォルダーが作成されます。このフォルダーには、次のファイルが含まれています。

  • lc_<execution_mode>_<current_date>.log —セッションのログファイル。

  • summary_<current_date>.out —処理されたすべてのテーブルのリスト。テーブルごとに、LiveCompareがテーブルの処理に要した時間、合計行数と処理された行数、テーブルで見つかった相違の数、および無視される列の最大数存在する場合を示します。

完全な概要を取得するには、出力データベースに対して次のクエリを実行することもできます。

select *
from <output_schema>.vw_table_summary
where session_id = <session_id>;
  • differences_<current_date>.out —違いに関する役立つ情報。違いがない場合、このファイルは生成されません。

以下は差分リストの例です。

+-------------------+-------------------------+-----------------+---------------------+
| table_name        | table_pk_column_names   |   difference_pk | difference_status   |
|-------------------+-------------------------+-----------------+---------------------|
| public.categories | category                |             (7) | P                   |
| public.categories | category                |            (10) | P                   |
| public.categories | category                |            (17) | P                   |
| public.categories | category                |            (18) | P                   |
+-------------------+-------------------------+-----------------+---------------------+

すべての詳細と差分の完全なリストを取得するには、出力データベースに対して次のクエリを実行できます。

select *
from <output_schema.vw_differences
where session_id = <session_id>;

LiveCompareコンセンサスがどのデータベースが発散しているかを決定するためにどのように機能したかを理解するために、ビューvw_consensus はコンセンサスアルゴリズムの詳細を提供できます。

select *
from <output_schema.vw_consensus
where session_id = <session_id>;
  • apply_on_the_first_<current_date>.sql —違いがある場合、このファイルは、最初のデータベースに適用して、他のすべてのデータベースと一貫性を保つDMLコマンドを示します。以下は、表に示されている相違点のスクリプトの例です。

BEGIN;

DELETE FROM public.categories WHERE (category) = 7;
UPDATE public.categories SET categoryname = $lc1$Games Changed$lc1$ WHERE (category) = 10;
INSERT INTO public.categories (category,categoryname) VALUES (17, $lc1$Test 1$lc1$);
INSERT INTO public.categories (category,categoryname) VALUES (18, $lc1$Test 2$lc1$);

COMMIT;

LiveCompareはこのスクリプトを生成します。最初のデータベースの不一致を修正するには、そのデータベースでスクリプトを実行します。

LiveCompareは、一貫性のないデータがあるデータベースごとに同様のapply_on_*.sql スクリプトを生成します。

比較の中止#

比較セッションを開始する前に、LiveCompareはすべての接続を試行します。到達可能な接続の数が少なくとも2つではない場合、LiveCompareはセッション全体を中止し、エラーメッセージを表示します。少なくとも2つの接続が到達可能な場合、LiveCompareは比較セッションを続行します。すべての接続で、LiveCompareはキャッシュデータベースのconnections テーブルにフラグconnection_reachable を書き込みます。

到達可能なすべての接続に対して、LiveCompareはデータベーステクノロジーとlogical_replication_mode 設定の周りのサニティチェックを実行します。サニティチェックのいずれかが失敗すると、LiveCompareは比較を中止し、エラーメッセージを表示します。

LiveCompareは、到達可能なすべての接続で使用可能なテーブルを考慮して、テーブルフィルタを考慮して、比較するテーブルのリストを構築します。特定のテーブルが少なくとも2つの接続に存在しない場合、その特定のテーブルの比較は中止されます。

LiveCompareは、最初にすべてのテーブルからメタデータを収集します。この手順は セットアップ と呼ばれます。セットアップ中にエラーが発生した場合、たとえば、ユーザーが特定のテーブルへのアクセスがない場合、それは セットアップエラー と呼ばれます。 abort_on_setup_error が有効になっている場合、LiveCompareは比較セッション全体を中止し、プログラムはエラーメッセージを表示して終了します。それ以外の場合、エラーが発生したテーブルのみがテーブル比較を中止し、LiveCompareは次のテーブルに移動します。

LiveCompareがテーブル比較を開始するテーブルごとに、LiveCompareは最初に到達可能なすべての接続でテーブル定義をチェックします。テーブルの列と列のデータ型が同じでない場合、LiveCompareはcolumn_intersection を適用します。比較する列がない場合、LiveCompareはテーブル比較を中止します。

比較キー#

比較されるテーブルごとに、テーブルのメタデータを収集するときに、LiveCompareは、次のルールに従って、テーブル比較で使用する比較キーを構築します。

  1. 設定されている場合、カスタム比較キーを使用します。

  2. または、可能な場合はPKを使用します。

  3. または、表にUNIQUE インデックスがある場合、すべてのNOT NULL 列を持つUNIQUE インデックスのうち、列の少ないUNIQUE インデックスを使用します。

  4. これらのいずれも不可能な場合は、すべてのNOT NULL 列を比較キーとして使用してみます。 ignore_nullable = false の場合、 NULL 列も考慮されます。

戦略1または4を比較キーとして使用することにした場合、LiveCompareはキーの一意性もチェックします。一意性が不可能な場合、LiveCompareはそのテーブルの比較を中止します。 check_uniqueness_enforcement = false を使用して、この動作を無効にできます。

修正する違い#

LiveCompareは、次の違いを特定して修正を提供できます。

  • 行は大部分のデータ接続に存在します。修正は、多様なデータベースのINSERT です。

  • 大部分のデータ接続には行が存在しません。修正は、発散データベースのDELETE です。

  • すべてのデータベースに行が存在しますが、一部の列値が不一致です。修正は、多様なデータベースのUPDATE です。

デフォルト設定はdifference_statements = all で、これは、LiveCompareが、検出した差分ごとに3つのDMLタイプINSERT 、UPDATE 、およびDELETE すべてを適用しようとすることを意味します。ただし、差分修正を提供するときに考慮するLiveCompareのDMLのタイプを指定できます。 difference_statements 設定の値を次の値のいずれかに変更します。

  • all デフォルト INSERT 、UPDATE 、およびDELETE DMLタイプを修正します。

  • inserts INSERT DMLタイプのみを修正します。

  • updates UPDATE DMLタイプのみを修正します。

  • deletes DELETE DMLタイプのみを修正します。

  • inserts_updates INSERT およびUPDATE DMLタイプのみを修正します。

  • inserts_deletes INSERT およびDELETE DMLタイプのみを修正します。

  • updates_deletes UPDATE およびDELETE DMLタイプのみを修正します。

difference_statements の値がall 、updates 、inserts_updates 、またはupdates_deletes の場合、NULL を列に設定するUPDATE を無視するようにLiveCompareに指示できます。

差分ログ#

テーブルdifference_log には、LiveCompareが差分をチェックするたびに、差分に関するすべての情報を保存します。 LiveCompareは再チェックモードで複数回実行できるため、この表は、LiveCompareが再チェックしていた時間枠で差がどのように変化したかを示しています。

  • Detected (D) 差分が検出されたばかりです。再チェックおよび修正モードでは、LiveCompareはすべての永続的な差分とタイの差分を検出済みとしてマークするため、それらを再チェックできます。

  • Permanent (P) 差分を再確認した後、データがまだ発散している場合、LiveCompareは差分をPermanentとしてマークします。

  • Tie (T) このエントリーはパーマネントと同じですが、マジョリティである接続を決定するための十分なコンセンサスがありません。

  • Absent (A) 再チェック時に、LiveCompareで差分が存在しないことが判明した場合、つまり、行が両方のデータベース間で一貫している場合、LiveCompareは差分をAbsentとしてマークします。

  • Volatile V 再チェック時に、一貫性のない行でxmin が変更された場合、LiveCompareはその差をVolatileとしてマークします。

  • Ignored(I) 出力PostgreSQL接続でファンクション<livecompare_schema_name>.accept_divergence(session_id, table_name, difference_pk) を手動で呼び出すことにより、特定の差異の差分再チェックを停止できます。例

SELECT livecompare.accept_divergence(
    2                   -- session_id
  , public.categories -- table_name
  , $$(10)$$            -- difference_pk
);