※この記事にはアフィリエイト広告(プロモーション)が含まれます。
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のバージョン確認