他のバージョンの文書9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

18.5. ログ先行書き込み(WAL)

WALとチェックポイントの調整についての詳細は項29.4も参照してください。

18.5.1. 諸設定

wal_level (enum)

wal_levelはどれだけの情報がWALに書かれるかを決定します。 デフォルト値はminimalで、クラッシュまたは即時停止から回復するのに必要な情報のみ書き出します。 archiveはWALアーカイビングに必要なロギングを追加し、hot_standbyは更にスタンバイサーバ上の読み取り専用問い合わせの情報を追加します。 このパラメータはサーバ起動時のみ設定可能です。

minimal水準では、同一のトランザクション内で作成されたり、切り捨てられたテーブル上のCREATE INDEXCLUSTERおよびCOPYのような何らかの巨大な操作のWALロギングは安全を期して省略されます。そうすることで、一連の操作をより高速にさせます(項14.4.7を参照してください)。 しかしminimal WALはベースバックアップとWALログからデータを再構築するための充分な情報を持ち合わせていません。したがい、WALアーカイビング(archive_mode)とストリーミングレプリケーションを有効にするにはarchiveまたはhot_standby水準を使用しなければなりません。

hot_standby水準においては、archiveと同じ情報がログ取得されるのに加え、WALから実行中のトランザクション状態を再構築するのに必要な情報が得られます。 スタンバイサーバ上で読み取り専用問い合わせを有効にするには、hot_standbyがプライマリサーバで設定され、hot_standbyがスタンバイサーバで有効になっていなければなりません。 hot_standby水準とarchive水準を使用した場合にちょっとした計測可能な性能上の差異がありますので、実際に運用して問題が見つかった場合はご意見を聞かせてください。

fsync (boolean)

このパラメータがオンの場合、PostgreSQLサーバはfsync()システム・コールを発行したり、もしくはこれに相当する方法で(wal_sync_methodを参照)更新が物理的にディスクに書き込まれたかの確証を得ようと試みます。 これは、オペレーティングシステムもしくはハードウェアがクラッシュした後、確実にデータベースクラスタを一貫した状態に復旧させることを保証します。

fsyncを停止することはしばしば性能上の利益になるとは言っても、予期せぬシステム停止やクラッシュの際に回復不可能なデータ破壊になることがあります。 従って外部データから全てのデータベースを簡単に再構築できる場合のみfsyncを停止してください。

fsyncを停止しても安全な状況の例としては、以下があげられます。 データベースが削除され、そして再構築されたデータの一群の処理のため、または頻繁に再構築され、かつフェイルオーバには使用されない読み取り専用のデータベースクローンに対し、バックアップファイルから新規データベースクラスタの初回読みを行う場合です。 高性能なハードウェアであるからと言って、fsyncを停止することは正当性を主張する十分な理由とはなりません。

多くの場合、致命的ではないトランザクションにおいてsynchronous_commitを無効にすることにより、データ破壊の付随的危険性を伴うことなく、fsyncを無効にした場合に潜在する性能上のメリットの多くを得ることができます。

fsyncpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。 このパラメータを無効にする場合、full_page_writesも同時に無効にすることを検討してください。

synchronous_commit (boolean)

トランザクションのコミットがクライアントに"成功"の表示を返す前に、WALレコードがディスク上に書き込まれるまで待つかどうかの指定をします。 デフォルトかつ安全な設定はonです。 offの場合、クライアントに成功を報告する時点とトランザクションが本当にサーバクラッシュに対して安全になるまでの間に遅延が発生します。 (最大の遅延は、wal_writer_delayの3倍です。) fsyncと異なり、このパラメータをoffに設定することによって、データベースの一貫性が損なわれる可能性はありません。 オペレーティングシステムやデータベースのクラッシュにより最近コミットされたということになっているトランザクションの一部が失われる可能性がありますが、これらのトランザクションが正常にアボートされた時とデータベースの状態は変わりません。 ですので、synchronous_commitを無効にすることは、トランザクションの信頼性が確実であることよりも性能が重要である場合に有効な方法です。 詳細は項29.3を参照してください。

