2. プロセスとメモリー
2.3 インスタンス起動/停止時の動作
2.3.1 起動/停止の待機
インスタンスの管理にはpg_ctlコマンドを使用します。pg_ctlコマンドには、処理の完 了を待機する-w パラメーター/待機を行わない-W パラメーターを指定することができま す。マニュアルにも記載がありますが、インスタンスの起動時/再起動時は-Wパラメータ ー が デ フ ォ ル ト で 、 イ ン ス タ ン ス の 停 止 時 は-w パ ラ メ ー タ ー が デ フ ォ ル ト で す
(https://www.postgresql.org/docs/9.6/static/app-pg-ctl.html)。
表 21 pg_ctlコマンドによるインスタンス操作時の動作 動作 標準の動作 備考
start 非同期(-W)
restart 非同期(-W) 停止処理は同期
stop 同期(-w)
待機を行う場合のタイムアウト時間は-tパラメーターで指定します。デフォルトは60 秒です。1秒ごとにステータスをチェックし、タイムアウトまで繰り返します。
□ インスタンス起動時の動作
pg_ctl startコマンドによるインスタンス起動は-wパラメーターを指定しない限り起動
の完了を待機しません。postmasterプロセスの起動のためにsystem関数(Windows以 外)の戻り値のみチェックしています。またWindows環境ではWindows API
CreateRestrictedProcessを実行していますが、戻り値のチェックは行われていません。
このため起動エラーが発生しても、pg_ctlコマンドの戻り値は0になります。
例 14 インスタンス起動失敗時の動作
□ レプリケーション環境における待機
インスタンス停止時に-m smartパラメーター3を指定すると、クライアントの切断をタ イムアウトまで待ちます。ただしレプリケーション環境でスレーブ・インスタンスによる 接続はクライアントと見なされないため、スレーブの接続が行われていてもインスタンス は停止できます。
例 15 レプリケーション時の —m smartパラメーター
3 PostgreSQL 9.5で-m パラメーターのデフォルト値がsmartからfastに変更されました。
$ pg_ctl -D data start server starting
LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".
$ pg_ctl -D data start ← 同じクラスターに対して2回起動(エラーになる)
pg_ctl: another server might be running; trying to start server anyway server starting
FATAL: lock file "postmaster.pid" already exists
Is another postmaster (PID 3950) running in data directory
"/usr/local/pgsql/data"?
$ echo $? ← pg_ctl コマンドのステータスは 0 0
postgres=# SELECT state FROM pg_stat_replication ; state
--- streaming (1 row) postgres=# \q
$ pg_ctl stop -D data -m smart
waiting for server to shut down... done server stopped
ホット・スタンバイ状態になっていないスレーブ・インスタンス(hot_standby=off)を 待機(-w)設定で起動すると、タイムアウト(デフォルトでは60秒)までコマンドが完 了しません。これはpg_ctlコマンドがPqping関数を使ってインスタンスの起動を確認し ているためです。
例 16 ホット・スタンバイではないスレーブ・インスタンスの起動
$ grep hot_standby data.stdby/postgresql.conf hot_standby = off
$ pg_ctl -D data.stdby start -w waiting for server to start....
LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".
... stopped waiting server is still starting up
$ echo $?
0