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コマンドが表示されmake。 first データベースは他のすべてのデータベースと一貫しています。例、 上記の違いにより、このスクリプトは次のようになります。

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は到達可能なすべての接続のテーブル定義をチェックします。テーブルに同じ列と列データ型がない場合、LiveCompareはcolumn_intersectionを適用します。比較する列がない場合、LiveCompareはテーブル比較を中止します。

比較キー

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

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

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

3.テーブルにUNIQUEインデックスがある場合:すべてのNOT NULL列を持つUNIQUEインデックスの中で、少ない列を持つUNIQUEインデックスを使用します。または

4.上記のいずれも不可能な場合は、すべてのNOT NULL列を比較キーとして使用してみてください(NULL列は、ignore_nullable = falseの場合も考慮できます)。

上記のストラテジー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(デフォルト):INSERTs、UPDATEs、およびDELETEsを修正。

  • inserts:INSERTsのみを修正。

  • updates:UPDATEsのみを修正。

  • deletes:DELETEsのみを修正。

  • inserts_updates:INSERTsおよびUPDATEsのみを修正。

  • inserts_deletes:INSERTsおよびDELETEsのみを修正。

  • updates_deletes:UPDATEsおよびDELETEsのみを修正。

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

差分ログ

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

  • 検出済み(D) :違いが検出されたばかりです。再確認および修正モードでは、 LiveCompareは、すべてのパーマネントとタイの違いを検出済みとしてマークし、 それらを再確認してください。

  • パーマネント(P) :データがまだ残っている場合、差異を再チェックした後 LiveCompareは相違点を Permanent としてマークします。

  • Tie(T) :Permanentと同じですが、決定するための十分なコンセンサスがありません どの接続が大半です。

  • 不在(A) :再チェック時に、LiveCompareが違いを発見した場合 もう存在しない(行は両方のデータベース間で一貫している)、その後 LiveCompareは、差異を 不在 としてマークします。

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

  • 無視(I) :ユーザーは、特定の差異の差異再チェックを停止できます。 手動でファンクションを呼び出す <livecompare_schema_name>.accept_divergence(session_id, table_name, difference_pk) 出力PostgreSQL接続で。例:

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