このパラメータはいつでも変更可能です。 この設定により任意の1つのトランザクションのコミット時の動作が決まります。 したがって、一部のトランザクションのコミットを同期的に、その他を非同期的にすることが可能で、かつ、有用です。 例えば、デフォルトが同期コミットの場合に単一の複数文トランザクションを非同期にコミットさせるためには、トランザクション内でSET LOCAL synchronous_commit TO OFFを発行します。

wal_sync_method (enum)

WALの更新をディスクへ強制するのに使用される方法です。fsyncがオフの場合この設定は役に立ちません。と言うのはWALファイルの更新が全く強制されないからです。取り得る値は以下のものです。

  • open_datasyncopen()オプションO_DSYNCでWALファイルの書き込み)

  • fdatasync(コミット毎にfdatasync()を呼び出し)

  • fsync(コミット毎にfsync()を呼び出し)

  • fsync_writethrough(いかなるディスク書き込みキャッシュもライトスルーさせるため、コミット毎にfsync()を呼び出し)

  • open_syncopen()オプションO_SYNCでWALファイルの書き込み)

もし可能ならopen_*オプションもO_DIRECTを使用します。 全てのプラットホームでこれら全ての選択肢が使えるわけではありません。 デフォルトは、上のリストのプラットフォームでサポートされるものの最初に列挙されているものです。ただしLinuxではfdatasyncがデフォルトです。     デフォルトは必ずしも理想的なものではありません。     この設定、あるいはクラッシュに適応した構成か、アーカイブの最適性能を導くために使用しているシステム構成の形態を変更することが必要かもしれません。 これらの側面は項29.1で解説されます。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

full_page_writes (boolean)

このパラメータが有効の場合、PostgreSQLサーバは、チェックポイントの後にそのページが最初に変更された過程で、ディスクページの全ての内容をWALに書き込みます。 オペレーティングシステムがクラッシュした時に進行中のページ書き込みは途中までしか終わっていない可能性があるため、これが必要です。 この場合、ディスク上のページは古いデータと新しいデータが混在する状態になります。 通常WAL内に保存される行レベルの変更データは、クラッシュ後のリカバリ時にこうしたページを完全に復旧させるには不十分です。 完全なページイメージが、ページを正確に復旧できることを保証します。 しかし、WALに書き込まなければならないデータ量が増加する代償と引きかえになります。 (WAL再生は常にチェックポイントから始まるため、チェックポイント後のそれぞれのページの最初の変更時にこれを行うことで差し支えありません。 従って、完全ページ書き出しのコストを低減する方法の1つは、チェックポイント間隔パラメータを増やすことです。)

このパラメータを無効にすると、通常の操作速度が上がりますが、システム障害後に、回復不能なデータ破損、あるいは警告なしのデータ損壊をもたらすかもしれません。 このリスクは小さいながらfsyncを無効にした場合と似ています。そしてそのfsyncに対して推奨されている同一の状況に基づく限りにおいて停止されなければなりません。

このパラメータを無効にしてもポイントインタイムリカバリ(PITR)用のWALアーカイブの使用に影響ありません( 項24.3を参照してください)。

このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインでのみ設定可能です。 デフォルトはonです。

wal_buffers (integer)

WALデータ用に共有メモリ内で使用されるメモリ量です。 デフォルトは64キロバイト(64kB)です。 データはそれぞれのトランザクションコミットごとにディスクに書き出されるため、設定としては、1つの典型的なトランザクションによって生成されるWALデータを保存できる充分な大きさであることのみが必要です。 このパラメータはサーバ起動時のみ設定可能です。

このパラメータを増加させると、使用しているオペレーティングシステムのデフォルト構成が許容するSystem V共有メモリの限界を越えた要求をPostgreSQLが行う原因となることがあります。必要であれば、どの様にしてこのパラメータを調整するかについて項17.4.1を参照ください。

