为何PgSQL主进程挂了,数据库还可运行?

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
 

数据库主进程挂了,原有的连接还能继续操作数据库,你信吗?下面,由DBA+杭州群联合发起人周正中告诉你,PostgreSQL是怎么可以做到的。

 

专家简介

 
 

周正中

网名:德哥@Digoal

DBA+杭州群联合发起人之一

 

PostgreSQL中国社区发起人之一,负责杭州分会,兼任社区CTO一职。曾就职于斯凯网络,负责数据库部门。现就职于阿里巴巴,负责RDS PG内核组事务。

 

 

 

数据库主进程挂了,原有的连接还能继续操作数据库,PostgreSQL就可以做到,并且原来的进程对数据库的操作是持久化的,不会丢数据哦。这得益于PostgreSQL的进程结构设计。而且postmaster进程只负责了简单的工作,例如监听端口。

 

有人会问了,wal writer、backgroup writer进程都挂了,数据还能持久化?没错,因为backend process也可以完成这些操作,所以不用担心数据丢失。

 

创建测试表。

 


 

将postgres主进程杀掉。

 

 

杀掉主进程后,只剩下backend process和logger进程,(当然wal buffer和shared buffer还在)。

 

然后在backend process对应的会话中写入记录。可以正常操作。

 

 

退出会话后,所有相关的进程都不在了,logger也退出了。

 

 

启动数据库。

 


 

查看不到之前插入的数据,原因是那个事务是异步的,而wal writter process进程当时已经不在了,backend process虽然可以完成flush wal buffer的功能,但是不像wal writter进程是周期性刷的,而是在申请不到BUFFER时才会触发刷BUFFER的动作。

所以一条记录就这样丢失了。

 

接下来,我们使用同步事务,可以保证数据不丢失。

 

 

使用同步事务写入数据并退出。

 

 

启动数据库。

 

 

可以看到,数据是持久化存储的。

 

 

注意,虽然backend process可以写wal buffer和shared buffer, 但是不能执行checkpoint, 因为这个操作是checkpoint做的,backend process只会告知它。当我们在postgres主进程被杀掉后,如果执行一个比较大的操作导致触发checkpoint的话,会在日志中看到这样的信息。

 

 

包括autovacuum, stat collecter process都不在了,所以这些操作也会失败。

 

例如:

 

 

可以看到对应的日志:

 

 

统计信息进程没了,所以统计信息也无法获取。

 

 

这里还引发一个问题,如果我们使用长连接来监控数据库状态的话,无法了解主进程是否健康,所以最好还是用短连接来监控数据库,至少可以判断认证这块还有主进程是否是正常的。不过短连接也有一定的问题,就是可能数据库的连接被占满了,无法获得连接。有利有弊,长连接+短连接的方式监控可能更加全面。

 

[其他]

 

关于crash自动重启的参数:

restart_after_crash (boolean)

 

 

对应的代码,某些场景会导致数据库重启。

src/backend/postmaster/postmaster.c

 

 

例如autovacuum进程被kill。断开所有backend process,重启autovacuum lanucher。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-10-30

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
72 2
|
19天前
|
SQL 数据库
gbase 8a 数据库 shm满导致gclusterd进程异常
gbase 8a 数据库 shm满导致gclusterd进程异常
|
2月前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
|
3月前
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
2月前
|
NoSQL Linux 程序员
进程管理与运行分析
进程管理与运行分析
25 0
|
4月前
|
数据采集 监控 API
如何监控一个程序的运行情况,然后视情况将进程杀死并重启
这篇文章介绍了如何使用Python的psutil和subprocess库监控程序运行情况,并在程序异常时自动重启,包括多进程通信和使用日志文件进行断点重续的方法。
|
4月前
|
存储 缓存 NoSQL
Redis内存管理揭秘:掌握淘汰策略,让你的数据库在高并发下也能游刃有余,守护业务稳定运行!
【8月更文挑战第22天】Redis的内存淘汰策略管理内存使用,防止溢出。主要包括:noeviction(拒绝新写入)、LRU/LFU(淘汰最少使用/最不常用数据)、RANDOM(随机淘汰)及TTL(淘汰接近过期数据)。策略选择需依据应用场景、数据特性和性能需求。可通过Redis命令行工具或配置文件进行设置。
101 2
|
4月前
|
Kubernetes Shell 测试技术
在Docker中,可以在一个容器中同时运行多个应用进程吗?
在Docker中,可以在一个容器中同时运行多个应用进程吗?
|
4月前
|
Linux
在Linux中,如何查看系统上运行的进程?
在Linux中,如何查看系统上运行的进程?
|
4月前
|
SQL 关系型数据库 Shell
【一文搞懂PGSQL】3.进程和关键文件介绍
PostgreSQL采用C/S模型,拥有多种关键进程,如PM(连接管理)、SP(会话)、SysLogger(系统日志)、BgWriter(后台写)、WALWriter(预写式日志)、PgArch(归档)、AutoVacuum(自动清理)、PgStat(统计收集)和CheckPoint(检查点)。其中,PM负责连接管理,SP处理用户会话,SysLogger记录系统日志(需在`postgresql.conf`中启用),BgWriter负责脏页写盘,WALWriter处理预写式日志,PgArch负责WAL日志归