PostgreSQL 13 min read

PostgreSQLの起動・停止・再起動 ― systemctlとpg_ctlcluster、reloadで済む設定と起動しないとき

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

Ubuntu の標準パッケージで入れた PostgreSQL は systemd で動いています。この記事の出力は PostgreSQL 18.6(Ubuntu 26.04)で採りました。

まず見る(結論)

sudo systemctl restart postgresql@18-main     # 再起動(18 は版、main はクラスター名)
sudo systemctl reload postgresql@18-main      # 設定の再読み込み
pg_lsclusters                                 # 動いているか(Status が online)
  • Ubuntu の postgresql サービスは、それ自体では何も動かさないまとめ用のサービス。起動に失敗しても systemctl restart postgresql は成功(終了コード 0)を返した
  • 実際のサーバーは postgresql@18-main。失敗はこちらでしか分からない
  • shared_buffers など context が postmaster の設定は reload では効かず、再起動が要る

サービスの名前

$ systemctl status postgresql --no-pager
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: enabled)
     Active: active (exited) since Sat 2026-10-24 16:30:40 JST; 2 days ago
   Main PID: 1704 (code=exited, status=0/SUCCESS)

$ systemctl status postgresql@18-main --no-pager
● postgresql@18-main.service - PostgreSQL Cluster 18-main
     Active: active (running) since Tue 2026-10-27 11:25:23 JST; 2min 11s ago
   Main PID: 26545 (postgres)

postgresql は /bin/true を実行するだけのサービスで、状態は active (exited) です。systemctl restart postgresql を実行すると、配下の postgresql@18-main にも再起動が伝わります。

どのクラスターがあって動いているかは pg_lsclusters で見ます。

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
18  main    5432 online postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.log

起動・停止・再起動

操作 systemctl pg_ctlcluster
起動 systemctl start postgresql@18-main pg_ctlcluster 18 main start
停止 systemctl stop postgresql@18-main pg_ctlcluster 18 main stop
再起動 systemctl restart postgresql@18-main pg_ctlcluster 18 main restart
状態 systemctl status postgresql@18-main pg_ctlcluster 18 main status

pg_ctlcluster で止めても、systemd 側の状態に反映されます。pg_ctlcluster 18 main stop の後、systemctl is-active postgresql@18-main は inactive を返しました。

再起動すると、接続中のセッションは切られます。pg_sleep(20) を実行中だった psql には次のように出ました。

FATAL:  terminating connection due to administrator command
server closed the connection unexpectedly

起動した時刻は SELECT pg_postmaster_start_time(); で確かめられます。再起動の前後で値が変わったので、再起動できたかの確認に使えます。

pg_ctl が見つからない

$ which pg_ctl
(何も出ない・終了コード 1)

Ubuntu では pg_ctl は PATH に入っておらず、/usr/lib/postgresql/18/bin/ にあります。pg_ctlcluster が版とクラスター名から設定ファイルの場所を補って pg_ctl を呼ぶので、普段はそちらを使います。状態を見るだけなら、フルパスで sudo -u postgres /usr/lib/postgresql/18/bin/pg_ctl -D /var/lib/postgresql/18/main status も使えました。

reload で効く設定・再起動が要る設定

ALTER SYSTEM SET work_mem = '8MB';
ALTER SYSTEM SET shared_buffers = '256MB';

この後 systemctl reload postgresql(または SELECT pg_reload_conf();)を実行しました。

SELECT name, setting, unit, context, pending_restart FROM pg_settings
 WHERE name IN ('work_mem', 'shared_buffers');
      name      | setting | unit |  context   | pending_restart
----------------+---------+------+------------+-----------------
 shared_buffers | 16384   | 8kB  | postmaster | t
 work_mem       | 8192    | kB   | user       | f

work_mem は 8MB(8192kB)に変わりました。shared_buffers は元の 128MB(16384 × 8kB)のままで、pending_restart が t になりました。

SELECT name, setting, applied, error FROM pg_file_settings
 WHERE name IN ('work_mem', 'shared_buffers');
      name      | setting | applied |            error
----------------+---------+---------+------------------------------
 shared_buffers | 128MB   | f       |
 work_mem       | 8MB     | t       |
 shared_buffers | 256MB   | f       | setting could not be applied

pg_file_settings では、設定ファイルのどの値が反映されなかったかが分かります。再起動すると shared_buffers は 32768(256MB)になり、pending_restart は f に戻りました。

ALTER SYSTEM の値は /var/lib/postgresql/18/main/postgresql.auto.conf に書かれます。ALTER SYSTEM RESET work_mem; で消せます。

設定ミスで起動しない

ALTER SYSTEM は不正な値をその場で弾きます(invalid value for parameter "shared_buffers": "256XB")。手で設定ファイルを書いたときは、再起動して初めて分かります。conf.d に shared_buffers = '256XB' を書いて再起動しました。

$ sudo systemctl restart postgresql        # 終了コードは 0
$ sudo systemctl restart postgresql@18-main
Job for postgresql@18-main.service failed because the service did not take the steps required by its unit configuration.
See "systemctl status postgresql@18-main.service" and "journalctl -xeu postgresql@18-main.service" for details.
$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
18  main    5432 down   postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.log

再起動の後は pg_lsclusters の Status が online になっているかを見ます。

原因はサーバーのログに出ます。

$ sudo tail /var/log/postgresql/postgresql-18-main.log
2026-10-27 11:27:51.792 JST [27572] LOG:  invalid value for parameter "shared_buffers": "256XB"
2026-10-27 11:27:51.792 JST [27572] HINT:  Valid units for this parameter are "B", "kB", "MB", "GB", and "TB".
2026-10-27 11:27:51.793 JST [27572] FATAL:  configuration file "/etc/postgresql/18/main/conf.d/zz-fsv.conf" contains errors
pg_ctl: could not start server

journalctl -u postgresql@18-main にも同じ内容が出ました。FATAL の行に該当するファイルが出るので、そのファイルの設定を直して systemctl start postgresql@18-main で起動します。

関連: PostgreSQLに外部から接続できない / PostgreSQLのインストール(Rocky Linux 10) / PostgreSQLのバージョン確認

PostgreSQL をもっと深く知るための本

PostgreSQL実践入門 ──アーキテクチャ、運用監視、性能改善

技術評論社・2026年2月

アーキテクチャから運用監視・性能改善までを扱う。付録に PostgreSQL 18 の新機能と設定項目の差分がある。

Amazonで見る

[改訂3版]内部構造から学ぶPostgreSQL ―設計・運用計画の鉄則

技術評論社・2022年11月・PostgreSQL 14 ベース

内部構造の理解から、設計と運用計画の立て方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。