在PostgreSQL中,关闭数据库服务有三种模式,分别是智能关闭(Smart Shutdown)、快速关闭(Fast Shutdown)和立即关闭(Immediate Shutdown)。以下是每种模式的详细例子:
-
智能关闭模式:这是最安全的关闭方式,它向postgres主服务进程发送一个SIGTERM信号。服务器将不允许新的客户端连接,同时等待已有会话正常完成工作。当所有会话都主动终止连接之后,关闭服务。如果数据库服务正在执行恢复操作时发送了关闭命令,恢复操作和流复制都会等待所有常规会话终止后停止。使用pg_ctl工具关闭数据库服务的命令如下:
$ pg_ctl stop -m smart
这种模式类似于Oracle数据库中的正常关闭(shutdown normal)模式。
-
快速关闭模式:这种模式对应的信号为SIGINT。服务器不允许新的客户端连接,同时向所有的服务进程发送SIGTERM信号,回滚进行中的事务并且强制断开所有客户端的连接,然后关闭数据库。使用pg_ctl工具快速关闭数据库服务的命令如下:
$ pg_ctl stop -m fast
或者简单地使用:
$ pg_ctl stop
fast模式是默认模式,它类似于Oracle数据库中的立即关闭(shutdown immediate)模式。
-
立即关闭模式:这是最快速的关闭方式,但是风险最高。它向所有的子进程发送SIGQUIT信号,如果5秒内子进程没有终止,继续发送立即终止的SIGKILL信号。当所有子进程退出后,主服务进程立即终止,不会执行常规的数据库关闭流程。这种模式会导致下一次启动数据库服务时需要执行恢复操作(重做WAL日志),只推荐在紧急情况下使用。使用pg_ctl工具立即关闭数据库服务的命令如下:
$ pg_ctl stop -m immediate
这种模式类似于Oracle数据库中的立即关闭(shutdown abort)模式。
除了使用pg_ctl工具外,你也可以使用kill命令发送信号来关闭数据库,例如:
$ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`
其中,postmaster.pid
文件中存储了主服务进程(postgres)的PID。
注意:不建议使用SIGKILL信号关闭服务,这种方式会阻止服务释放共享内存和信号量,并且这种方式终止主服务器进程时不会发送信息到子进程,因此还需要手动关闭每个子进程。
喜欢本文,请点赞、收藏和关注!