[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

17.5. サーバのシャットダウン

データベースサーバをシャットダウンする方法は複数あります。 マスタpostgresプロセスに異なるシグナルを送ることで、シャットダウンの方法を制御します。

SIGTERM

これはスマートシャットダウンモードです。 SIGTERMを受け取った後で、サーバは新しい接続を禁止しますが、既に存在するセッションは通常通り動作させます。 すべてのセッションが通常に終了するまではシャットダウンしません。 サーバがオンラインバックアップモードである場合、オンラインバックアップモードが活動しなくなるまでさらに待ちます。 バックアップモードが活動している間、新規接続は依然として許可されますが、スーパユーザに対してだけです (この例外はスーパユーザがオンラインバックアップモード停止のための接続を許可します)。 スマートシャットダウンが要求された時にサーバがリカバリ状態である場合、すべての通常のセッションが終了した後のみでリカバリとストリーミングレプリケーションが停止します。

SIGINT

これは高速シャットダウンモードです。 サーバは新しい接続を禁止しすべての存在するサーバプロセスにSIGTERMを送り、この結果サーバプロセスは現在のトランザクションをアボートし、即座に終了します。 そして サーバはすべてのサーバプロセスの終了を待って、最後にシャットダウンします。 サーバがオンラインバックアップモードである場合、バックアップモードは終了しますので、そのバックアップは使用することができなくなります。

SIGQUIT

これは即時シャットダウンです。 マスタのpostgresプロセスはすべての子プロセスにSIGQUITを送り、自身を適切に停止せずに即座に終了します。 子プロセスはSIGQUITを受け付けると同様に終了します。 これは次の起動時に(WALログを再実行することで)リカバリをすることになります。 これは緊急の時にのみ使うことを勧めます。

pg_ctlプログラムは、サーバをシャットダウンさせるシグナルを送信するための便利なインタフェースを提供します。 他にも、Windows以外のシステムではkillを使用して直接シグナルを送信することもできます。 postgresプロセスのPIDは、psプログラム、もしくはデータディレクトリの中のpostmaster.pidファイルを使用して見つけることができます。 例えば、高速シャットダウンをするためには下記のようになります。

$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`

重要項目: サーバをシャットダウンするためにSIGKILLを使わない方が良いでしょう。 これによってサーバが共有メモリとセマフォを解放できなくなり、新しくサーバを開始する前に、手動でその作業をしなければならなくなる可能性があります。 さらに、SIGKILLは、子プロセスにシグナルを中継することなくpostgresを停止させます。 このため、個々の子プロセスを停止させるために、同じ作業を手作業で行わなければならなくなります。

他のセッションを継続させながら個別のセッションを停止するにはpg_terminate_backend()表9-59を参照)を使用するか、そのセッションに関連する子プロセスにSIGTERMシグナルを送ります。