wal_writer_delay (integer)

WALライタの活動周期の間隔を指定します。 ライタのこの各周期でWALをディスクに吐き出します。 そしてwal_writer_delayミリ秒待機し、それを繰り返します。 デフォルト値は200ミリ秒(200ms)です。 多くのシステムでは、待機間隔の実質的な分解能は10ミリ秒です。 10の倍数以外の値をwal_writer_delayに設定しても、その次に大きい10の倍数を設定した場合と同じ結果となります。 このパラメータはpostgresql.confファイル内またはサーバのコマンドラインでのみ設定可能です。

commit_delay (integer)

コミットレコードをWALバッファに書き込む時と、バッファをディスクに吐き出す時のマイクロ秒単位の時間差遅延です。 システム負荷が高く、指定期間内にコミット準備ができたトランザクションが複数存在した場合、ゼロ以外の遅延時間であれば複数のトランザクションを一度のfsync()システムコールのみで、与えられた周期以内でコミットすることができます。 しかし、もし他のトランザクションがコミットできる状態にならなければ、この遅延は無駄になります。と言うことは、サーバプロセスがそのコミットレコードを書き込んだ瞬間に他のトランザクションが進行している commit_siblingsにだけ少なくとも実行されます。 デフォルトの値はゼロ(遅延無し)です。

commit_siblings (integer)

commit_delay遅延を実行する前に必要とされる同時に開いているトランザクションの最小数です。 より大きい値は、遅延周期の間に、少なくとも1つの他のトランザクションがコミットの準備を整わせることを確実にします。 デフォルトは5トランザクションです。

18.5.2. チェックポイント

checkpoint_segments (integer)

自動WALチェックポイント間の最大ログファイル数です。(それぞれのセグメントは通常16メガバイト) デフォルトは3セグメントです。 このパラメータを増やすと、クラッシュリカバリで必要となる時間が増加します。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

checkpoint_timeout (integer)

自動的WALチェックポイント間の最大間隔を秒単位で指定します。 デフォルトは5分(5min)です。 このパラメータを増やすと、クラッシュリカバリで必要となる時間が増加します。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

checkpoint_completion_target (floating point)

チェックポイントの完了目標をチェックポイント間の総時間の割合として指定します。 デフォルトは0.5です。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

checkpoint_warning (integer)

チェックポイントセグメントファイルが溢れることが原因で起きるチェックポイントが、ここで指定した秒数よりも頻繁に発生する場合、サーバログにメッセージを書き出します (これは、checkpoint_segmentsを呼び出す必要があることを示唆しています)。 デフォルトは30秒(30s)です。 零の場合は警告を出しません。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

18.5.3. アーカイビング

archive_mode (boolean)

archive_modeが有効な時、archive_commandを設定して、完了したWALセグメントをアーカイブ格納領域に送信されます。 アーカイブモードを抜けることなくarchive_commandを変更できるように、archive_modearchive_commandは分離されました。 このパラメータはサーバ起動時のみ設定可能です。archive_modeを有効にするには、wal_levelarchiveまたはhot_standbyに設定しなければなりません。

archive_command (string)

完了したWALファイルセグメントのアーカイブを実行するシェルコマンドです。 文字列内のいかなる%pは、格納されるファイルの絶対パスで置き換えられ、そして、%fはファイル名のみ置換します。 (このパス名はサーバの作業用ディレクトリ、つまり、クラスタのデータディレクトリからの相対パスです。) コマンド内で実際の%文字を埋め込むには%%を使用します。 コマンドが成功した場合に限って終了ステータスゼロを返すことが重要です。 より詳しくは項24.3.1を参照ください。

このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。 サーバ起動時にarchive_modeが有効でなければ、これは無視されます。 archive_commandが空文字列(デフォルト)、かつ、archive_modeが有効な場合、WALアーカイブ処理は一時的に無効になりますが、コマンドが後で提供されることを見越して、サーバはWALセグメントの蓄積を続けます。 例えば、/bin/true(WindowsではREM)のように、コマンドに対しarchive_commandを真を返すだけで何もしないように設定すると効果的にアーカイブ処理を無効にしますが、アーカイブからの復帰に必要なWALファイルの連鎖を同時に断ち切ります。従って、特別な場合のみ使用するようにしなければなりません。

archive_timeout (integer)

archive_commandは完了したWALセグメントに対してのみ呼び出されます。従って、サーバのWAL転送量が少ししかない(処理を行わないなぎの期間がある)場合、トランザクションの完了とアーカイブ格納領域への安全な記録との間に長期にわたる遅延があることになります。 古い未アーカイブのデータをどうするかについて制限を付けるために、archive_timeoutを設定して、強制的にサーバを新しいWALセグメントに定期的に切り替えるようにすることができます。 このパラメータが0より大きければ、サーバは前回のセグメントファイル切り替えから指定秒数経過した場合、および単一のチェックポイントを含む何らかのデータベース操作が行われた場合、新しいセグメントファイルに切り替えます。(checkpoint_timeoutを大きくすると待機状態のシステム上の不必要なチェックポイントを減少させます。) 強制切り替えにより早期に閉ざされたアーカイブ済みファイルは完全に完了したファイルと同じ大きさを持つことに注意してください。 そのため、非常に小さなarchive_timeoutを使用することはお勧めしません。 格納領域を膨張させてしまいます。 通常ならば分単位のarchive_timeout設定が合理的です。 このパラメータは postgresql.confファイル、または、サーバのコマンドラインでのみで設定可能です。

18.5.4. ストリーミングレプリケーション

これらの設定は組み込みのストリーミングレプリケーション機能の動作を制御します。 これらのパラメータは1つ以上のスタンバイサーバにレプリケーションデータを送信するプライマリサーバ上で設定されなければなりません。

max_wal_senders (integer)

スタンバイサーバからの同時接続を受ける接続最大値を設定します(つまり、同時に稼動するWAL送信プロセスの最大値です)。 デフォルトはゼロです。このパラメータはサーバ起動時のみ設定可能です。 スタンバイサーバからの接続を許可するには、wal_levelarchive、またはhot_standbyに設定されなければなりません。

wal_sender_delay (integer)

WAL送信プロセスに対する動作周回間の遅延を設定します。それぞれの周回で、WAL送信サーバはスタンバイサーバに最終回で送った後の蓄積されたWALを送信します。そして、wal_sender_delayミリ秒活動停止し、そしてそれを繰り返します。デフォルト値は200ミリ秒(200ms)です。 多くのシステムでは、有効な活動停止遅延の分解能は10ミリ秒です。10の倍数でない値にwal_sender_delayを設定しても、次の10の倍数に設定したのと同じ結果となります。このパラメータは、postgresql.confファイル、もしくはサーバコマンドラインでのみ設定可能です。

wal_keep_segments (integer)

ストリーミングレプリケーションにおいて、スタンバイサーバが過去のファイルセグメントを取得する必要がある場合に備え、pg_xlogディレクトリに保持しておくファイルセグメント数の最小値を指定します。 それぞれのセグメントは通常16メガバイトです。もしプライマリサーバに接続しているスタンバイサーバがwal_keep_segmentsセグメントを越えて遅延した場合、プライマリサーバはスタンバイサーバが今後とも必要とするWALセグメントを削除する可能性があります。 この場合、レプリケーション接続は終了させられます。(しかし、WALアーカイブが使用されていれば、スタンバイサーバはアーカイブからセグメントを取り出し、復旧することができます。)

