★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 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

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

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

19.5.1. 諸設定

wal_level (enum)

wal_levelはどれだけの情報がWALに書かれるかを決定します。 デフォルト値はreplicaで、WALアーカイビングおよびレプリケーションをサポートするために十分なデータを書き出し、これにはスタンバイサーバで読み取り専用の問い合わせを実行することも含みます。 minimalはクラッシュまたは即時停止から回復するのに必要な情報を除き、すべてのログを削除します。 最後に、logicalは、更にロジカルデコーディングをサポートするのに必要な情報を追加します。 それぞれのレベルは、下位のレベルのログ出力を含んでいます。 このパラメータはサーバ起動時のみ設定可能です。

minimalレベルでは、一部の巨大な操作でのWAL出力は安全に省略でき、そうすることで、それらの操作が大幅に高速になります(14.4.7を参照してください)。 この最適化が適用される操作には以下のものがあげられます。

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

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

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

9.6よりも前のリリースでは、このパラメータはarchivehot_standbyという設定値も可能でした。 引き続きこれらも受け付けられますが、replicaへとマップされます。

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)

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

synchronous_standby_namesが空文字でない場合は、このパラメータは、WALレコードが、スタンバイサーバに複製されるまでトランザクションコミットを待機するか否かも制御します。 onに設定すると、現在の同期スタンバイがトランザクションのコミットレコードを受け取り、記憶装置に吐き出したことを報告するまでコミットは待機します。 このモードでは、プライマリおよびすべての同期スタンバイがデータベース記憶装置の故障を被った場合を除いて、トランザクションが失われないことが保証されます。 remote_applyに設定すると、現在の同期スタンバイがトランザクションのコミットレコードを受け取って適用し、スタンバイ上で発行されたクエリから見えるようになったことを報告するまでコミットは待機します。 remote_writeに設定すると、現在の同期スタンバイがトランザクションのコミットレコードを受け取り、スタンバイのオペレーティングシステムに書き出したことを報告するまでコミットは待機します。 この設定は仮にPostgreSQLのスタンバイインスタンスがクラッシュしたとしても、データ保護を保証するのに充分です。 しかし、スタンバイがオペレーティングシステムのレベルでクラッシュした場合はこの限りではありません。 データが必ずしもスタンバイの永続的な記憶装置に到達したとは言えないからです。 最後に、local設定は、コミットがローカルにディスクに吐出されるまで待機しますが、レプリケーションされるまでは待機しません。 これは通常同期レプリケーションが使用されている場合は望ましい設定ではありませんが、完全さのために提供されています。

もし synchronous_standby_names が設定されていなければ、onremote_applyremote_write および local の設定は全て同一の同期レベルを提供します。 すなわちトランザクションのコミットはローカルディスクへの吐き出しのみを待機します。

このパラメータはいつでも変更可能です。 どのトランザクションの動作も、コミット時に有効であった設定によって決まります。 したがって、一部のトランザクションのコミットを同期的に、その他を非同期的にすることが可能で、かつ、有用です。 例えば、デフォルトが同期コミットの場合に複数文トランザクションを一つだけ非同期にコミットさせるためには、トランザクション内で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がデフォルトです。 デフォルトは必ずしも理想的なものではありません。 クラッシュに適応した構成にする、あるいはアーカイブの最適性能を導くためには、この設定あるいはシステム構成の他の部分を変更することが必要かもしれません。 これらの側面は 30.1で解説されます。 このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみ設定可能です。

full_page_writes (boolean)

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

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

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

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

wal_log_hints (boolean)

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

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

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

wal_compression (boolean)

このパラメータがonなら、full_page_writesがonあるいはベースバックアップの際、PostgreSQLサーバはWALに書き出すフルページイメージを圧縮します。 圧縮されたページイメージは、WALリプレイのときに伸張されます。 デフォルト値はoffです。 スーパーユーザだけがこの設定を変更できます。

このパラメータを有効にすると、回復不可能なデータ破壊のリスクを増やすこと無しにWALの量を減らすことができます。 しかし、WALロギングの際の圧縮のため、またWALリプレイの際には伸張のために余分なCPUを使用するというコストが発生します。

wal_buffers (integer)

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

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

wal_writer_delay (integer)

WALライタがWALを吐き出す頻度を指定します。 WALを吐き出したとあと、非同期コミットしているトランザクションに起こされない限り、wal_writer_delayミリ秒待機します。 最後の吐き出しが過去wal_writer_delayミリ秒以内に起こなわれ、かつそれ以降wal_writer_flush_afterバイト以内のWALが生成されている場合は、WALはオペレーティングシステムに書き込まれますが、ディスクには吐出されません。 デフォルト値は200ミリ秒(200ms)です。 多くのシステムでは、待機間隔の実質的な分解能は10ミリ秒です。 10の倍数以外の値をwal_writer_delayに設定しても、その次に大きい10の倍数を設定した場合と同じ結果となります。 このパラメータはpostgresql.confファイル内またはサーバのコマンドラインでのみ設定可能です。

wal_writer_flush_after (integer)

