これらの設定をチューニングする追加情報は30.4を参照してください。
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参照)、多くのUPDATE
とDELETE
文が実行される場合はこのことが言えます。
9.6よりも前のリリースでは、このパラメータはarchive
とhot_standby
という設定値も可能でした。
引き続きこれらも受け付けられますが、replica
へとマップされます。
fsync
(boolean
)
このパラメータがオンの場合、PostgreSQLサーバはfsync()
システムコールを発行するか、もしくはこれに相当する方法(wal_sync_methodを参照)で、更新が物理的にディスクに確実に書き込まれるように試みます。
これは、オペレーティングシステムもしくはハードウェアがクラッシュした後、データベースクラスタを一貫した状態に復旧させることを確実にします。
fsync
を停止することはしばしば性能上の利益になるとは言っても、停電やクラッシュの際に回復不可能なデータ破壊になることがあります。
従って外部データから全てのデータベースを簡単に再構築できる場合のみfsync
を停止してください。
fsync
を停止しても安全な状況の例としては、以下があげられます。
バックアップファイルから新しいデータベースクラスタにデータの初期読み込みを行う場合、バッチデータの処理のためにデータベースクラスタを使用し、その後データベースを削除して再構築する場合、読み込み専用のデータベースのクローンを頻繁に再作成するが、それをフェイルオーバーに使用しない場合、などです。
高性能なハードウェアであるからと言って、fsync
を停止することは正当性を主張する十分な理由とはなりません。
fsync
を無効(off)から有効(on)に変更したときの信頼できるリカバリのためには、カーネル内の全ての変更されたバッファを恒久的ストレージに強制的に吐き出させることが必要です。
これは、クラスタがシャットダウンしている間、またはfsync
が有効のときに、initdb --sync-only
を実行する、sync
を実行する、ファイルシステムをアンマウントする、またはサーバを再起動することによって可能となります。
多くの場合、重要でないトランザクションに対してsynchronous_commitを無効にすることにより、データ破壊という付随的危険性を伴うことなく、fsync
を無効にすることで得られるであろう性能上のメリットの多くを得ることができます。
fsync
はpostgresql.conf
ファイル、または、サーバのコマンドラインでのみ設定可能です。
このパラメータを無効にする場合、full_page_writesも同時に無効にすることを検討してください。
synchronous_commit
(enum
)
トランザクションのコミットがクライアントに「成功」の報告を返す前に、WALレコードがディスク上に書き込まれるまで待つかどうかの指定をします。
有効な値はon
、remote_apply
、remote_write
、local
、および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
が設定されていなければ、on
、remote_apply
、remote_write
および local
の設定は全て同一の同期レベルを提供します。
すなわちトランザクションのコミットはローカルディスクへの吐き出しのみを待機します。
このパラメータはいつでも変更可能です。
どのトランザクションの動作も、コミット時に有効であった設定によって決まります。
したがって、一部のトランザクションのコミットを同期的に、その他を非同期的にすることが可能で、かつ、有用です。
例えば、デフォルトが同期コミットの場合に複数文トランザクションを一つだけ非同期にコミットさせるためには、トランザクション内でSET LOCAL synchronous_commit TO OFF
を発行します。
wal_sync_method
(enum
)
WALの更新をディスクへ強制するのに使用される方法です。fsync
がオフの場合この設定は役に立ちません。と言うのはWALファイルの更新が全く強制されないからです。取り得る値は以下のものです。
open_datasync
(open()
のオプションO_DSYNC
でWALファイルに書き込む)
fdatasync
(コミット毎にfdatasync()
を呼び出す)
fsync
(コミット毎にfsync()
を呼び出す)
fsync_writethrough
(すべてのディスク書き込みキャッシュをライトスルーさせるため、コミット毎にfsync()
を呼び出す)
open_sync
(open()
のオプション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_after
が0
に設定されている場合は、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トランザクションです。
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_timeout
がcheckpoint_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
ファイルで設定するか、サーバのコマンドラインでのみ指定できます。
archive_mode
(enum
)
archive_mode
が有効な場合、archive_commandを設定することにより、完了したWALセグメントはアーカイブ格納領域に送信されます。
無効にするためのoff
に加え、2つのモードがあります。on
とalways
です。
通常の運用ではこの2つのモードには違いはありませんが、always
に設定すると、アーカイブリカバリおよびスタンバイモードでWALアーカイバが有効になります。
always
モードでは、アーカイブからリストアされたファイルや、ストリーミングレプリケーションでストリームされたファイルもすべて(再び)アーカイブされます。
詳細は26.2.9を参照してください。
アーカイブモードを抜けることなくarchive_command
を変更できるように、archive_mode
とarchive_command
は分離されました。
このパラメータはサーバ起動時のみ設定可能です。
wal_level
が
minimal
に設定されている場合、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
ファイル、または、サーバのコマンドラインでのみで設定可能です。