データベースサーバをシャットダウンする方法は複数あります。
内部的には、これらはすべてスーパーバイザのpostgres
プロセスにシグナルを送信することになります。
パッケージ化された版のPostgreSQLを使用していて、サーバの起動にその規定を使用した場合は、サーバの停止にもその規定を使用する必要があります。 詳細についてはパッケージレベルのドキュメントを参照してください。
サーバを直接管理する場合は、postgres
プロセスに異なるシグナルを送信することで、シャットダウンのタイプを制御できます。
これはスマートシャットダウンモードです。 SIGTERMを受け取った後で、サーバは新しい接続を禁止しますが、既に存在するセッションは通常通り動作させます。 すべてのセッションが通常に終了するまではシャットダウンしません。 サーバがオンラインバックアップモードである場合、オンラインバックアップモードが活動しなくなるまでさらに待ちます。 バックアップモードが活動している間、新規接続は依然として許可されますが、スーパーユーザに対してだけです (この例外はスーパーユーザがオンラインバックアップモード停止のための接続を許可します)。 スマートシャットダウンが要求された時にサーバがリカバリ状態である場合、すべての通常のセッションが終了した後のみでリカバリとストリーミングレプリケーションが停止します。
これは高速シャットダウンモードです。 サーバは新しい接続を禁止しすべての存在するサーバプロセスにSIGTERMを送り、この結果サーバプロセスは現在のトランザクションをアボートし、即座に終了します。 そして サーバはすべてのサーバプロセスの終了を待って、最後にシャットダウンします。 サーバがオンラインバックアップモードである場合、バックアップモードは終了しますので、そのバックアップは使用することができなくなります。
これは即時シャットダウンモードです。 サーバは、すべての子プロセスにSIGQUITを送信し、それらが終了するのを待ちます。 5秒以内に終了しないものには、SIGKILLが送られます。 すべての子プロセスが終了したら、マスタサーバプロセスはすぐに終了しますが、このとき通常のデータベースのシャットダウン処理を実行しません。 これは次の起動時に(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.84を参照)を使用するか、そのセッションに関連する子プロセスにSIGTERMシグナルを送ります。