多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 17.5\. 关闭服务器 有好几种关闭数据库服务器的方法。通过给`postgres`进程发送不同的信号, 你就可以控制关闭服务器的不同方法。 SIGTERM 这是_智能关闭_模式。接收到SIGTERM以后, 服务器不再允许新的连接,但是允许所有活跃的会话正常完成他们的工作, 只有在所有会话都结束任务后才关闭。如果服务器处在在线备份模式,它另外等待在线备份模式不再活跃。 当备份模式活跃时,将仍允许新的连接,但是只针对超级用户(这个例外允许超级用户连接以终止在线备份模式)。 如果当请求智能关闭时服务器正在恢复,那么恢复和流复制将在所有普通会话终止后停止。 SIGINT 这是_快速关闭_模式。不再允许新的连接,向所有活跃服务器发送SIGTERM (让它们立刻退出),然后等待所有子进程退出并关闭数据库。如果服务器处在在线备份模式, 备份模式将终止,使得备份无效。 SIGQUIT 这是_立即关闭_模式。主`postgres`进程将向所有子进程发送 SIGQUIT并且立即退出(所有子进程也会立即退出),而不会妥善地关闭数据库系统。 这样做会导致下次启动时的恢复(通过重放 WAL 日志)。我们推荐只在紧急的时候使用这个方法。 [pg_ctl](#calibre_link-544)程序提供了一个发送这些信号关闭服务器的便利接口。 另外,你在非Windows系统上可以用`kill`直接发送这些信号。 可以用`ps`命令或者从数据目录里的`postmaster.pid` 文件中找出`postgres`的PID。所以,举例来说,要做一次快速关闭: ``` $ <kbd class="literal">kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</kbd> ``` > **Important:** 最好不要用SIGKILL来关闭服务器。这样做将阻止服务器释放共享内存和信号灯, 那样的话你只能在新服务器启动前自己手动做这件事。另外,SIGKILL直接杀死`postgres` 进程而不等它传递信号给子进程,所以我们也将必须手动的杀死独立的子进程。 当允许其他会话继续时终止一个独立的会话,使用`pg_terminate_backend()` (参见[Table 9-59](#calibre_link-1377))或发送一个SIGTERM 信号到与这个会话有关的子进程。