龙空技术网

云贝数据 | PG数据库各种进程死掉会发生什么

云贝教育 100

前言:

眼前兄弟们对“用户进程和服务进程一样吗怎么设置”可能比较关注,咱们都想要分析一些“用户进程和服务进程一样吗怎么设置”的相关资讯。那么小编也在网摘上搜集了一些对于“用户进程和服务进程一样吗怎么设置””的相关文章,希望大家能喜欢,看官们快快来了解一下吧!

作者:白鳝

原文链接:

【云贝学院】PostgreSQL认证课程已上线,学院有不定期公开课 需要的同学可以加老师微信:19941464235

十多年前我写过一篇Oracle进程该怎么杀的文章,后来被收录到《DBA的思想天空》里作为Oracle进程结构的内容了。DBA杀进程在20多年前是一件十分高风险的事情,杀不好,把系统搞宕了,数据库重启业务得停上十来分钟,把小型机搞宕了,那有可能一两个小时都重启不好。而且那时候不太懂Oracle的进程架构,经常杀错。

现在大家对oracle的进程结构已经了解得很清楚了,什么进程能杀,什么不能杀,该怎么杀都是清清楚楚的,各种培训教材里都有介绍。对于PG数据库,这方面的介绍就很少。实际上PG的进程结构和Oracle的十分类似,用户进程和PG的服务进程之间也采用类似TWO TASK的方式。只要明白了PG的一些进程死掉后会发生什么样的事情,就可以了解哪些进程可以随便杀,哪些进程杀的时候要谨慎的杀,哪些进程要采用不同的方式去杀的策略了。

那么现在就进入今天的正式话题吧,PG数据库的各种进程死掉会发生什么事情呢?不同类型的PG进程死掉可能会发生不同的情况,了解这些细节对于DBA运维PG数据库来说十分关键。

因为PG数据库本身就支持异常进程出现后的自恢复,restart_after_crash参数如果设置为on,那么除非postmaster异常终止,PG数据库都会自动恢复,只是有些情况下,所有的用户会话都会被清理掉,可能让业务出现短暂的停顿。

首先是主进程Postmaster进程,该进程如果异常终止后,系统占用的共享内存和信号灯资源不会被主动释放。共享内存占用的内存资源不会主动释放。比如我们用kill -9命令杀掉了PG的主进程。

再来看看ipcs -a的信息:

共享内存段并没有被释放。不过比较好的是,当PG重启的时候,会自动清理以前没有释放的共享内存资源。

注意上面的数据,重启后shmid变了,说明以前的共享内存已经做了处理了。重启后的数据库实例的服务进程如下:

下面我们看看logger进程如果死了会怎么样?按照PG的官方文档上说,这个进程死了Postmaster会自动重启这个进程。

确实如PG官方文档所说,logger进程被自动重启了。数据库没有什么问题,已连接的会话都工作正常。同理,stats collector、logical replication launcher、archiver等进程被杀,都会安全地被重新启动。

下面我们来看看checkpointer,如果把只有的关键服务进程杀掉,PG数据库如果设置为restart_after_crash=on,那么杀掉这个进程,PG会自动重启后台进程,不过backend进程会受到影响,需要重连。只要我们的应用具备自动 重连的能力,那么应用很快就可以恢复。如果restart_after_crash设置为off,那么PG实例会宕机。Bgwriter、walwriter等后台进程的情况也都是类似的。

从上面的情况看,一些和核心功能无关的PG服务进程是可以比较安全的被杀掉的,一般来说Postmaster可以自动重启这些进程,不会影响backend。有些核心的服务进程如果被杀掉了,Postmaster需要重启一系列服务进程,为了确保数据库的一致性,所有的backend进程都会重置,这样所有的会话都会中断,需要重新连接。

除了我们使用kill -9(SIGKILL)去杀掉一个进程之外,如果我们发现某个关键的后台进程死掉了或者HANG在某个地方不动了,我们可以先采取使用kill命令向该进程发送信号量的方式看看能不能先恢复正常的操作,如果实在不行了再去用kill -9这种最为极端的手段。

上面的表是checkpointer进程街道各种kill信号采取的处置。

针对backend进程,PG比较让人诟病的是,有时候backend进程被杀掉,有可能会导致所有的会话都被重置,所有的backend都被清除。我们在杀掉backend进程的时候,还是要尽可能不要直接kill -9,因为postgres出现异常终止或者收到kill -9的时候,可能会重置所有的会话,回滚所有正在执行的事务,所有的正在执行SQL的客户端都收到SQL执行错误的信息。

为了避免出现这种情况,可以使用kill -SIGINT或者kill -SIGTERM这两种去杀掉backend,这两种kill命令对应于PG清理backend的两个存储过程: pg_cancel_backend和 pg_terminate_backend。向backend发送SIGINT的时候,backend会终止当前的事务,不过并不会结束会话,而向backend 发送SIGTERM的时候除了中断当前的事务还会中断会话。

了解了PG数据库进程死掉后会发生什么之后,是不是对于杀PG的进程有信心多了,DBA维护数据库系统,杀进程是常事。如果我们对某些知识懵懵懂懂,那么我们做什么都怕得要命,而如果我们真正理解了这些,一切都变得不那么可怕了。希望今天的文章可以让你在杀PG进程的时候更加自信一点。

*禁止转载,可转发(转发文章请注明出处)

【云贝学院】PostgreSQL认证课程已上线,学院有不定期公开课 需要的同学可以加老师微信:19941464235

标签: #用户进程和服务进程一样吗怎么设置