18.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 进程,使其没有机会将信号转发给子进程,因此可能还需要手动逐个终止子进程。
要终止单个会话并允许其他会话继续运行,可使用 pg_terminate_backend()(参阅表 9.94),或者向与该会话相关的子进程发送 SIGTERM 信号。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.