pg_xlogに保持され続けるセグメントの最小値のみを設定します。 システムはWALアーカイブのため、またはチェックポイントからの復旧のため、より多くのセグメント保持が必要となることがあります。もしwal_keep_segmentsが(デフォルトの)ゼロの場合、システムは待機目的でのいかなる追加セグメントも保持しません。 スタンバイサーバが使用できる古いWALセグメントの多くは、前回のチェックポイントの場所とWALアーカイブの状態を捕捉する機能になります。 このパラメータはリスタートポイントに影響を与えません。 このパラメータは、postgresql.confファイル、もしくはサーバコマンドラインでのみ設定可能です。

vacuum_defer_cleanup_age (integer)

VACUUMおよびHOT更新が不必要となった行バージョンの後片付けをどれくらい遅らせるかをトランザクション数で設定します。 デフォルトはトランザクション数がゼロとなっていて、不必要となった行バージョンは可能な限り迅速に、つまり実行中のどんなトランザクションから見えなくなり次第削除されます。 項25.5で記述されているように、ホットスタンバイ構成のプライマリサーバにて、この設定を非ゼロにしたいと思う場合もあります。 そうすることで、行を早期に後片付けすることによっておこる衝突を招かずに、スタンバイサーバ上での問い合わせに対して時間をより多く割くことができます。 しかし、この値はプライマリサーバ上で発生する書き込みトランザクション数で測られるので、待機中の問い合わせにどれだけ多くの追加猶予時間を与えられるかを予想することはできません。 このパラメータは postgresql.confファイル、または、サーバのコマンドラインでのみで設定可能です。

18.5.5. スタンバイサーバ

これらの設定はレプリケーションデータを受け取るスタンバイサーバの動作を管理します。

hot_standby (boolean)

項25.5に記載されている通り、リカバリの最中に接続し、そして問い合わせを実行できるか否かを設定します。デフォルト値はoffです。 このパラメータはサーバ起動時のみ設定可能です。これは、アーカイブリカバリ期間、又は待機モードにある場合にのみ効果をもたらします。

max_standby_archive_delay (integer)

ホットスタンバイが稼動している場合、このパラメータは項25.5.2で記載されているように、まさに適用されようとしているWALエントリと衝突するスタンバイサーバの問い合わせをキャンセルするにはどれだけ待機しなければならないかを設定します。 max_standby_archive_delayはWALデータをWALアーカイブから読み込んでいる時に適用されます(従って最新ではありません)。 デフォルトは30秒です。特に指定が無ければ単位はミリ秒です。値-1は衝突する問い合わせが完了するまでスタンバイサーバが待ち続けられるようにします。 このパラメータは、postgresql.confファイル、もしくはサーバコマンドラインでのみ設定可能です。

max_standby_archive_delayはキャンセル前に問い合わせが実行できる最大の時間の長さと同じでないことに注意してください。むしろ、任意の1つのWALセグメントのデータに適用される最大許可時間です。従って、ある問い合わせがWALセグメント内で時間的に初期の段階で大幅な遅延となった場合、その後の衝突する問い合わせの猶予時間はましてさらに短くなります。

max_standby_streaming_delay (integer)

ホットスタンバイが稼動している場合、このパラメータは項25.5.2で記載されているように、まさに適用されようとしているWALエントリと衝突するスタンバイサーバの問い合わせをキャンセルするにはどれだけ待機しなければならないかを設定します。 max_standby_streaming_delayはWALデータをストリーミングレプリケーションから受け取っている時に適用されます。 デフォルトは30秒です。特に指定が無ければ単位はミリ秒です。値-1は衝突する問い合わせが完了するまでスタンバイサーバが待ち続けられるようにします。 このパラメータは、postgresql.confファイル、もしくはサーバコマンドラインでのみ設定可能です。

max_standby_streaming_delayはキャンセル前に問い合わせが実行できる最大の時間の長さと同じでないことに注意してください。むしろ、一度プライマリサーバから受け取られたWALデータに適用される最大許可時間です。 従って、ある問い合わせが大幅な遅延となった場合、スタンバイサーバがふたたび遅れを取り戻すまで、その後の衝突する問い合わせの猶予時間はましてさらに短くなります。