WALライタがWALを吐き出す頻度を指定します。 最後の吐き出しが過去wal_writer_delayミリ秒以内に起こなわれ、かつそれ以降wal_writer_flush_afterバイト以内のWALが生成されている場合は、WALはオペレーティングシステムに書き込まれますが、ディスクには吐出されません。 wal_writer_flush_after0に設定されている場合は、WALが書かれるたびにWALが吐出されます。 デフォルト値は1MBです。 このパラメータはpostgresql.confファイル内またはサーバのコマンドラインでのみ設定可能です。

commit_delay (integer)

commit_delayは、WALフラッシュを開始する前の時間遅延を追加します。単位はマイクロ秒です。 このことにより、もし追加のトランザクションが与えられた時間間隔内でコミットが可能になるほどシステム負荷が充分に高い場合、一回の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トランザクションです。

19.5.2. チェックポイント

checkpoint_timeout (integer)

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

checkpoint_completion_target (floating point)

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

checkpoint_flush_after (integer)

チェックポイント実行中にcheckpoint_flush_afterバイトより多く書く度に、OSが記憶装置に書き込むことを強制しようとします。 このことにより、カーネルのページキャッシュが持つダーティデータの量を一定量に制限し、チェックポイントの最後にfsyncが実行される際、あるいはOSがバックグラウンドでデータを大きな塊で書き出す際に性能の急激な低下を招く可能性を減らします。 多くの場合これによってトランザクションの遅延が大幅に少なくなりますが、あるケース、特にワークロードがshared_buffersよりも大きく、OSのページキャッシュよりも小さい時には性能が低下するかもしれません。 この設定が無効なプラットフォームがあります。 有効な設定値は、この強制書き込み機能が無効になる0から、2MBまでです。 デフォルト値は、Linuxでは256kBで、それ以外は0です。 (BLCKSZが8kbでなければ、この設定のデフォルト値と最大値がBLCKSZに比例して変更されます。) このパラメータはpostgresql.confファイル、または、サーバのコマンドラインでのみで設定可能です。

checkpoint_warning (integer)

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

max_wal_size (integer)

自動WALチェックポイントの間にWALが増加する最大サイズです。 これはソフトリミットです。特別な状況下、たとえば高負荷、archive_commandの失敗、wal_keep_segmentsが大きな値に設定されている、などの時には、WALサイズはmax_wal_sizeを超えることがあります。 デフォルトは1GBです。 このパラメータを大きくすると、クラッシュリカバリに必要な時間が長くなります。 このパラメータは、postgresql.confファイルで設定するか、サーバのコマンドラインでのみ指定できます。

min_wal_size (integer)

この設定以下にWALのディスク使用量が保たれる限り、古いWALファイルは、消去されることなく今後のチェックポイントで使用するために常にリサイクルされます。 この設定は、たとえば大きなバッチジョブを走らせる際のWALの利用スパイクを取り扱うために、十分なWALのスペースが予約されていることを保証するために使用できます。 デフォルトは80MBです。 このパラメータは、postgresql.confファイルで設定するか、サーバのコマンドラインでのみ指定できます。

19.5.3. アーカイビング

archive_mode (enum)

archive_modeが有効な場合、archive_commandを設定することにより、完了したWALセグメントはアーカイブ格納領域に送信されます。 無効にするためのoffに加え、2つのモードがあります。onalwaysです。 通常の運用ではこの2つのモードには違いはありませんが、alwaysに設定すると、アーカイブリカバリおよびスタンバイモードでWALアーカイバが有効になります。 alwaysモードでは、アーカイブからリストアされたファイルや、ストリーミングレプリケーションでストリームされたファイルもすべて(再び)アーカイブされます。 詳細は26.2.9を参照してください。

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

archive_command (string)

完了したWALファイルセグメントのアーカイブを実行するローカルのシェルコマンドです。 文字列内のすべての%pは、格納されるファイルのパスで置き換えられ、そして、%fはファイル名のみ置換します。 (このパス名はサーバの作業用ディレクトリ、つまり、クラスタのデータディレクトリからの相対パスです。) コマンド内に%文字そのものを埋め込むには%%を使用します。 コマンドが成功した場合にのみ終了ステータスゼロを返すことが重要です。 より詳しくは25.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より大きければ、サーバは前回のセグメントファイル切り替えから指定秒数経過し、かつ単一のチェックポイントを含む何らかのデータベース操作が行われた場合、新しいセグメントファイルに切り替えます。 (データベースが活動していなければ、チェックポイントはスキップされます。) 強制切り替えにより早期にクローズされたアーカイブ済みファイルは、完全に完了したファイルと同じ大きさを持つことに注意してください。 そのため、非常に小さなarchive_timeoutを使用することは賢明ではなく、格納領域を膨張させてしまいます。 1分程度のarchive_timeout設定が通常は妥当です。 もしそれより高速にデータをマスターサーバからコピーをしてしまいたいのであれば、アーカイブするよりストリーミングレプリケーションの選択を検討すべきです。 このパラメータは postgresql.confファイル、または、サーバのコマンドラインでのみで設定可能です。