有几种方式可以关闭数据库服务器。本质上,它们都会向 postgres
监管器进程发送信号。
如果您正在使用PostgreSQL的预打包版本,并且您使用它的设置来启动服务器,那么您也应该使用它的设置来停止服务器。详情请参考软件包级的文档。
直接管理服务器时,您可以向postgres
进程发送不同的信号来控制关闭类型
这是智能关闭模式。收到SIGTERM之后,服务器不允许新连接,但允许现有会话正常地结束工作。它只有在所有会话都终止之后才会关闭。如果在请求智能关闭时服务器正在恢复,则只有在所有常规会话都终止之后才能停止恢复和流复制。
这是快速关闭模式。服务器不允许新连接,并将SIGTERM发送给所有现有的服务器进程,这将导致它们中止当前事务并立即退出。然后它会等待所有服务器进程退出,最后关闭。
这是立即关闭模式。服务器会向所有子进程发送SIGQUIT并等待它们终止。如果任何进程在 5 秒内没有终止,它们会收到SIGKILL。监督服务器进程会在所有子进程退出后立即退出,而不会执行常规的数据库关闭处理。这将导致在下一次启动时恢复(通过重放 WAL 日志)。仅建议在紧急情况下这样做。
pg_ctl程序提供了一个方便的接口,可用于发送这些信号以关闭服务器。或者,您可以在非 Windows 系统上使用kill
直接发送信号。PIDpostgres
进程可使用ps
程序或数据目录中的文件postmaster.pid
来找到。例如,要执行快速关机
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
最好不要使用 SIGKILL 来关闭服务器。这样做将导致服务器无法释放共享内存和信号量。此外,SIGKILL 会终止 postgres
进程,而不让其将信号中继给其子进程,因此可能需要手动终止各个子进程。
要在允许其他会话继续的情况下终止单个会话,请使用 pg_terminate_backend()
(请参阅 表格 9.94)或向与会话关联的子进程发送 SIGTERM 信号。