17.5. 关闭服务

有几种关闭数据库服务的方法。通过给postgres 进程发送不同的信号,你就可以控制关闭服务器的不同方法。

SIGTERM

这是智能关机模式。在接受SIGTERM后, 服务器将不允许新连接,让存在的会话和它们的工作正常。仅当所有的会话终止后它才关闭。 如果服务器处联机备份模式,此外,它将等待直到在线备份模式不再是活动的。但联机备份模式是活动的, 仍然允许新的连接,但是只能是超级用户(这一例外允许连接到超级用户终止联机备份模式)。 如果服务器在恢复时请求智能关机,恢复和流媒体复制将在所有通常的会话都终止后才停止。

SIGINT

这是快速关闭模式。不再允许新的连接,向所有活跃服务进程发送SIGTERM (让它们立刻退出),然后等待所有子进程退出并关闭数据库。 如果服务处于在线备份模式,将终止备份模式,使备份无用。

SIGQUIT

这是立即关闭模式。主进程postgres 向所有子进程发送SIGQUIT 并且立即退出(所有子进程也会立即退出),而不会妥善地关闭数据库系统。 这样做会导致下次启动时的恢复(通过重放WAL日志)。 我们推荐只在紧急的时候使用这个方法。

pg_ctl程序提供了一个发送这些信号关闭服务的便利接口。 另外,你在非windows系统下可以用kill直接发送这些信号。 可以用ps命令或者从数据目录里的 postmaster.p id文件中找出postgresPID。所以,举例来说,要做一次快速关闭:

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

Important: 关闭服务器时最好不要使用SIGKILL。 这样做将会阻止服务器释放共享内存和信号量,则可以开始一个新的服务器之前,可能需要手动完成。 此外,使用SIGKILL杀掉postgres进程,还没有传递信号到它的子进程, 所以必须手工杀死个别子进程。

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