9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

19.5. 关闭服务器

有几种关闭数据库服务器的方法。在后台,它们都简化为向主管 postgres 进程发送信号。

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

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

SIGTERM

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

SIGINT

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

SIGQUIT

这是立即关闭模式。 服务器将向所有子进程发送SIGQUIT并等待它们终止。 如果有任何进程在5秒内未终止,它们将被发送SIGKILL。 一旦所有子进程退出,监督服务器进程将立即退出,而不进行正常的数据库关闭处理。 这将导致在下次启动时通过回放WAL日志进行恢复。仅在紧急情况下建议使用。

pg_ctl程序提供了一个发送这些信号关闭服务器的方便的接口。 另外,你在非 Windows 系统上可以用kill直接发送这些信号。可以用ps程序或者从数据目录的postmaster.pid文件中找到postgres进程的PID。例如,要做一次快速关闭:

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

重要

最好不要使用SIGKILL关闭服务器。这样做将会阻止服务器释放共享内存和信号量。 此外,使用SIGKILL杀掉postgres进程时,postgres不会有机会将信号传播到它的子进程,所以可能也必须手工杀掉单个的子进程。

要终止单个会话同时允许其他会话继续,使用pg_terminate_backend()(参阅表 9.88) 或发送SIGTERM信号到该会话相关的子进程。