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

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

SIGTERM

SIGTERMを受け取った後で、サーバは新しい接続を禁止しますが、既に存在するセッションは通常通り動作させます。 全てのセッションが通常に終了するまではシャットダウンしません。 これがスマートシャットダウンです。

SIGINT

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

SIGQUIT

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

pg_ctlプログラムは、サーバをシャットダウンさせるシグナルを送信するための便利なインタフェースを提供します。

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

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

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