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 :違いがある場合、このファイルは first データベースに適用される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はこのスクリプトを自動的に生成します。 first データベースの不一致を修正するには、 first データベースでスクリプトを実行するだけです。

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

比較中絶

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

到達可能なすべての接続について、LiveCompareはデータベーステクノロジーと設定 logical_replication_mode についていくつかの健全性チェックを行います。いずれかの健全性チェックが失敗した場合、LiveCompareは適切なエラーメッセージを表示して比較を中止します。

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

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

各テーブルに対して、LiveCompareはテーブル比較を開始します。最初に、到達可能なすべての接続でテーブル定義を確認します。テーブルの列と列のデータ型が異なる場合、LiveCompareはcolumn_intersection を適用します。比較する列がない場合、 LiveCompare はテーブルの比較を中止します。

比較キー

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

1-ユーザーが構成した場合はカスタムComparison Key を使用します。または

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 )をすべて適用しようとすることを意味します。ただし、設定difference_statements の値を変更することにより、違いの修正を提供するときに検討するDML LiveCompareの種類を指定できます。

  • all (デフォルト): INSERT s、UPDATE s、およびDELETE sを修正します。

  • inserts :INSERT sのみを修正します。

  • updates :UPDATE sのみを修正します。

  • deletes :DELETE sのみを修正します。

  • inserts_updates :INSERT sとUPDATE sのみを修正します。

  • inserts_deletes :INSERT sとDELETE sのみを修正します。

  • updates_deletes : UPDATE sとDELETE sのみを修正。

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

差分ログ

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

  • 検出(D) :違いが検出されました。再確認モードと修正モードでは、LiveCompareはすべての永久差とタイ差を検出済みとしてマークします。

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

  • 同点(T) :Permanentと同じですが、どの接続が多数派であるかを判断するための十分なコンセンサスがありません。

  • 不在(A) :再チェック時に違いが存在しないことがLiveCompareによって検出された場合(行は両方のデータベースで一貫しています)、LiveCompareは違いを 不在 としてマークします。

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

  • 無視(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
);