pg_receivewal

pg_receivewalPostgreSQLサーバから先行書き込みログをストリームする

概要

pg_receivewal [option...]

説明

pg_receivewalは実行中のPostgreSQLクラスタから先行書き込みログをストリームするために使用されます。 先行書き込みログはストリーミングレプリケーションプロトコルを使用してストリームされ、ローカルディレクトリのファイルとして書き出されます。 このディレクトリはポイントインタイムリカバリ(26.3参照)を用いてリストアする際のアーカイブ場所として使用することができます。

pg_receivewalは、先行書き込みログをサーバでの生成に合わせてリアルタイムでストリームし、archive_commandarchive_libraryとは異なり、セグメントが完了するまで待機することはありません。 このため、pg_receivewalを使用する場合にはarchive_timeoutを設定する必要はありません。

PostgreSQLのスタンバイサーバのWALレシーバと異なり、pg_receivewalはデフォルトでは、WALファイルがクローズされた時にのみ、WALデータをフラッシュします。 WALデータをリアルタイムでフラッシュするには--synchronousオプションを指定する必要があります。 pg_receivewalはWALを適用しないので、synchronous_commitremote_applyのときにこれを同期スタンバイにすることはできません。 そのようにした場合、決してキャッチアップすることのないスタンバイになり、トランザクションコミットのブロックをひき起こします。 これを避けるには、synchronous_standby_namesに適切な値を設定するか、pg_receivewalに対して一致しないapplication_nameを指定する、あるいは、synchronous_commitの値をremote_apply以外の値に変更してください。

先行書き込みログは通常のPostgreSQL接続を経由して、そしてレプリケーションプロトコルを使用して、ストリームされます。 この接続はREPLICATION権限(22.2参照)を持つユーザまたはスーパーユーザによって確立されなければなりません。 そしてpg_hba.confでレプリケーション用の接続を許可しなければなりません。 またサーバではストリーム用に利用できるセッションが少なくとも1つ存在できるためにmax_wal_sendersを十分大きく設定しなければなりません。

先行書き込みログのストリーミングの開始点はpg_receivewalの開始時に以下のように計算されます。

  1. まず、WALセグメントファイルが書き込まれるディレクトリを走査して、最新の完了したセグメントファイルを見つけ、次のWALセグメントファイルの始まりを開始点として使います。

  2. 前の方法で開始点を計算できず、レプリケーションスロットが使用されている場合、追加のREAD_REPLICATION_SLOTコマンドを発行してスロットのrestart_lsnを取得し、開始点として使用します。 このオプションは、PostgreSQL 15以降から先行書き込みログをストリーミングする場合にのみ使用できます。

  3. 開始点が前の方法で計算できなければ、サーバのIDENTIFY_SYSTEMコマンドで報告された最新のWALのフラッシュ位置が使われます。

接続が失われた場合、または、致命的ではないエラーで初期確立ができなかった場合、pg_receivewalは無期限に接続を再試行しできるだけ早くストリーミングを再確立します。 この動作を止めるためには-nパラメータを使用してください。

致命的なエラーが無い場合、pg_receivewalSIGINTControl+C)またはSIGTERMシグナルで停止されるまで実行を続けます。

オプション

-D directory
--directory=directory

出力を書き出すディレクトリです。

このパラメータは必須です。

-E lsn
--endpos=lsn

受信が指定したLSNに達したなら、自動的にレプリケーションを停止して、通常の終了ステータス0で終了します。

lsnとちょうど等しいLSNのレコードがある場合、そのレコードは処理されます。

--if-not-exists

--create-slotが指定され、指定された名前のスロットが既に存在していた場合に、エラーを発生させません。

-n
--no-loop

接続エラー時に繰り返しません。 代わりにエラーですぐに終了します。

--no-sync

このオプションはpg_receivewalがWALデータをディスクに強制的にフラッシュさせないようにします。 これはより高速ですが、オペレーションシステムのクラッシュ後にWALセグメントが破損している可能性があります。 一般に、このオプションはテストには有益ですが、本番配備でWALのアーカイビングを行うときに使うべきではありません。

このオプションは--synchronousと両立しません。

-s interval
--status-interval=interval

サーバに状態パケットを返答する間隔を秒単位で指定します。 これによりサーバからより簡単に進行状況を監視することができます。 ゼロという値は状態の定期的な更新を完全に無効にします。 しかしタイムアウトによる切断を防ぐために、サーバから要求された時には更新を送信します。 デフォルト値は10秒です。

-S slotname
--slot=slotname

pg_receivewalが既存のレプリケーションスロットを使うようにします(27.2.6を参照してください)。 このオプションが使われると、pg_receivewalはフラッシュ位置をサーバに報告します。 これは、各セグメントがいつディスクに同期されたかを示し、それによりサーバが必要のなくなったセグメントを削除できるようになります。

pg_receivewalのレプリケーションクライアントが同期スタンバイとしてサーバ上で構成されている場合、レプリケーションスロットを利用するとフラッシュ位置がサーバに報告されますが、それはWALファイルがクローズされる時のみです。 したがって、その構成ではプライマリ上のトランザクションが長時間待たされることになり、結果的に満足する動作を得られません。 これを正しく動作させるには、追加で--synchronousオプション(以下を参照)を指定する必要があります。

