Advanced usage
==============

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

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

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

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

.. code:: postgresql

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

- ``differences_<current_date>.out``
  —違いに関する役立つ情報。違いがない場合、このファイルは生成されません。

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

.. code:: text

   +-------------------+-------------------------+-----------------+---------------------+
   | 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                   |
   +-------------------+-------------------------+-----------------+---------------------+

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

.. code:: postgresql

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

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

.. code:: postgresql

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

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

.. code:: postgresql

       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)``
  を手動で呼び出すことにより、特定の差異の差分再チェックを停止できます。例

.. code:: postgresql

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