There are several ways to shut down the database server.
Under the hood, they all reduce to sending a signal to the supervisor
<command>postgres</command> process.
データベースサーバをシャットダウンする方法は複数あります。
内部的には、これらはすべてスーパーバイザのpostgres
プロセスにシグナルを送信することになります。
If you are using a pre-packaged version of <productname>PostgreSQL</productname>, and you used its provisions for starting the server, then you should also use its provisions for stopping the server. Consult the package-level documentation for details. パッケージ化された版のPostgreSQLを使用していて、サーバの起動にその規定を使用した場合は、サーバの停止にもその規定を使用する必要があります。 詳細についてはパッケージレベルのドキュメントを参照してください。
When managing the server directly, you can control the type of shutdown
by sending different signals to the <command>postgres</command>
process:
サーバを直接管理する場合は、postgres
プロセスに異なるシグナルを送信することで、シャットダウンのタイプを制御できます。
This is the <firstterm>Smart Shutdown</firstterm> mode. After receiving <systemitem>SIGTERM</systemitem>, the server disallows new connections, but lets existing sessions end their work normally. It shuts down only after all of the sessions terminate. If the server is in recovery when a smart shutdown is requested, recovery and streaming replication will be stopped only after all regular sessions have terminated. これはスマートシャットダウンモードです。 SIGTERMを受信した後、サーバは新しい接続を禁止しますが、既存のセッションは正常に終了させます。 サーバはすべてのセッションが終了した後にのみシャットダウンします。 スマートシャットダウンが要求されたときにサーバがリカバリ中の場合、リカバリとストリーミングレプリケーションはすべての通常セッションが終了した後にのみ停止します。
This is the <firstterm>Fast Shutdown</firstterm> mode. The server disallows new connections and sends all existing server processes <systemitem>SIGTERM</systemitem>, which will cause them to abort their current transactions and exit promptly. It then waits for all server processes to exit and finally shuts down. これは高速シャットダウンモードです。 サーバは新しい接続を禁止しすべての存在するサーバプロセスにSIGTERMを送り、この結果サーバプロセスは現在のトランザクションをアボートし、即座に終了します。 そして サーバはすべてのサーバプロセスの終了を待って、最後にシャットダウンします。
This is the <firstterm>Immediate Shutdown</firstterm> mode. The server will send <systemitem>SIGQUIT</systemitem> to all child processes and wait for them to terminate. If any do not terminate within 5 seconds, they will be sent <systemitem>SIGKILL</systemitem>. The supervisor server process exits as soon as all child processes have exited, without doing normal database shutdown processing. This will lead to recovery (by replaying the WAL log) upon next start-up. This is recommended only in emergencies. これは即時シャットダウンモードです。 サーバは、すべての子プロセスにSIGQUITを送信し、それらが終了するのを待ちます。 5秒以内に終了しないものには、SIGKILLが送られます。 すべての子プロセスが終了したら、スーパーバイザサーバプロセスはすぐに終了しますが、このとき通常のデータベースのシャットダウン処理を実行しません。 これは次の起動時に(WALログを再実行することで)リカバリをすることになります。 これは緊急の時にのみ使うことを勧めます。
The <xref linkend="app-pg-ctl"/> program provides a convenient
interface for sending these signals to shut down the server.
Alternatively, you can send the signal directly using <command>kill</command>
on non-Windows systems.
The <acronym>PID</acronym> of the <command>postgres</command> process can be
found using the <command>ps</command> program, or from the file
<filename>postmaster.pid</filename> in the data directory. For
example, to do a fast shutdown:
pg_ctlプログラムは、サーバをシャットダウンさせるシグナルを送信するための便利なインタフェースを提供します。
他にも、Windows以外のシステムではkill
を使用して直接シグナルを送信することもできます。
postgres
プロセスのPIDは、ps
プログラム、もしくはデータディレクトリの中のpostmaster.pid
ファイルを使用して見つけることができます。
例えば、高速シャットダウンをするためには下記のようになります。
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
It is best not to use <systemitem>SIGKILL</systemitem> to shut down the
server. Doing so will prevent the server from releasing shared memory and
semaphores. Furthermore, <systemitem>SIGKILL</systemitem> kills
the <command>postgres</command> process without letting it relay the
signal to its subprocesses, so it might be necessary to kill the
individual subprocesses by hand as well.
サーバをシャットダウンするためにSIGKILLを使わない方が良いでしょう。
これによってサーバが共有メモリとセマフォを解放できなくなります。
さらに、SIGKILLは、子プロセスにシグナルを中継することなくpostgres
を停止させます。
このため、個々の子プロセスを停止させるために、同じ作業を手作業で行わなければならなくなります。
To terminate an individual session while allowing other sessions to
continue, use <function>pg_terminate_backend()</function> (see <xref
linkend="functions-admin-signal-table"/>) or send a
<systemitem>SIGTERM</systemitem> signal to the child process associated with
the session.
他のセッションを継続させながら個別のセッションを停止するにはpg_terminate_backend()
(表 9.94を参照)を使用するか、そのセッションに関連する子プロセスにSIGTERMシグナルを送ります。