支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

18.5. 关闭服务器 #

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

如果您使用的是预打包版本的 PostgreSQL,并且使用了它提供的启动服务器的方式,那么您也应该使用它提供的停止服务器的方式。有关详细信息,请查阅包级文档。

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

SIGTERM

这是智能关闭模式。收到 SIGTERM 后,服务器会禁止新连接,但允许现有会话正常结束其工作。只有在所有会话终止后才会关闭。如果在请求智能关闭时服务器正在恢复中,则只有在所有常规会话终止后才会停止恢复和流复制。

SIGINT

这是快速关闭模式。服务器禁止新连接,并向所有现有服务器进程发送 SIGTERM,这将导致它们中止当前事务并立即退出。然后,它会等待所有服务器进程退出,最后关闭。

SIGQUIT

这是立即关闭模式。服务器将向所有子进程发送 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.94)或向与该会话关联的子进程发送 SIGTERM 信号。

提交更正

如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。