关闭服务
关闭服务¶
有几种关闭数据库服务的方法。通过给seaboxsql
进程发送不同的信号,你就可以控制关闭类型。
- SIGTERM
-
智能关闭模式。在接收SIGTERM后,服务将不允许新连接,但是会让现有的会话正常结束它们的工作。仅当所有的会话终止后它才关闭。
如果服务处在线备份模式,它将等待直到在线备份模式不再被激活。当在线备份模式被激活时,仍然允许新的连接,但是只能是超级用户的连接(这一例外允许超级用户连接来终止在线备份模式)。
如果服务在恢复时请求智能关闭,恢复和流复制只有在所有正常会话都终止后才停止。
- SIGINT
-
快速关闭模式。服务不再允许新的连接,并向所有现有服务进程发送SIGTERM,让它们中断当前事务并立刻退出。然后服务等待所有服务进程退出并最终关闭。
如果服务处于在线备份模式,备份模式将被终止并致使备份无用。
- SIGQUIT
-
是立即关闭模式。服务将给所有子进程发送SIGQUIT并且等待它们终止。如果有任何进程没有在5 秒内终止,它们将被发送SIGKILL。主服务进程将在所有子进程退出之后立刻退出,而无需做普通的数据库关闭处理。这将导致在下一次启动时(通过重放 WAL 日志)恢复。只在紧急 时才推荐这种方式。
sd_ctl程序提供了一个发送这些信号关闭服务的方便的接口。
另外,可以用kill
直接发送这些信号。可以用ps
程序或者从数据目录的seaboxmaster.pid
文件中找到seaboxsql
进程的PID。例如,要做一次快速关闭:
$ kill -INT `head -1 /usr/local/sdsql/data/seaboxmaster.pid`
重要
最好不要使用SIGKILL关闭服务。这样做将会阻止服务释放共享内存和信号量,那么在开始一个新的服务之前,可能需要手动完成这些释放。
此外,使用SIGKILL杀掉seaboxsql
进程时,seaboxsql
不会有机会将信号传播到它的子进程,所以也必须手工杀掉单个的子进程。
要终止单个会话同时允许其他会话继续,使用pg_terminate_backend()
(参阅表 服务信号函数)或发送SIGTERM信号到该会话相关的子进程。