Settings#
一般設定#
logical_replication_modeプログラムが接続とテーブルフィルタ設定を解釈する方法、および比較を開始する前に接続でチェックする要件に影響します。現在、使用可能な値は次のとおりです。offデータベース間に論理レプリケーションがないことを想定しています。nativeデータベース間にネイティブ論理レプリケーションがあることを想定しています。Table Filter -> publications設定の使用を有効にして、使用するテーブルのリストを指定します。すべてのデータベースでPostgreSQL 10+が必要です。pglogicalデータベース間にpg論理レプリケーションがあることを前提としています。Table Filter -> replication_sets設定の使用を有効にして、使用するテーブルのリストを指定します。また、node_nameを使用してデータ接続を指定できるようにします。これには、ノードのDSN情報を取得するために使用されるInitial Connectionの設定が必要です。すべてのデータベースにpglogical拡張機能をインストールする必要があります。bdrすべてのデータ接続が同じPGDクラスターからのノードであると仮定します。Table Filter -> replication_sets設定の使用を有効にして、使用するテーブルのリストを指定します。また、node_nameを使用してデータ接続を指定できるようにします。これには、ノードのDSN情報を取得するために使用されるInitial Connectionの設定が必要です。すべてのデータベースにpglogicalおよびbdr拡張機能をインストールする必要があります。
all_bdr_nodeslogical_replication_modeがbdrに設定されている場合、初期接続のみを指定し、LiveCompareにアクティブなPGDノードの現在のリストに基づいて接続リストを構築させることができます。デフォルトoffmax_parallel_workers考慮する並列プロセスの数。各プロセスは、キューからテーブルで動作します。デフォルト2
重要
各プロセスはN+1のオープン接続を保持します。1つは各データ接続に、もう1つは出力データベースにです。
buffer_sizeすべてのデータ取得操作でテーブルから取得する行数。デフォルト4096log_levelログファイルの詳細レベル。可能な値debug、info、warning、またはerror。デフォルトinfodata_fetch_modeLiveCompareがデータベースからデータを取得する方法に影響します。prepared_statementsデータの取得にプリペアドステートメントLIMITを使用したクエリーを使用します。毎回、非常に少量のデータデフォルトではbuffer_size = 4096行のみが取得されるため、3つのモードすべての中で最も影響が最も小さく、同じ理由でより安全な取得モードです。非同期データの取得を許可しますparallel_data_fetchで定義一般的なユースケースでは、この取得方法は良好なパフォーマンスを提供しますが、大規模なテーブルではパフォーマンスの低下が感じられる場合があります。これはデフォルトであり、サーバー負荷が中〜高の場合に強くお勧めします。server_side_cursors_with_holdデータの取得にサーバーサイドのカーソルWITH HOLDを使用します。テーブルデータは単一のトランザクションで取得されるため、xminが抑制され、肥大化とレプリケーションの問題が発生し、VACUUMの正常な実行を妨げる可能性があります。また、WITH HOLD句は、クエリをマテリアライズするようにPostgresに指示するため、ワーカーはデータがマテリアライズされるまで数秒ハングする可能性がありますため、テーブルデータ全体がRAMを消費し、一時ファイルとしてPostgresサイドディスクに保存できます。parallel_chunk_rowsデフォルトで無効を使用することにより、その影響をすべて軽減し、buffer_sizeを少し増やすことにより速度を向上させることができます。非同期データの取得を許可しますparallel_data_fetchで定義一般的な使用ケースでは、この取得方法はprepared_statamentsと比較して利点はありませんが、複数の小さなテーブルの場合、より高速です。ただし、このモードは、テストや移行シナリオなど、負荷が非常に低い場合にのみお勧めします。server_side_cursors_without_holdデータの取得にサーバーサイドのカーソルWITHOUT HOLDを使用します。server_side_cursors_with_holdと同様、このモードはxminを抑制することもできるため、Postgresでの肥大化、VACUUM、およびレプリケーションの問題を発生させる可能性があります。ただし、WITHOUT HOLDカーソルは比較セッション全体でオープンなトランザクションを必要とするため、このような影響はより高くなります。この要件は後のバージョンで解除されます。スナップショットは比較セッション全体で保持されるため、ユースケースによっては、比較結果が役立つ場合があります。クエリは実体化されないため、メモリ使用量と一時ファイルの生成は低いままです。非同期データの取得は許可されていません。パフォーマンスの面では、このモードは一般的なユースケースでは遅くなりますが、大規模なテーブルの場合、このモードの方が速くなる場合があります。データベースの負荷が低〜中程度の場合にお勧めします。
重要
適切なシナリオに適切な`data_fetch_mode` を選択することは非常に重要です。準備されたステートメントを使用すると、データベースサーバーのフットプリントが最小になるため、最も安全なアプローチであり、一般的なユースケースに適しています。もう1つのポイントは、準備されたステートメントを使用すると、LiveCompareが常に最新バージョンの行を参照できるということですが、これは、ビジー状態のデータベースでサーバーサイドのカーソルを使用している場合には発生しない場合があります。したがって、実稼働の高負荷サーバーには`prepared_statements` を使用し、テスト、移行シナリオ、低負荷サーバーには`server_side_cursors_*` 設定のいずれかを使用することをお勧めします。最良の戦略は、おそらく、非常に大規模なテーブルに`server_side_cursors_without_hold` を使用し、残りのテーブルに`prepared_statements` を混合することです。次の表は、費用/便益比の比較を示しています。
prepared statements |
server side cursors with hold |
server side cursors without hold |
|
|---|---|---|---|
xmin hold |
very low |
medium |
high |
xmin released per |
buffer |
chunk |
whole comparison session |
temp files |
very low |
very high |
low |
memory |
very low |
high |
low |
allows async conns |
yes |
yes |
no |
fastest for |
general |
small tables |
large tables |
recommended load |
high |
very low |
low-medium |
parallel_chunk_rows並列比較のためにテーブルを複数のチャンクに分割することを検討するために必要な最小行数。データの取得にはハッシュが使用されるため、ワーカーは互いに衝突しません。各テーブルチャンクにはparallel_chunk_rows行以下があります。任意の値<1に設定すると、テーブル分割が無効になります。デフォルト0無効。
重要
テーブル分割は、複数のワーカーが大きなテーブルを並列比較するのに役立ちますが、各ワーカーのパフォーマンスは、すべての行に適用されるハッシュ条件の影響を受ける可能性があります。 Postgresの構成によっては、特にデフォルトの`random_page_cost = 4` では、最近のハードドライブには保守的すぎると考えられますが、Postgresクエリプランナーは誤ってビットマップヒープスキャンを優先する場合があります。データベースがSSDで実行されている場合、LiveCompareでビットマップヒープスキャンを無効にすると、比較パフォーマンスが大幅に向上します。 start_query 設定を使用して、接続ごとにこれを行うことができます。
start_query = set enable_bitmapscan = off
parallel_data_fetchデータの取得を並列的に実行するかどうかを指定しますつまり、データベースへの非同期接続を使用します。多方向比較のパフォーマンスが向上します。 PostgreSQLではないデータ接続がある場合、この設定は自動的に無効になります。data_fetch_mode = prepared_statementsまたはdata_fetch_mode = server_side_cursors_with_holdの場合にのみ許可されます。デフォルトoncomparison_algorithmLiveCompareがテーブル行を介してデータを比較する方法に影響します。ハッシュを使用すると、完全な行比較よりも高速です。次の値のいずれかになります。full_rowハッシュを使用した行比較を無効にします。この場合、完全な比較は、行を列ごとに比較することにより実行されます。 Oracle 10gデータベースを含む比較の場合、full_rowは唯一の有効なcomparison_algorithm設定値であることに注意してください。row_hashハッシュを使用した行比較を有効にし、テーブルの分割を有効にします。テーブルは分割されているため、各ワーカーはテーブルごとの最大parallel_chunk_rowsを比較します。 PostgreSQLではデータ行がハッシュされるため、比較はfull_rowよりも高速です。ただし、特定の行のハッシュが一致しない場合、その特定の行に対して、LiveCompareはfull_rowアルゴリズムにフォールバックしますつまり、行ごとに比較します。データ接続がPostgreSQLではない場合、LiveCompareは、検討中の行の連結列値のMD5ハッシュとして定義された行ハッシュ、比較対象のデータベーステクノロジー間の 共通ハッシュ を使用します。block_hash同様に動作しますrow_hashと同様ですが、LiveCompareは行ごとに比較する代わりに、 ブロックハッシュ 、つまり、取得されたばかりのデータバッファー最大buffer_size行のすべての行のハッシュのハッシュをビルドします。概念的には、2レベルのマークルツリーのように機能します。ブロックのハッシュが一致する場合、LiveCompareはブロック全体を進めます。これが、この比較アルゴリズムがrow_hashよりも高速である理由です。ブロックハッシュが一致しない場合、LiveCompareはrow_hashにフォールバックし、バッファーで行ごとに比較を実行して、発散する行を見つけます。これはデフォルト値です。
min_time_between_heart_beatsハートビート メッセージをログに記録するまで待機する秒単位の時間。各ワーカーは、比較されるラウンドパーツごとに個別に追跡します。デフォルト30秒。min_time_between_round_saves比較アルゴリズムが進行中のときに各ラウンドの状態を更新するまで待機する秒単位の時間。ラウンド保存はハートビート中にのみ発生できるため、min_time_between_round_savesはmin_time_between_heart_beats以上である必要があります。ラウンドが終了すると、LiveCompareは常にそのテーブルのラウンドの状態を更新します。デフォルト60秒。
重要
**Ctrl-C**を押してLiveCompareの実行をキャンセルし、再度開始すると、LiveCompareはラウンドの状態が保存されたポイントから開始して、そのテーブルのラウンドを再開します。
comparison_cost_limit> 0の場合、comparison_cost_delay秒の昼寝をする前に各ワーカーが処理する行数に対応します。デフォルト0は、各ワーカーが昼寝をせずに行を処理することを意味します。comparison_cost_delaycomparison_cost_limit > 0の場合、この設定は各ワーカーのスリープ時間を指定します。デフォルト0.0stop_after_timeCtrl-C を押したかのようにLiveCompareが停止する秒単位の時間。コマンドラインの引数としてセッションIDを渡すことにより、中断された比較セッションがまだ終了していない場合は再開できます。デフォルトstop_after_time = 0、これは自動中断が無効であることを意味します。consensus_modeどのデータ接続が発散しているかを判断するためにLiveCompareが使用するコンセンサスアルゴリズム。使用可能な値はsimple_majority、quorum_based、またはsource_of_truthです。consensus_mode = source_of_truthの場合、difference_sources_of_truthを入力する必要があります。デフォルトsimple_majoritydifference_required_quorumconsensus_mode = quorum_basedの場合、この設定は、どの接続が発散しているかを決定するために必要な最小クォーラムを指定します。 0.0〜1.0の数値である必要があります。 0.0は接続が必要ないことを意味し、1.0はすべての接続が必要であることを意味します。どちらの場合も極端であるため、使用をお勧めしません。デフォルト値は0.5であり、それに近い値を使用することをお勧めします。difference_sources_of_truth真実のソースとして検討する接続名またはノード名、logical_replication_mode = bdrおよびall_bdr_nodes = onの場合、ノード名をコンマ区切りのリスト。consensus_mode = source_of_truthの場合にのみ使用されます。例difference_sources_of_truth = node1,node2この例では、node1 Connectionおよびnode2 Connectionのいずれかを.iniファイルまたはall_bdr_nodes = onで定義する必要があり、Initial Connectionのみが定義されますが、node1およびnode2は有効なPGDノード名である必要があります。difference_tie_breakersコンセンサスアルゴリズムがタイ状況を見つけたときは常に、タイブレーカーとして考えられる接続名またはノード名、logical_replication_mode = bdrおよびall_bdr_nodes = onの場合はノード名。例difference_tie_breakers = node1,node2この例では、セクションnode1 Connectionおよびnode2 Connectionsのいずれかを.iniファイルまたはall_bdr_nodes = onで定義する必要があり、Initial Connectionのみが定義されますが、node1およびnode2は有効なPGDノード名である必要があります。デフォルト 接続をタイブレーカーとして考慮しません。difference_statementsLiveCompareが生成するDMLステートメントの種類を制御します。difference_statementsの値は次のいずれかです。allデフォルトinsertsupdatesdeletesinserts_updatesinserts_deletesedb_17_
difference_allow_null_updatesUPDATE SET col = NULLのようなコマンドを差分レポートで許可するかどうかを決定します。デフォルトondifference_statement_orderLiveCompareが生成するDMLステートメントの順序を制御します。difference_statement_orderの値は次のいずれかです。delete_insert_updatedelete_update_insertデフォルトinsert_update_deleteinsert_delete_updateupdate_insert_deleteupdate_delete_insert
difference_fix_replication_originPGDデータベースを使用する場合、違いのために、LiveCompareは特定のレプリケーションオリジンがまだ存在しない場合は作成します。次に、レプリケーションオリジンを使用して、DML修正を含む適用スクリプトを作成します。difference_fix_replication_originは、LiveCompareが使用するレプリケーションオリジンの名前を指定します。この設定の値を設定しない場合、LiveCompareはdifference_fix_replication_origin = bdr_local_only_originを設定します。 LiveCompareが作成するレプリケーションオリジンは、比較後の検証を可能にするためにドロップされません。ただし、必要に応じて、後でレプリケーションオリジンを手動でドロップできます。logical_replication_mode = bdrが必要です。
重要
PGD 3.6.18では、ローカル専用トランザクションを適用するために使用する新しい事前作成された`bdr_local_only_origin` レプリケーションオリジンを導入しました。したがって、LiveCompareがPGD 3.6.18に接続されている場合、このレプリケーションオリジンは作成されないため、このレプリケーションオリジンを削除しないことをお勧めします。
difference_fix_start_queryLiveCompareによって生成された適用スクリプトの先頭で実行される任意のクエリー。さらに、 PGD比較が実行されており、difference_fix_start_queryが空の場合、 LiveCompareは以下も自動的に行います。発散接続がPGD 3.6.7の場合、
SET LOCAL bdr.xact_replication = off;difference_fix_replication_originで指定されたレプリケーションオリジンを使用するようにトランザクションを設定するコマンドを追加します。
show_progress_barsコンソール出力に進行状況バーを表示するかどうかを決定します。この設定を無効にすると、バッチ実行に役立つ場合があります。デフォルトonoutput_schema出力接続で、比較レポートテーブルが作成されるスキーマ。デフォルトlivecomparehash_column_nameすべてのデータ取得には、行内のすべての実際の列のハッシュである特定の列が含まれます。この設定は、この列の名前を指定します。デフォルトlivecompare_hashrownumber_column_name一部の取得では、クエリ列内でrow_number()ファンクション値を使用する必要があります。この設定は、この列の名前を指定します。デフォルトlivecompare_rownumberfetch_row_originこの設定が有効になっている場合、LiveCompareは発散する各行のオリジン名を取得します。これは、デバッグの目的で役立つ場合があります。有効にするには、logical_replication_modeをpglogicalまたはbdrに設定する必要があります。デフォルトoffcolumn_intersectionこの設定が有効になっている場合、比較される特定のテーブルについて、LiveCompareはすべての接続でテーブルの列の交差点でのみ動作し、接続に存在する可能性のある追加の列を無視します。この設定が無効になっている場合、LiveCompareは、すべての接続のテーブルで列が同等であるかどうかを確認し、列の不一致がある場合はテーブルの比較を中止します。デフォルトoff
重要
テーブルにPKがある場合、 column_intersection = on であっても、PK列は異なることはできません。
ignore_nullable特定のテーブル比較で、LiveCompareが主キーとは異なる比較キーを使用している場合、LiveCompareはignore_nullableが有効になっているデフォルトの場合、すべての列をNOT NULLにする必要があります。ignore_nullable = offを設定することにより、その動作をオーバーライドできます。これにより、LiveCompareは比較でNull許容列を考慮できます。これは、一部のコーナーケースで偽陽性を生成する可能性があります。check_uniqueness_enforcementLiveCompareがユーザー定義の比較キーを使用しているか、テーブル内のすべての列を比較キーとして使用している場合、LiveCompareはcheck_uniqueness_enforcement設定が有効になっているデフォルトで比較キーのテーブルの一意性をチェックします。oracle_ignore_unsortable有効にすると、列がテーブルPKの一部でない場合、Oracleのソート不可データ型 BLOB、 CLOB、 NCLOB、 BFILE の列を無視するようにLiveCompareに指示します。この設定を有効にする場合、column_intersectionも有効にすることをお勧めします。oracle_user_tables_only有効にすると、Oracleにログインしたユーザーからのみテーブルメタデータを取得するようにLiveCompareに指示します。このアプローチは、たとえば、sys.all_tablesおよびsys.all_tab_columnsの代わりにsys.user_tablesおよびsys.user_tab_columnsから読み取るため、高速です。デフォルトofforacle_fetch_fk_metadata有効にすると、外部キーメタデータを取得するようにLiveCompareに指示します。これは、遅い操作になる場合があります。 Oracle接続のfetch_fk_metadata設定の値をオーバーライドします。デフォルトoffschema_qualified_table_namesこの設定が有効になっている場合、テーブル名はスキーマ修飾されたものとして扱われます。これを無効にすると、スキーマ修飾テーブル名を使用せずにテーブルを比較できます。 Oracle x Postgresの比較では、oracle_user_tables_onlyも有効にする必要があります。 Postgres x Postgresでは、同じデータベース内でも、異なるスキーマの下にあるテーブルの比較ができます。また、schema_qualified_table_namesが有効になっている場合、Table Filter -> tables、Row Filter、およびColumn Filterは、スキーマ名のないテーブル名を許可します。デフォルトonforce_collateoff以外の値および有効な照合名に設定されている場合、比較対象のすべてのPostgresデータベースのORDER BY操作で指定された照合名を強制します。異なる照合順序でPostgresデータベースを比較する場合、またはOracleとPostgresデータベースを比較する場合に役立ちます。この場合、force_collate = Cを設定します。混合テクノロジーOracleとPostgreSQLなどを比較し、照合順序が指定されていない場合、値Cになります。デフォルトoffwork_directoryLiveCompare作業ディレクトリへのパス。出力ファイルを含むセッションフォルダーがこのディレクトリに作成されます。デフォルト.現在のディレクトリ。abort_on_setup_error有効にすると、テーブル比較ラウンドを設定しようとしたときにLiveCompareがエラーを発生すると、比較セッション全体が中止されます。デフォルトoff
重要
abort_on_setup_error 設定は`compare` モード中にのみ考慮されます。 recheck モードでは、LiveCompareは常にセットアップの最初のエラーで強制終了します。
custom_dollar_quoting_delimiterLiveCompareが違いを見つけると、文字列にドル引用符を使用してDMLを出力します。デフォルトの動作では、ランダムな文字列を作成して構成します。どうしてもカスタムのものを使用したい場合は、このパラメーターを使用する区切り文字として設定できます。定数のみを設定する必要があり、定数の周囲の$シンボルは設定する必要はありません。デフォルトoff、これはLiveCompareがワードLiveCompareのmd5ハッシュを使用することを意味します。session_replication_role_replica有効にすると、LiveCompareはsession_replication_rolePostgreSQL設定を出力適用スクリプトでreplicaとして使用します。これは、発散があるノードでDMLを適用しているときにトリガーとルールが起動されないようにしたい場合に役立ちます。これを有効にするには、PostgreSQLのスーパーユーザーが必要です。それ以外の場合、効果はありません。デフォルトoffsplit_updates有効にすると、LiveCompareはUPDATE発散を分割します。つまり、UPDATEDMLを生成する代わりに、適用スクリプトで対応するDELETEおよびINSERTを生成します。デフォルトofffloat_point_roundデータベースからの浮動小数点値を比較するときにLiveCompareが丸める10進数を指定する整数。デフォルト-1、浮動小数点の丸めを無効にします。
初期接続#
初期接続は、logical_replication_mode がpglogical
またはbdr に設定されている場合にのみ使用されます。 node_name
設定のみを使用するようにデータ接続を設定している場合、プログラムがノード名からDSNの取得を開始するときに使用されます。
technologyRDBMSテクノロジー。現在、使用可能な値はpostgresqlのみです。dsnPostgreSQL接続文字列。dsnが設定されている場合、host、port、dbname、およびuserは無視されます。dsn設定には、他のすべての parameter key words allowed by libpq を含めることもできます。hostサーバーアドレス。 Unixソケット接続を使用する場合は、空のままにします。portポート。デフォルト5432dbnameデータベース名。デフォルトpostgresuserデータベースユーザー。デフォルトpostgresapplication_name.アプリケーション名。他のすべての接続情報の代わりにdsnを設定した場合でも使用できます。デフォルトlivecompare_initial
出力接続#
出力接続は、LiveCompareが比較レポートテーブルを作成する場所を指定します。
technologyRDBMSテクノロジー。現在、使用可能な値はpostgresqlのみです。dsnPostgreSQL接続文字列。dsnが設定されている場合、host、port、dbname、およびuserは無視されます。dsn設定には、他のすべての parameter key words allowed by libpq を含めることもできます。hostサーバーアドレス。 Unixソケット接続を使用する場合は、空のままにします。portポート。デフォルト5432dbnameデータベース名。デフォルトpostgresuserデータベースユーザー。デフォルトpostgresapplication_name.アプリケーション名。他のすべての接続情報の代わりにdsnを設定した場合でも使用できます。デフォルトlivecompare_output
データ接続#
データ接続は、Initial Connection およびOutput Connection
と同様の接続セクションですが、LiveCompareはデータ接続上のデータを効果的に取得および比較します。
Initial Connection およびOutput Connection
と同様に、データ接続は名前付けセクションで定義されます。セクション名は<Name> Connection
の形式であり、 <Name>
は、英文字で始まる任意の1ワード文字列です。この場合、Name
として使用するものは、データ接続の 接続ID
と呼ばれます。各データ接続には、データ接続のリスト内で一意の接続IDが必要です。
logical_replication_mode = bdr およびall_bdr_nodes = on
の場合、データ接続を指定する必要はありません。
LiveCompareは、Initial Connection
からPGDメタデータを取得することにより、データ接続リストを構築します。
technologyRDBMSテクノロジー。現在使用可能な値はpostgresqlまたはoracleです。node_nameクラスター内のノードの名前。logical_replication_modeをpglogicalまたはbdrに設定する必要があり、Initial Connectionが埋められることも必要です。node_nameが設定されている場合、dsn、host、port、dbname、およびuser設定はすべて無視されます。dsnPostgreSQL接続文字列。dsnが設定されている場合、host、port、dbname、およびuserは無視されます。dsn設定には、他のすべての parameter key words allowed by libpq を含めることもできます。hostサーバーアドレス。 Unixソケット接続を使用する場合は、空のままにします。portポート。デフォルト5432dbnameデータベース名。デフォルトpostgresserviceOracle接続で使用されるサービス名。デフォルトXEuserデータベースユーザー。デフォルトpostgrespasswordプレーンテキストのパスワード。これの使用はお勧めしません。ただし、一部の古い接続では必要になる場合があります。application_name.アプリケーション名。他のすべての接続情報の代わりにdsnまたはnode_nameを設定した場合でも使用できます。デフォルトlivecompare_<Connection ID>start_queryデータベースへの接続が開くたびに実行される任意のクエリー。fetch_fk_metadataLiveCompareが接続上の外部キーに関するメタデータを収集するかどうかを指定します。デフォルトon
テーブルフィルタ#
.ini
ファイルのこのセクションは、省略するか空のままにした場合、最初のデータベースのすべてのテーブルに対してLiveCompareが実行されることを意味します。
特定のテーブルセットに対してLiveCompareを実行する場合、これを指定するさまざまな方法があります。
publications特定のパブリケーションをフィルタリングできます。LiveCompareは、これらのパブリケーションに関連付けられているテーブルのみを使用します。変数publication_nameを使用して、条件式を構築できます。たとえば、
publications = publication_name = livepub
logical_replication_mode = native が必要です。
replication_setspglogicalまたはPGDを使用する場合、特定のレプリケーションセットをフィルタリングでき、LiveCompareはこれらのレプリケーションセットに関連付けられているテーブルでのみ動作します。変数set_nameを使用して、条件式を構築できます。たとえば、
replication_sets = set_name in (default, bdrgroup)
logical_replication_mode = pglogical
またはlogical_replication_mode = bdr が必要です。
schemas特定のスキーマをフィルタリングでき、LiveCompareはそれらのスキーマに属するテーブルでのみ動作します。変数schema_nameを使用して、条件式を構築できます。たとえば、
schemas = schema_name != badschema
tables変数table_nameは、LiveCompareで作業するテーブルのみをフィルタリングする条件式を構築するのに役立ちます。例
tables = table_name not like %%account
条件式で、 % 文字を%% としてエスケープします。
schema_qualified_table_names
が無効になっていない限り、テーブル名はスキーマ修飾する必要があります。たとえば、特定のテーブルのリストのみをフィルタリングできます。
tables = table_name in (myschema1.mytable1, myschema2.mytable2)
一般設定schema_qualified_table_names
を無効にする場合、接続start_query
設定でPostgresの適切なsearch_path も設定する必要があります。例
[General Setting]
...
schema_qualified_table_names = off
[My Connection]
...
start_query = SET search_path TO myschema1, myschema2
[Table Filter]
tables = table_name in (mytable1, mytable2)
重要
search_path で設定された2つ以上のスキーマに同じ名前のテーブルが含まれる場合、最初に見つかったもののみが比較の対象となります。
Table Filter セクションには、publications
、replication_sets 、schemas 、およびtables
フィルターを組み合わせることができます。
LiveCompareは、指定したすべてのフィルタの交差部分にあるテーブルのセットを検討します。例
[Table Filter]
publications = publication_name = livepub
replication_sets = set_name in (default, bdrgroup)
schemas = schema_name != badschema
tables = table_name not like %%account
テーブルフィルタは、最初にデータベースに適用されてテーブルリストを構築します。テーブルが最初のデータベースに存在し、フィルタで検討されているが、他のデータベースに存在しない場合、次のようなものがログに追加され、その特定のテーブルの比較がスキップされます。
2019-06-17 11:52:41,403 - ERROR - live_table.py - 55 - GetMetaData - P1: livecompare_second_1: Table public.test does not exist
2019-06-17 11:52:41,410 - ERROR - live_round.py - 201 - Initialize - P1: Table public.test does not exist on second connection. Aborting comparison
同様に、テーブルが他のデータベースに存在するが、最初のデータベースに存在しない場合、テーブルフィルタを適用しなかった場合でも、比較では考慮されません。
テーブルの列名が完全に同じでなくcolumn_intersection
が有効になっていない限り、同じ順序である場合、特定のテーブルの比較もスキップされます。適切なメッセージもログファイルに追加されます。
現在、LiveCompareは、両方のテーブルでデータ型または制約が同じであるかどうかをチェックしません。
重要
conflicts モードはテーブルフィルターを利用しません。
行フィルタ#
このセクションでは、行レベルのフィルタを任意のテーブルに適用できるため、LiveCompareは行フィルタを満たす行にのみ機能します。
このセクションの下に、テーブルのリストを1行に1テーブルずつ書くことができます。
schema_qualified_table_names
が無効になっていない限り、すべてのテーブル名はスキーマ修飾されている必要があります。例
[Row Filter]
public.table1 = id = 10
public.table2 = logdate >= 2000-01-01
この場合、テーブルpublic.table1 の場合、LiveCompareはid = 10
句を満たす行でのみ機能します。テーブルpublic.table2
の場合、logdate >= '2000-01-01
を満たす行のみが比較の対象となります。
一般設定schema_qualified_table_names
を無効にする場合、接続start_query
設定でPostgresの適切なsearch_path も設定する必要があります。例
[General Setting]
...
schema_qualified_table_names = off
[My Connection]
...
start_query = SET search_path TO public
[Row Filter]
table1 = id = 10
table2 = logdate >= 2000-01-01
あらゆる種類のSQL条件 WHERE
句に入力するのと同じものは、テーブル行フィルタと同じ行で受け入れられます。たとえば、大規模なテーブルがあり、特定の数のIDのみを比較する場合は、すべてのIDを使用して一時テーブルを作成できます。次に、次のように
IN 句を使用してJOIN をエミュレートできます。
[Row Filter]
public.large_table = id IN (SELECT id2 FROM temp_table)
行フィルタが誤って書き込まれている場合、LiveCompareはフィルタを適用しようとしますが、失敗します。したがって、この特定のテーブルの比較はスキップされ、例外がログファイルに書き込まれます。
テーブルがRow Filter
セクションにリストされているが、どういうわけかTable Filter
によってフィルタリングされている場合、このテーブルの行フィルタはサイレントに無視されます。
重要
conflicts モードは行フィルターを利用しません。
行フィルタで現在のタイムスタンプを使用する#
Row Filter は、data_fetch_mode
に応じて異なる方法で適用されます。
Postgresでは、
data_fetch_modeをserver_side_cursors_with_holdまたはserver_side_cursors_without_holdに設定すると、クエリが実行されるテーブル比較の先頭にのみRow Filterが適用されます。これは、サーバーサイドのカーソルを使用してデータを取得すると、データが比較の開始時の状態のスナップショットとして表示されることを意味します。Postgresでは、
data_fetch_modeをprepared_statementsデフォルトに設定すると、準備されたクエリーにRow Filterが含まれ、取得されるすべてのデータバッファーで実行されます。これは、クエリがRow Filterでnow()、CURRENT_TIMESTAMP、またはSYSDATEEDB Postgres Advanced Serverでを使用する場合、準備されたステートメントが実行されると、Postgresが現在のタイムスタンプを再評価することを意味します。
したがって、Row Filter でnow() 、CURRENT_TIMESTAMP
、またはSYSDATE を使用しているとします。たとえば
[Row Filter]
public.table3 = logdate < CURRENT_TIMESTAMP
この場合、サーバーサイドのカーソルを使用して、現在のタイムスタンプがクエリの先頭でのみ評価されるようにする必要があります。つまり、
data_fetch_mode はprepared_statements
とは異なる値に設定する必要があります。
Oracleでは、data_fetch_mode
設定は無視され、クエリーは最初に実行されます。次に、データはクライアントサイドのカーソルを介して取得されます。このアプローチにより、データは比較の開始時の状態のスナップショットとして表示されます。これはクライアントサイドのカーソルですが、動作はPostgresでサーバーサイドのカーソルを使用するのと似ています。
列フィルタ#
このセクションでは、列レベルのフィルターを任意のテーブルに適用できるため、LiveCompareは列フィルターの一部ではない列でのみ機能します。
このセクションの下に、テーブルのリストを1行に1テーブルずつ書くことができます。
schema_qualified_table_names
が無効になっていない限り、すべてのテーブル名はスキーマ修飾されている必要があります。たとえば、
public.table1 とpublic.table2 の両方に列column1
、column2 、column3 、column4 、およびcolumn5
があるとします。
[Column Filter]
public.table1 = column1, column3
public.table2 = column1, column5
この場合、テーブルpublic.table1
の場合、LiveCompareは列column2 、column4
、およびcolumn5 でのみ機能し、column1 およびcolumn3
をフィルタリングします。テーブルpublic.table2
の場合、列column2 、column3 、およびcolumn4
のみが比較で考慮され、column1 およびcolumn5
がフィルタリングされます。
一般設定schema_qualified_table_names
を無効にする場合、接続start_query
設定でPostgresの適切なsearch_path も設定する必要があります。例
[General Setting]
...
schema_qualified_table_names = off
[My Connection]
...
start_query = SET search_path TO public
[Column Filter]
table1 = column1, column3
table2 = column1, column5
存在しない列名が列フィルタで指定されている場合、つまり、列が指定されたテーブルに存在しない場合、LiveCompareは欠落している列に関するメッセージをログに記録し、それらを無視します。有効なものがある場合のみを使用します。
テーブルがColumn Filter
セクションにリストされているが、何らかの理由でTable Filter
によってフィルタリングされている場合、このテーブルの列フィルタはサイレントに無視されます。
重要
Column Filter で指定された列がテーブルPKの一部である場合、比較で無視されません。 LiveCompareはそれをログに記録し、このような列のフィルターを無視します。
重要
conflicts モードは列フィルターを利用しません。
比較キー#
Column Filter
と同様に、このセクションでは、テーブルごとに列のリストを指定することもできます。これらの列は、テーブルに主キーまたはUNIQUE
制約がある場合でも、特定のテーブルの比較キーとして考えられます。
例
[Comparison Key]
public.table1 = col_a, col_b
public.table2 = c1, c2
この例では、テーブルpublic.table1 の場合、比較キーは列col_a
およびcol_b です。テーブルpublic.table2 の場合、列c1
およびc2 は比較キーとして考慮されます。
列フィルタ で説明している欠落している列、またはフィルタリングまたは欠落しているテーブルに関する同じ動作も、比較キーに適用されます。同様に、
Comparison Key セクションはconflicts モードでは無視されます。
競合フィルター#
このセクションでは、 PGDノードから競合を取得するときに--conflicts
モードで使用するフィルターを指定できます。任意のSQL条件式を構築し、式でこれらのフィールドを使用できます。
origin_nodeサブスクリプションの上流ノード。target_nodeサブスクリプションのダウンストリームノード。local_timeノードで競合が発生したときのタイムスタンプ。conflict_type競合のタイプ。conflict_resolution適用された解像度。nspname関連するリレーションのスキーマ名。relname関係するリレーションのリレーション名。
セクションの下でconflicts 属性を使用する必要があります。例
[Conflicts Filter]
conflicts = conflict_type = update_missing AND nspname = my_schema
この構成の部分を.ini
ファイルに追加すると、LiveCompareは、各PGDノードで競合を照会しているときに、タイプupdate_missing
であり、スキーマmy_schema
の下のテーブルに関連する競合のみを取得します。
重要
このセクションは`--conflicts` モード専用です。