--synchronous

WALデータを受け取ると即座にディスクにフラッシュします。 またフラッシュした直後に、--status-intervalの値が何であれ、ステータスパケットをサーバに送り返します。

pg_receivewalのレプリケーションクライアントが同期スタンバイとしてサーバ上で構成されている場合、フィードバックが遅延なくサーバに送り返されることを確実にするため、このオプションを指定すべきです。

-v
--verbose

冗長モードを有効にします。

-Z level
-Z method[:detail]
--compress=level
--compress=method[:detail]

先行書き込みログの圧縮を有効にします。

圧縮の手法はgzip、(PostgreSQL--with-lz4でコンパイルされた場合)lz4に設定できます。非圧縮の場合はnoneです。 圧縮の詳細文字列はオプションで指定できます。 詳細文字列が整数の場合は、圧縮レベルを指定します。 それ以外の場合は、keywordまたはkeyword=valueの形式のカンマで区切られた項目リストにします。 現在サポートされているキーワードはlevelのみです。

圧縮レベルが指定されていない場合、デフォルトの圧縮レベルが使用されます。 アルゴリズムを指定せずにレベルのみが指定されている場合、レベルが0より大きい場合はgzip圧縮が使用され、レベルが0の場合は圧縮が使用されません。

gzipを使用している場合は、すべてのファイル名に自動的に接尾辞.gzが追加されます。lz4を使用している場合は、接尾辞.lz4が追加されます。

以下のコマンドラインオプションはデータベース接続パラメータを制御します。

-d connstr
--dbname=connstr

サーバに接続するために使用するパラメータを、接続文字列として指定します。 これは衝突するコマンドラインオプションよりも優先します。

このオプションは他のクライアントアプリケーションとの整合性のために--dbnameと呼ばれます。 しかし、pg_receivewalはクラスタ内のどの特定のデータベースにも接続しませんので、接続文字列内のデータベース名は無視されます。

-h host
--host=host

サーバが稼働しているマシンのホスト名を指定します。 名前がスラッシュから始まる場合、Unixドメインソケット用のディレクトリとして使用されます。 デフォルトは環境変数PGHOSTが設定されていればその値から取られ、設定されていない場合はUnixドメインソケット接続が試行されます。

-p port
--port=port

サーバが接続を待ち受けるTCPポートまたはUnixドメインソケットファイルの拡張子を指定します。 デフォルトは環境変数PGPORTが指定されていればその値から取られ、設定されていない場合はコンパイル時のデフォルト値から取られます。

-U username
--username=username

接続するユーザ名です。

-w
--no-password

パスワード入力を促しません。 サーバがパスワード認証を必要とし、かつ、.pgpassファイルなど他の手段でパスワードが入手できない場合、接続試行は失敗します。 このオプションは、パスワードを入力するユーザが存在しないバッチジョブやスクリプトで有用になります。

-W
--password

pg_receivewalはデータベースに接続する前にパスワード入力を強制的に促します。

このオプションは重要ではありません。 pg_receivewalは、サーバがパスワード認証を要求した場合に自動的にパスワードを促すためです。 しかしpg_receivewalは、サーバがパスワードを要求するかどうかを確認するために接続試行を浪費します。 -Wと入力して無駄な接続試行を防止することが有意である場合があります。

pg_receivewalは物理的なレプリケーションスロットを制御するため、以下の2つの動作のうちの1つを実行できます。

--create-slot

--slotで指定された名前の新しい物理的なレプリケーションスロットを作成して終了します。

--drop-slot

--slotで指定された名前の物理的なレプリケーションスロットを削除して終了します。

この他に以下のオプションも使用することができます。

-V
--version

pg_receivewalのバージョンを表示し、終了します。

-?
--help

pg_receivewalコマンドライン引数についてのヘルプを表示し、終了します。

終了ステータス

pg_receivewalSIGINTまたはSIGTERMシグナルで終了されたとき、ステータス0で終了します。 (これは止めるための通常の方法です。 そのためエラーではありません。) 致命的エラーや他のシグナルに対しては、終了ステータスは非ゼロになります。

環境

他のほとんどのPostgreSQLユーティリティと同様、このユーティリティはlibpqでサポートされる環境変数(34.15参照)を使用します。

環境変数PG_COLORは診断メッセージで色を使うかどうかを指定します。 可能な値はalwaysautoneverです。

注釈

WALのバックアップのメインの方法として、archive_commandarchive_libraryの代わりにpg_receivewalを使用する場合、レプリケーションスロットを使用することを強く推奨します。 そうしなければ、サーバはarchive_commandarchive_library、レプリケーションスロットのいずれからもWALのストリームがどこまでアーカイブされているかの情報を得られないため、先行書き込みログファイルがバックアップされる前にそれを再利用または削除するかもしれないのです。 しかし、WALデータを受け取る側がそのフェッチに追いつけない場合、レプリケーションスロットがサーバのディスクスペースを一杯にしてしまうかもしれないことに注意してください。

pg_receivewalは、ソースクラスタでグループパーミッションが有効である場合、受け取ったWALファイルのグループパーミッションを維持します。

先行書き込みログをmydbserverにあるサーバからストリームし、それをローカルディレクトリ/usr/local/pgsql/archiveに格納します。

$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive

関連項目

pg_basebackup