17.5. 关闭服务器

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

SIGTERM

这是智能关闭模式。接收到SIGTERM以后, 服务器不再允许新的连接,但是允许所有活跃的会话正常完成他们的工作, 只有在所有会话都结束任务后才关闭。如果服务器处在在线备份模式,它另外等待在线备份模式不再活跃。 当备份模式活跃时,将仍允许新的连接,但是只针对超级用户(这个例外允许超级用户连接以终止在线备份模式)。 如果当请求智能关闭时服务器正在恢复,那么恢复和流复制将在所有普通会话终止后停止。

SIGINT

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

SIGQUIT

这是立即关闭模式。 服务器将发送SIGQUIT到所有子进程, 并等待它们结束。这样并不能在5秒钟之内终止,通过主postgres 进程发送SIGKILL,将不等待的立即结束它们。 这样做会导致下次启动时的恢复(通过重放 WAL 日志)。我们推荐只在紧急的时候使用这个方法。

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

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

重要: 最好不要用SIGKILL来关闭服务器。这样做将阻止服务器释放共享内存和信号灯, 那样的话你只能在新服务器启动前自己手动做这件事。另外,SIGKILL直接杀死postgres 进程而不等它传递信号给子进程,所以我们也将必须手动的杀死独立的子进程。

当允许其他会话继续时终止一个独立的会话,使用pg_terminate_backend() (参见表 9-64)或发送一个SIGTERM 信号到与这个会话有关的子进程。