pg_createsubscriber — 物理レプリカを新しい論理レプリカに変換する
pg_createsubscriber
[option
...] { -d
| --database
}dbname
{ -D
| --pgdata
}datadir
{ -P
| --publisher-server
}connstr
pg_createsubscriberは、物理スタンバイサーバから新しい論理レプリカを作成します。 指定されたデータベース内のすべてのテーブルが論理レプリケーション設定に含まれます。 各データベースに対して、パブリケーションとサブスクリプションのオブジェクトのペアが作成されます。 ターゲットサーバで実行する必要があります。
実行が成功した後のターゲットサーバの状態は、新しい論理レプリケーションセットアップに似ています。 論理レプリケーションセットアップとpg_createsubscriberの間の主な差は、データ同期化が行われる方法です。 pg_createsubscriberは初期テーブルデータをコピーしません。 各テーブルが同期化された状態になることを保証する同期化フェーズのみを行います。
pg_createsubscriberは大きなデータベースシステムを対象としています。 これは、論理レプリケーションセットアップではほとんどの時間が最初のデータコピーに費やされるためです。 さらに、データの同期に費やされるこの長い時間の副作用は、通常、適用される変更が大きな量になること(最初のデータコピー中に生成されたもの)であり、これは、ロジカルレプリカが利用可能になるまでの時間をさらに増加させます。 小規模なデータベースの場合は、初期データ同期化をお勧めします。
pg_createsubscriberは、以下のコマンドライン引数を受け付けます。
-d dbname
--database=dbname
サブスクリプションを作成するデータベースの名前。
複数の-d
スイッチを記述することによって、複数のデータベースを選択できます。
-D directory
--pgdata=directory
物理レプリカのクラスタディレクトリを含むターゲットディレクトリ。
-n
--dry-run
ターゲットディレクトリを実際に更新する以外はすべてのことを行います。
-p port
--subscriber-port=port
ターゲットサーバが接続をリスニングするポート番号。 デフォルトでは、ターゲットサーバはポート50432で実行され、意図しないクライアント接続を回避します。
-P connstr
--publisher-server=connstr
パブリッシャーへの接続文字列。 詳細は32.1.1を参照してください。
-s dir
--socketdir=dir
ターゲットサーバ上のpostmasterソケットに使用するディレクトリ。 デフォルトは現在のディレクトリです。
-t seconds
--recovery-timeout=seconds
リカバリーが終了するまでの最大待ち時間(秒)。 0に設定すると無効になります。 デフォルトは0です。
-U username
--subscriber-username=username
ターゲット・サーバに接続するためのユーザ名。 デフォルトは、現在のオペレーティングシステムユーザ名です。
-v
--verbose
冗長モードを有効にします。 これによりpg_createsubscriberは進捗メッセージと各ステップの詳細情報を標準エラーに出力します。 オプションを繰り返すと、追加のデバッグレベルメッセージが標準エラーに出力されます。
--config-file=filename
ターゲットデータディレクトリ用に指定されたメインサーバの設定ファイルを使用します。
pg_createsubscriberは、内部的にpg_ctlコマンドをスタートに使用し、ターゲットサーバを起動、停止します。
データディレクトリ外に保存されている場合は、実際のpostgresql.conf
設定ファイルを指定できます。
--publication=name
論理レプリケーションを設定するパブリケーション名。
複数の--publication
スイッチを指定することで、複数のパブリケーションを指定できます。
パブリケーション名の数は、指定されたデータベースの数と一致する必要があります。
一致しない場合、エラーが報告されます。
パブリケーション名のスイッチの順序は、データベースのスイッチの順序と一致する必要があります。
このオプションを指定しない場合、生成された名前がパブリケーション名に割り当てられます。
--replication-slot=name
論理レプリケーションを設定するレプリケーションスロット名。
複数の--replication-slot
スイッチを書くことで、複数のレプリケーションスロットを指定できます。
パブリケーションスロット名の数は、指定されたデータベースの数と一致する必要があります。
一致しない場合、エラーが報告されます。
複数のレプリケーションスロット名スイッチの順序は、データベーススイッチの順序と一致する必要があります。
このオプションを指定しない場合、サブスクリプション名がレプリケーションスロット名に割り当てられます。
--subscription=name
論理レプリケーションを設定するサブスクリプション名。
複数の--subscription
スイッチを指定することで、複数のサブスクリプションを指定できます。
サブスクリプション名の数は、指定されたデータベースの数と一致する必要があります。
一致しない場合、エラーが報告されます。
複数のサブスクリプション名スイッチの順序は、データベーススイッチの順序と一致する必要があります。
このオプションを指定しない場合、生成された名前がサブスクリプション名に割り当てられます。
-V
--version
pg_createsubscriberのバージョンを出力して終了します。
-?
--help
pg_createsubscriberコマンドライン引数についてのヘルプを表示し、終了します。
pg_createsubscriberがターゲットサーバを論理レプリカに変換するためには、いくつかの前提条件があります。
これらの条件が満たされない場合、エラーが報告されます。
ソースサーバとターゲットサーバはpg_createsubscriberと同じメジャーバージョンでなければなりません。
指定されたターゲットデータディレクトリは、ソースデータディレクトリと同じシステム識別子を持つ必要があります。
指定されたターゲットデータディレクトリのデータベースユーザは、サブスクリプションの作成とpg_replication_origin_advance()
を使用するための権限を持たなければなりません。
ターゲットサーバは、物理スタンバイとして使用する必要があります。 ターゲットサーバのmax_replication_slotsとmax_logical_replication_workersは、指定されたデータベースの数以上の値に設定されている必要があります。 ターゲットサーバのmax_worker_processesは、指定されたデータベースの数以上の値に設定されている必要があります。 ターゲットサーバは、ローカル接続を受け入れる必要があります。
ソースサーバはターゲットサーバからの接続を受け入れなければなりません。
ソースサーバはリカバリ状態であってはなりません。
ソースサーバはwal_levelをlogical
にする必要があります。
ソースサーバは、指定されたデータベースの数に既存のレプリケーションスロットを加えた値以上にmax_replication_slotsを設定する必要があります。
ソースサーバは、指定されたデータベースの数と既存のWAL送信プロセス以上の値にmax_wal_sendersを設定する必要があります。
ターゲットサーバの昇格後にpg_createsubscriberが失敗した場合、データディレクトリはリカバリ可能な状態ではない可能性が高いです。 このような場合は、新しいスタンバイサーバを作成することをお勧めします。
pg_createsubscriberは通常、変換中に異なる接続設定でターゲットサーバを起動します。 したがって、ターゲットサーバへの接続は失敗するはずです。
DDLコマンドは論理レプリケーションではレプリケートされないため、pg_createsubscriberの実行中にデータベーススキーマを変更するDDLコマンドは実行しないでください。 ターゲットサーバがすでに論理レプリカに変換されている場合、DDLコマンドはレプリケートされない可能性があり、エラーが発生する可能性があります。
処理中にpg_createsubscriberが失敗した場合、ソースサーバ上に作成されたオブジェクト(パブリケーション、レプリケーションスロット)は削除されます。 ターゲットサーバがソースサーバに接続できない場合、削除は失敗する可能性があります。 このような場合、警告メッセージが残されたオブジェクトを通知します。 ターゲットサーバが実行中の場合は、停止されます。
レプリケーションがprimary_slot_nameを使用している場合、論理レプリケーション設定後にソースサーバから削除されます。
ターゲットサーバが同期レプリカの場合、pg_createsubscriberの実行中にプライマリでのトランザクションコミットがレプリケーションを待つことがあります。
pg_createsubscriberは二相コミットを無効にして論理レプリケーションを設定します。
これは、準備されたトランザクションが事前の準備なしにCOMMIT PREPARED
の時点で複製されることを意味します。
セットアップが完了したら、two_phase
オプションを有効にしてサブスクリプションを手動で削除し、再作成することができます。
pg_createsubscriberはpg_resetwalを使用してシステム識別子を変更します。 これは、ターゲットサーバがソースサーバからのWALファイルを使用する可能性がある状況を回避します。 ターゲットサーバにスタンバイがある場合、レプリケーションが中断され、新しいスタンバイを作成する必要があります。
基本的な考え方は、ソースサーバからレプリケーションの開始ポイントを設定し、このポイントから開始する論理レプリケーションをセットアップすることです。
指定したコマンドラインオプションでターゲットサーバを起動します。 ターゲットサーバがすでに実行中の場合、pg_createsubscriberはエラーで終了します。
ターゲットサーバを変換できるかどうかをチェックします。 ソースサーバに対してもいくつかのチェックが行われます。 前提条件のいずれかが満たされていない場合、pg_createsubscriberはエラーで終了します。
ソースサーバ上の指定されたデータベースごとに、パブリケーションとレプリケーションスロットを作成します。
各パブリケーションはFOR ALL TABLES
を使用して作成されます。
publication-name
オプションが指定されていない場合、次の名前パターンになります。
「pg_createsubscriber_%u_%x
」(パラメータ: データベースoid
、ランダムint
)。replication-slot-name
が指定されない場合、レプリケーションスロットは次の名前パターンになります。
「pg_createsubscriber_%u_%x
」(パラメータ: データベースoid
、ランダムint
)。
これらのレプリケーション スロットは、今後の手順でサブスクリプションによって使用されます。
最後のレプリケーションスロットLSNは、recovery_target_lsnパラメータの停止点として、また、サブスクリプションによってレプリケーション開始点として使用されます。
これにより、トランザクションが失われることがなくなります。
ターゲットデータディレクトリにリカバリパラメータを書き込み、ターゲット・サーバを再起動します。
リカバリが進行するまでの先行書き込みログの場所のLSN(recovery_target_lsn)を指定します。
また、リカバリ対象に到達した時点でサーバが取るべきアクションとしてpromote
を指定します。
整合性のある状態に到達したらすぐにリカバリを終了する(WALはレプリケーション開始位置まで適用されるべきです)、複数のリカバリターゲットが障害を引き起こす可能性があるなど、リカバリプロセス中の予期しない動作を回避するために、リカバリパラメータが追加されます。
このステップは、サーバがスタンバイモードを終了し、読み取り/書き込みトランザクションを受け入れると完了します。
--recovery-timeout
オプションが設定されている場合、指定された秒数が経過するまでリカバリが終了しない場合、pg_createsubscriberは終了します。
ターゲットサーバ上の指定した各データベースに対してサブスクリプションを作成します。
subscription-name
が指定されない場合、サブスクリプションは次の名前パターンになります。
「pg_createsubscriber_%u_%x
」(パラメータ: データベースoid
、ランダムint
)。
ソースサーバから既存のデータをコピーしません。
レプリケーションスロットは作成されません。
代わりに、前の手順で作成したレプリケーションスロットを使用します。
サブスクリプションは作成されましたが、まだ有効ではありません。
これは、レプリケーションを開始する前に、レプリケーションの進行状況をレプリケーション開始点に設定する必要があるためです。
レプリケーション開始位置より前に作成されていたために複製された、ターゲットサーバ上のパブリケーション削除します。 これはサブスクライバー側では使用されません。
各サブスクリプションのレプリケーション開始点にレプリケーションの進行状況を設定します。
ターゲットサーバがリカバリプロセスを開始すると、レプリケーションの開始時点まで追いつきます。
これは、各サブスクリプションの初期レプリケーションの場所として使用される正確なLSNです。
サブスクリプションが作成されたため、レプリケーションオリジン名が取得されます。
レプリケーションオリジン名とレプリケーション開始点は、pg_replication_origin_advance()
で初期レプリケーション場所を設定するために使用されます。
ターゲットサーバ上の指定した各データベースのサブスクリプションを使用可能にします。 サブスクリプションは、レプリケーション開始ポイントからトランザクションを適用し始めます。
スタンバイサーバがprimary_slot_nameを使用していた場合、それは今後は使用されないので削除します。
スタンバイサーバにフェイルオーバーレプリケーションスロットがある場合、もはや同期できないので削除します。
ターゲットサーバのシステム識別子を更新します。
pg_resetwalが実行され、システム識別子が変更されます。
pg_resetwal
の必要条件なので、ターゲットサーバは停止されます。
foo
での物理レプリカからデータベースhr
とfinance
の論理レプリカを作成するには、次のようにします。
$
pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance