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