Database Support Blog

Database Support Blog>pg_basebackup/pg_receivexlog実行中にWALが上書きされる障害の予防策

  • PostgreSQL
2016.12.21

pg_basebackup/pg_receivexlog実行中にWALが上書きされる障害の予防策

pg_basebackup/pg_receivexlog実行中にWALが上書きされる障害の予防策

この記事は PostgreSQL Advent Calendar 2016 の21日目の記事です。

【SR+HS環境の落とし穴】スタンバイのリカバリに必要なWALが上書きされる障害の予防策 でStreaming Replication + Hot Standby(SR+HS)環境で発生しうる「FATAL: requested WAL segment <WALセグメント名> has already been removed」のメッセージの予防策を紹介しました。

このメッセージはSR+HS運用中だけではなく、 pg_basebackup コマンドや pg_receivexlog コマンドの実行中にも発生する可能性があります。各コマンドの実行中に本メッセージが発生した場合、再実行が必要になり所定の時間でバックアップが終わらなかったり、必要なWALファイルが取得できておらず、ベースバックアップを取り直す対応が必要になったりします。

そこで、今回はpg_basebackupコマンドとpg_receivexlogコマンドの実行中に発生しうる本メッセージの予防策について紹介します。


pg_basebackupコマンドとは

pg_basebackup コマンドは、稼動中のPostgreSQLのデータベースクラスタのベースバックアップ(オンラインバックアップ)を取得するためのものです。9.1以降で使用可能です。

9.0以前ではオンラインバックアップを取得するために複数のコマンドを実行する必要がありましたが、9.1以降ではpg_basebackupコマンドを実行するだけでオンラインバックアップを取得できます。pg_basebackupコマンド実行時に-X fetch(-Xf/-x)または-X stream(-Xs)オプションを付けることで、リカバリに必要なWALセグメントを含む一貫性のあるバックアップを取得することもできます。

-Xfまたは-Xsオプションを付けたpg_basebackupコマンドを実行中に、リカバリに必要なWALレコードを含むWALセグメントが上書きされた場合に、本メッセージが発生します。

pg_basebackupコマンドの詳細は、マニュアルもご確認ください。


pg_receivexlogコマンドとは

pg_receivexlog コマンドは、稼動中のPostgreSQLのデータベースクラスタからWALレコードを任意のディレクトリにリアルタイムに転送し続けるものです。このディレクトリはポイントインタイムリカバリを用いてリストアする際のアーカイブ場所として使用することができます。9.2以降で使用可能です。

pg_receivexlogコマンドの-Dオプションで指定したディレクトリにWALセグメント/WALレコードを転送しようとした際に、転送対象のWALレコードを含むWALセグメントが上書きされていた場合、本メッセージが発生します。

pg_receivexlogの詳細は、マニュアルもご確認ください。


「FATAL: requested WAL segment <WALセグメント名> has already been removed」発生の予防策

WALセグメントは循環利用されますが、pg_basebackupコマンドやpg_receivexlogコマンドの実行中に必要なWALセグメントは削除されないよう保持しておく必要があります。この予防策として2つの方法がありますが、--slotオプションが用意されているバージョンでは、WALセグメントをバックアップ元で確実に保持できるレプリケーションスロットを使う方法を推奨します。


レプリケーションスロットを使用する

上述の各コマンドを実行する際に--slotオプションを付けレプリケーションスロットを使用することで、各コマンドの実行中に必要なWALレコードを含むWALセグメントが保持されるようになります。そのため、各コマンドを実行中に必要なWALセグメントが消されてしまうことを防げます。

--slotオプションは、pg_basebackupでは9.6からpg_receivexlogでは9.4から使用できます。--slotオプションが存在しないバージョンをご利用の場合は、後述するもう一つの予防策の採用をご検討ください。


wal_keep_segmentsに十分な値を設定する

pg_xlogディレクトリに保持しておくWALセグメント数の最小値を設定するwal_keep_segments に、上述の各コマンドの実行中に必要なWALレコードを含むWALセグメントを保持できるくらい大きな値を設定することにより、本メッセージの発生を予防できます。ただし、お客様環境によってマシンの性能や処理量が異なるため、一概にwal_keep_segmentsに設定すべき設定値を紹介することはできません。トライアンドエラーで本メッセージの発生を予防するために十分な設定値を見積もる必要があります。


まとめ

今回は、pg_basebackupコマンドとpg_receivexlogコマンドを実行中に「FATAL: requested WAL segment <WALセグメント名> has already been removed」のメッセージが発生する障害の予防策について紹介しました。この記事で紹介した予防策を実施することで各コマンドの実行中に必要なWALレコードを含むWALセグメントを保持することができ、想定外にバックアップを取得できない事態を防ぐことができます。

-Xfまたは-Xsオプションを付けたpg_basebackupコマンドやpg_receivexlogコマンドを実行されている方で、まだ今回紹介した予防策を実施されていない方は、ぜひこの機会に設定してみてください。


執筆者情報

家島 拓也

サービス事業部 サポートセンター

2007年にアシストに入社して以来、ORACLE製品やPostgreSQL・EDB Postgres製品のサポートに従事してきました。このブログではサポート対応で得た知識を元に、お客様がお困りになることが多い問題や各製品の新機能に関する検証結果などを紹介します。

関連している記事

  • PostgreSQL
  • EDB Postgres
2017.07.13

EDB PostgresでPL/Python3を始めよう

EDB PostgresでPL/Python3をセットアップして実際に使うまでの手順を紹介します。

  • PostgreSQL
2016.12.10

【PostgreSQL】psycopg2のコネクションプーリングを使ってみよう

psycopg2のコネクションプーリングを使ってPostgreSQLに接続する方法をご紹介します。

  • PostgreSQL
2016.12.01

【SR+HS環境の落とし穴】スタンバイのリカバリに必要なWALが上書きされる障害の予防策

PostgreSQLのSR+HS環境でスタンバイのリカバリに必要なWALが上書きされる障害の予防策を紹介します。

アシストサポートセンターのご紹介 Oracle Database研修

ページの先頭へ戻る