Postgresql 中文操作指南

19.5. Shutting Down the Server #

有几种方法可以关闭数据库服务器。在底层,它们都缩减为向 postgres 进程发送一个信号。

如果您使用的是 PostgreSQL 的预打包版本,并且您使用了其启动服务器的配置,那么您还应该使用其配置来停止服务器。有关详细信息,请查阅包级别文档。

直接管理服务器时,可以通过向 postgres 进程发送不同的信号来控制关闭类型:

  • SIGTERM

    • 这是 Smart Shutdown 模式。收到 SIGTERM 后,服务器不允许建立新的连接,但允许现有会话正常结束其工作。只有在所有会话终止后,它才会关闭。当请求智能关闭时,如果服务器处于恢复状态,恢复和流复制将在所有常规会话终止后才停止。

  • SIGINT

    • 这是 Fast Shutdown 模式。服务器不允许新的连接,并向所有现有的服务器进程发送 SIGTERM,这将导致它们中止当前事务并立即退出。然后,它等待所有服务器进程退出,最后关闭。

  • SIGQUIT

    • 这是 Immediate Shutdown 模式。服务器将向所有子进程发送 SIGQUIT,并等待它们终止。如果在 5 秒内任何进程未终止,则将向它们发送 SIGKILL。一旦所有子进程都退出,主管服务器进程就会退出,而不会执行正常的数据库关闭处理。这将在下次启动时导致恢复(通过重放 WAL 日志)。仅在紧急情况下才建议这样做。

pg_ctl 程序提供了一个便利的界面,用于发送这些信号关闭服务器。对于非-Windows 系统,您也可以使用 kill 直接发送信号。可以使用 ps 程序查找 postgres 进程的 PID,或从数据目录中的 postmaster.pid 文件中查找。例如,要进行快速关机:

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

Important

最好不要使用 SIGKILL 关闭服务器。这样做将阻止服务器释放共享内存和信号。此外,SIGKILL 会在不将其转发给其子进程的情况下杀死 postgres 进程,因此可能还需要手动杀死各个子进程。

要终止单个会话,同时允许其他会话继续,使用 pg_terminate_backend()(参见 Table 9.90),或给与该会话关联的子进程发送 SIGTERM 信号。