有几种关闭数据库服务器的方法。在底层,它们都归结为向 supervisor postgres
进程发送信号。
如果您使用的是预打包版本的 PostgreSQL,并且您使用了其启动服务器的规定,那么您也应该使用其停止服务器的规定。请参阅特定软件包的文档了解详情。
当直接管理服务器时,您可以通过向 postgres
进程发送不同的信号来控制关闭的类型。
这是智能关闭模式。收到 SIGTERM 后,服务器将不允许新的连接,但允许现有会话正常完成工作。它只在所有会话终止后才关闭。如果服务器在请求智能关闭时处于恢复状态,则恢复和流复制将在所有常规会话终止后才停止。
这是快速关闭模式。服务器将不允许新的连接,并向所有现有服务器进程发送 SIGTERM,这将导致它们中止当前事务并迅速退出。然后它会等待所有服务器进程退出,最后关闭。
这是立即关闭模式。服务器将向所有子进程发送 SIGQUIT,并等待它们终止。如果在 5 秒内任何进程没有终止,它们将被发送 SIGKILL。supervisor 服务器进程在所有子进程退出后立即退出,而无需执行正常的数据库关闭处理。这将在下次启动时导致恢复(通过重放 WAL 日志)。仅在紧急情况下推荐使用此方式。
pg_ctl 程序提供了一个方便的接口,用于向服务器发送这些信号以进行关闭。或者,在非 Windows 系统上,您可以使用 kill
命令直接发送信号。有关PIDpostgres
进程的 PID 可以使用 ps
程序找到,或者从数据目录中的 postmaster.pid
文件中找到。例如,要进行快速关闭
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
最好不要使用 SIGKILL 来关闭服务器。这样做将阻止服务器释放共享内存和信号量。此外,SIGKILL 会在不让 postgres
进程将其信号传递给其子进程的情况下终止它,因此可能需要手动终止各个子进程。
要终止单个会话但允许其他会话继续,请使用 pg_terminate_backend()
(参见 表 9.96),或向与该会话关联的子进程发送 SIGTERM 信号。
如果您在文档中发现任何不正确之处、与您对特定功能的实际体验不符之处,或者需要进一步澄清之处,请使用 此表单 报告文档问题。