18.5. 关闭服务器

有几种关闭数据库服务器的方法。您可以通过向主机postgres进程发送不同的 signal 来控制关闭的类型。

  • SIGTERM

    • 这是智能关机模式。收到 SIGTERM 后,服务器将禁止新连接,但允许现有会话正常结束其工作。仅在所有会话终止后,它才会关闭。如果服务器处于联机备份模式,它将另外 await,直到联机备份模式不再处于活动状态。在备份模式处于活动状态时,仍将允许新连接,但仅允许与超级用户构建连接(此 exception 允许超级用户进行连接以终止在线备份模式)。如果在请求智能关闭时服务器处于恢复状态,则只有在所有常规会话都终止之后,恢复和流式复制才会停止。
  • SIGINT

    • 这是快速关机模式。服务器禁止新连接,并发送所有现有服务器进程 SIGTERM,这将导致它们中止其当前事务并立即退出。然后,它 await 所有服务器进程退出并最终关闭。如果服务器处于联机备份模式,则备份模式将终止,从而使备份无用。
  • SIGQUIT

    • 这是立即关闭模式。服务器将 SIGQUIT 发送给所有子进程,并 await 它们终止。如果没有在 5 秒钟内终止,则会向他们发送 SIGKILL。所有子进程都退出后,主服务器进程将立即退出,而不进行正常的数据库关闭处理。下次启动时,这将导致恢复(通过重播 WAL 日志)。仅在紧急情况下才建议这样做。

pg_ctl程序提供了一个方便的接口,用于发送这些 signal 以关闭服务器。或者,您可以在非 Windows 系统上使用kill直接发送 signal。可以使用ps程序或通过数据目录中的文件postmaster.pid找到postgres进程的 PID。例如,要进行快速关机:

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

Important

最好不要使用 SIGKILL 关闭服务器。这样做将阻止服务器释放共享内存和 signal 量,然后可能必须先手动完成这些操作,然后才能启动新服务器。此外,SIGKILL 会杀死postgres进程而不让其将 signal 中继到其子进程,因此也有必要手动杀死各个子进程。

要在允许其他会话 continue 进行的同时终止单个会话,请使用pg_terminate_backend()(请参见Table 9.78)或向与该会话关联的子进程发送 SIGTERMsignal。