他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 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)

これらの設定をチューニングする追加情報は項29.4を参照してください。

18.5.1. 諸設定

wal_level (enum)

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

minimal水準では、何らかの巨大な操作でのWALロギングは安全を期して省略されます。そうすることで、一連の操作をより高速にさせます(項14.4.7を参照してください)。 この最適化が適用される操作には以下のものがあげられます。

CREATE TABLE AS
CREATE INDEX
CLUSTER
同一トランザクション内で作成されたか、もしくは切り詰められたテーブルに対するCOPY

しかしminimal WALはベースバックアップとWALログからデータを再構築するための充分な情報を持ち合わせていません。したがって、WALアーカイビング(archive_mode)あるいはストリーミングレプリケーションを有効にするにはarchive以上を使用しなければなりません。

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

logicalレベルでは、hot_standbyと同じ情報がログされるのに加え、ロジカルチェンジセットをWALから取り出すのに必要な情報が追加されます。 logicalを使うとWALの量が増えます。とりわけ、多数のテーブルがREPLICA IDENTITY FULLと設定されていて(訳注: ALTER TABLE参照)、多くのUPDATEDELETE文が実行される場合はこのことが言えます。

fsync (boolean)

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

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

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

fsyncを無効(off)から有効(on)に変更したときの確実なリカバリに対しては、カーネル内の全ての変更されたバッファを恒久的ストレージに強制移動させることが必要です。 クラスタがシャットダウンしている間、または fsyncがinitdb--sync-onlyの稼働しているか、syncが稼働しているか、ファイルシステムをにアンマウントしているか、またはサーバを再起動しているかにより成し得られます。

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

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

synchronous_commit (enum)

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

synchronous_standby_namesが設定されていると、このパラメータもやはり、トランザクションのWALレコードが、スタンバイサーバに複製されるまでトランザクションコミットを待機するか否かを制御します。 on に設定された場合、現在の同期スタンバイがトランザクションのコミットレコードを受け取り、記憶装置に既に書き込まれたことを確実視するまでコミットは待機されます。 このことにより、プライマリおよびスタンバイがそれぞれのデータベース記憶装置の故障を被った場合を除いて、トランザクションが失われることはありません。 remote_write に設定された場合、現在の同期スタンバイがトランザクションのコミットレコードを受け取り、スタンバイのオペレーティングシステムに書き出されたことを確実視するまでコミットは待機されます。しかし、データがスタンバイの記憶装置に安定して書き込まれたか否かは必須ではありません。 この設定は PostgreSQL のスタンバイインスタンスがクラッシュしたとしても、データ保護を保証するのに充分です。しかし、スタンバイがオペレーティングシステムのレベルでクラッシュした場合はこの限りではありません。

同期レプリケーションが使用されている場合、通常、ディスクに対してのローカルな書き込みとWALレコードのレプリケーションのいずれかを待つか、トランザクションに非同期でコミットさせるかどちらかの選択を行うよう実用的になっています。しかし、トランザクションに対し特別の値であるlocalが使用でき、同期レプリケーションではなく、ディスクへのローカルフラッシュの待機を要請することが可能です。 もし synchronous_standby_names が設定されていなければ、onremote_write および local の設定は全て同一の同期レベルを提供します。トランザクションのコミットはローカルディスクへの書き込みのみ待機します。

このパラメータはいつでも変更可能です。 この設定により任意の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_log_hints (boolean)

このパラメータがonの場合、PostgreSQLサーバはチェックポイント後にはじめてページを変更する際に、ディスクページの全内容をWALに書き出します。 これは、あまり重要でない、ヒントビットと呼ばれるものに対する変更にさえ当てはまります。

データチェックサムが有効であると、ヒントビットの更新は常にWALにログされ、この設定パラメータは無視されます。この設定パラメータを使って、データチェックサムが有効なときにどれだけのWALログは余計に書きだされるかをテストすることができます。

このパラメータはサーバ起動時のみ設定可能です。 デフォルト値はoffです。

wal_buffers (integer)

未だディスクに書き込まれていないWALデータに対して使用される共有メモリ容量です。 デフォルトの設定である-1は、shared_buffersの1/32(約3%)の容量に等しい大きさを選択します。 しかし、64kB未満ではなく、かつ典型的に16MBであるWALセグメントの大きさを越えることはありません。 もし、自動設定による選択が大きすぎたり、小さすぎる場合この値は手作業で設定可能です。 しかし、32kB未満のどんな正の値であっても、32kB として取り扱われます。 このパラメータはサーバ起動時のみ設定可能です。

WALバッファの内容はトランザクションのコミット毎にディスクに書き込まれます。 したがって、極端に大きな値は有意な効果を期待できません。 しかし、この値を数メガバイトに設定することにより、多くのクライアントが同時にコミットするトラフィック量の多いサーバでは書き込み性能が向上します。 デフォルト設定の-1で選択される自動チューニングによると、ほとんどの場合妥当な結果が得られます。

wal_writer_delay (integer)

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

commit_delay (integer)

WALバッファをディスクにフラッシュ開始する前のマイクロ秒単位で設定される時間遅延をcommit_delay は追加します。このことにより、もしシステム負荷が 与えられた時間間隔内でコミットが可能になる追加のトランザクションが準備可能になるほど充分な許容度がある場合、一回のWALフラッシュでコミットする大量のトランザク ションを許容することによって、コミット群の処理量を改善できます。 とは言っても、それぞれのWALフラッシュにたいし最大commit_delayマイクロ秒の待ち時間の増加をきたします。 なぜなら、他にコミットの準備が完了したトランザクションが他に存在しない場合、遅延は無駄になります。 遅延は少なくともcommit_siblingsだけのフラッシュが開始されようとしている時点で他のトランザクションが活動している場合機能します。 同様fsyncが無効の場合も機能しません。デフォルトのcommit_delayはゼロ(遅延無し)です。この設定はスーパユーザのみ変更可能です。

9.3より前のPostgreSQLでは、commit_delayの振る舞いは異なっており、あまり効果がありませんでした。 全てのWALフラッシュではなく、コミットだけに影響していました。また、そしてWALフラッシュが早めに完了しても設定された遅延分待機していました。 PostgreSQL 9.3以降では、フラッシュの準備が整った最初のプロセスが設定値分待機し、後続のプロセスは最初のプロセスがフラッシュ操作を完了するまでの間だけ待機をします。

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)です。 零の場合は警告を出しません。 checkpoint_timeoutcheckpoint_warningより小さい場合警告を出しません。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

18.5.3. アーカイビング

archive_mode (boolean)

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

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を使用することは思慮を欠いています。 格納領域を膨張させてしまいます。 通常1分程度のarchive_timeout設定が妥当です。 もしそれより高速にデータをマスターサーバにコピーをしてしまいたいのであれば、アーカイブするよりストリーミングレプリケーションの選択を検討すべきです。 このパラメータは postgresql.confファイル、または、サーバのコマンドラインでのみで設定可能です。