postgresql.confの設定反映タイミングについて

/var/lib/pgsql/15/data/postgresql.confとか、/var/lib/pgsql/data/postgresql.confにあるファイルを更新したとき、

「これはPostgreSQLの再起動が必要なのか・・・?」と不安に思うことがあるはず。

不安というのは設定が間違っていた時、起動に失敗してシステムが閲覧できないという恐怖が背景にあるからなんだけど、これを明確にするため、要不要のチェックをする手順を記載します!

スポンサーリンク

pg_settingsを確認する

現在稼働しているPostgreSQLの設定値は、pg_settingsというシステムビューで確認することができます。

とりあえず設定値を確認するだけなら、下記のように実行すればOK。

postgres=#   select name,context from pg_settings ;
                  name                  |      context
----------------------------------------+-------------------
 allow_in_place_tablespaces             | superuser
 allow_system_table_mods                | superuser
 application_name                       | user
 archive_cleanup_command                | sighup
 archive_command                        | sighup
 archive_library                        | sighup
 archive_mode                           | postmaster
...
  • パラメータ名(name)
  • 設定反映ルール(context)

contextの内訳

contextパラメータ例概要
internalblock_size
lc_collate
...
設定を直接変更できない項目。
initdbで変更可能な項目となりデータベースクラスタの再構成という大工事が必要な設定値を指す。
postmasterautovacuum_freeze_max_age
port
...
サーバ起動時に反映される項目。
変更には再起動が必要、設定ファイルの構文ミスがあると再起動が失敗するので怖い。
sighupautovacuum
fsync
...
変更に再起動は必要なく、設定ファイルのリロードで反映される項目。
リロード後に新しく発生したセッションはすべて反映後の値で動作する。
superuser-backendjit_debugging_support
log_connections
...
変更に再起動は必要なく、設定ファイルのリロードで反映される項目。

変更にはスーパーユーザ権限か、SET権限が必要。
セッション開始後に変更することができない。
backendignore_system_indexes
post_auth_delay
変更に再起動は必要なく、設定ファイルのリロードで反映される項目。

セッション開始後に変更することができない。
superuserlc_messages
log_min_duration_statement
...
変更に再起動は必要なく、設定ファイルのリロードで既存セッション含め即時反映される項目。

またSET文で接続中セッションに即時に反映させられる。
この時他のセッションには影響しない。
SET文にはスーパーユーザ権限か、SET権限が必要。
SET文の変更は接続中セッションを閉じると設定は破棄される。
userclient_encoding
enable_seqscan
...
変更に再起動は必要なく、設定ファイルのリロードで既存セッション含め即時反映される項目。

またSET文で接続中セッションに即時に反映させられる。
この時他のセッションには影響しない。
全てのユーザで実行が可能。
SET文の変更は接続中セッションを閉じると設定は破棄される。

SET文の変更タイミングについて

同セッション内で即時反映。

他のセッションには反映されないので検証などに。

#SET例(SET パラメータ名=値;)
postgres=# set log_min_duration_statement = 1;
SET

失敗例

contextがsuperuserかuserでない項目はエラーする。

postgres=# set fsync = off;
ERROR:  現在パラメータ"fsync"を変更できません

ALTER SYSTEM文の変更タイミングについて

即時に反映はされず、PostgreSQLのreloadか再起動が必要。

#ALTER SYSTEM例(ALTER SYSTEM SET パラメータ名=値;)
postgres=# alter system set log_min_duration_statement =0;
ALTER SYSTEM

変更後postgresql.confと同じディレクトリに、postgresql.auto.confファイルが作成され、reloadや再起動時に設定されるようになる。

※このファイルが残り続けていると、postgresql.confを変更してもautoファイル側で上書きしてしまうため、不要になったら削除した方がいいと思う。

失敗例

contextがinternalの項目はエラーする。

postgres=#  alter system set block_size=8192;
ERROR:  パラメータ"block_size"を変更できません

まとめ

古いポスグレだとログがとられておらず、
「ログでも設定するか~」とパラメータを変更したものの、再起動コマンドでうまくいくかずっと不安でした。

構文があってるかはもとより、古いサーバだと何か良からぬことが起こらないかという不安の方が強く、なるべく再起動したくないという思いがある。
※ログはreloadで済むものが多いので良かった。

簡単な保守だったらreloadで済む印象なので、この確認ができることによってだいぶ気楽に。
気の重いパラメータはもちろんあるけど、それは覚悟かなぁ。。。
スポンサーリンク
おすすめの記事