2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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直接发送信号。该PID可以使用 ps 程序或从数据目录中的 postmaster.pid 文件中找到 postgres 进程。例如,要进行快速关闭

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

重要

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

要在允许其他会话继续的同时终止单个会话,请使用pg_terminate_backend()(请参阅表 9.94)或向与会话关联的子进程发送SIGTERM信号。

提交更正

如果您在文档中发现任何错误,与您对特定功能的体验不符或需要进一步澄清,请使用此表格报告文档问题。