PostgreSQL关闭模式

举报
宁谷花雨 发表于 2023/02/25 18:37:48 2023/02/25
【摘要】 一、Shutdown smart模式:1、pg_ctl中发送SIGTERM信号给postmaster,并定时等待判断服务端是否已退出,如果等待超时,打印提示信息退出。 2、postmaster1)postmaster收到pg_ctl发送的SIGTERM信号后,进入pmdie函数,堆栈如下: #0  pmdie (postgres_signal_arg=15) at postmaster.c:...

一、Shutdown smart模式:

1、pg_ctl中

发送SIGTERM信号给postmaster,并定时等待判断服务端是否已退出,如果等待超时,打印提示信息退出。

 

2、postmaster

1)postmaster收到pg_ctl发送的SIGTERM信号后,进入pmdie函数,堆栈如下:

 

#0  pmdie (postgres_signal_arg=15) at postmaster.c:2779

#1  <signal handler called>

#2  0x00007fb94060a093 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:81

#3  0x00000000008afe5e in ServerLoop () at postmaster.c:1709

#4  0x00000000008af84d in PostmasterMain (argc=3, argv=0x1538a80) at postmaster.c:1417

#5  0x00000000007b1514 in main (argc=3, argv=0x1538a80) at main.c:209

2)在pmdie函数中,设置Shutdown值为SmartShutdown 和connsAllowed值为ALLOW_SUPERUSER_CONNS,然后进入PostmasterStateMachine函数

       注:此时的pmState 为PM_RUN

3)PostmasterStateMachine函数

检查是否正在备份,如果没有正在备份时,设置connsAllowed值为ALLOW_NO_CONNS

如果connsAllowed值为ALLOW_NO_CONNS时,检查是否有客户端连接(BACKEND_TYPE_NORMAL),

如果没有客户端连接(BACKEND_TYPE_NORMAL),设置pmState值为PM_STOP_BACKENDS,开始退出后台backends,直到状态机pmState设置为PM_NO_CHILDREN,并调用ExitPostmaster退出。

如果有客户端连接(BACKEND_TYPE_NORMAL),本次不处理,在下次收到客户端连接退出后发送的SIGCHLD信号后继续处理。

如果connsAllowed值不为ALLOW_NO_CONNS时,本次不处理,在下次收到客户端连接退出后发送的SIGCHLD信号后继续处理。

3、客户端连接退出时,调用PostmasterStateMachine函数进行状态机处理,堆栈如下:

 

(gdb) bt

#0  ExitPostmaster (status=0) at postmaster.c:5156

#1  0x00000000008b34b3 in PostmasterStateMachine () at postmaster.c:4004

#2  0x00000000008b2192 in reaper (postgres_signal_arg=17) at postmaster.c:3258

#3  <signal handler called>

#4  0x00007fda80fc7093 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:81

#5  0x0000000000b82c57 in pg_usleep (microsec=100000) at pgsleep.c:56

#6  0x00000000008afdf9 in ServerLoop () at postmaster.c:1694

#7  0x00000000008af84d in PostmasterMain (argc=3, argv=0x178da80) at postmaster.c:1417

#8  0x00000000007b1514 in main (argc=3, argv=0x178da80) at main.c:209

 

二、shutdown fast模式

1、pg_ctl:

发送SIGINT信号

2、postmaster

在pmdie中设置Shutdown值为FastShutdown 和 pmState值为PM_STOP_BACKENDS,然后进入PostmasterStateMachine状态机处理函数。

 

三、shutdown immediate模式

1、pg_ctl:

发送SIGQUIT信号

2、postmaster

pmdie中设置Shutdown值为ImmediateShutdown,然后发送SIGQUIT信号给所有child通知其退出,再设置pmState值为PM_STOP_BACKENDS,然后进入PostmasterStateMachine状态机处理函数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。