当前位置: 首页 > article >正文

PostgreSQL之Checkpoint检查点进程

在文章PostgreSQL之整体架构中我们学习了PG数据库中有好几个background后台进程,其中一个后台进程是checkpointer检查点进程。这里我们学习一下什么是checkpointer检查点进程以及它的用处。

checkpointer后台进程主要工作就是做checkpoint的,它在以下几种情况下会执行checkpoint工作:

  • 上一次checkpoint到现在达到checkpoint_timeout超时时间,默认为5分钟(300秒)。
  • 在PG 9.4或更早版本,自上一次checkpoint以来,用完checkpoint_segments指定的WAL段文件个数(默认为3个)。
  • 在PG9.5或之后版本,pg_xlog(在PG 10版本及以后称为pg_wal)中的WAL段文件总大小超过max_wal_size值(默认为1GB,64个文件)。

当然,由超级用户手工触发CHECKPOINT命令也可以调度checkpoint工作。
下面再了解一下checkpoint过程都包含哪些内容。

注:在PG 9.1或早期版本中,由后台写进程(background writer process)同时完成checkpoint工作和刷脏页的工作。

了解checkpoint过程

checkpoint进程主要有两方面的用途:

  • 为数据库恢复做准备
  • 将共享内存中的脏页刷到磁盘

在这里插入图片描述
上图是关于PG中checkpoint的内部流程,可以总结如下:

  1. 在checkpoint进程开始后,会在内存中保存一个重做点(REDO point)。重做点是一个位置,记录最近一次checkpoint启动时写入XLOG记录的地址,这个地址也是数据库恢复的起始地址。
  2. 写入一条checkpoint对应的XLOG记录到WAL buffer中。记录的数据内容可参考CheckPoint数据结构,其中包含几个变量,比如上一步中的重做点。
  3. 共享内存中所有的数据被刷写到磁盘上(比如clog等)。
  4. 共享缓冲池中所有的脏页逐渐被刷写到磁盘上。
  5. 更新pg_control文件。pg_control文件包含一个基础信息,如checkpoint记录的地址。

总结来说,从数据库恢复的角度看,checkpoint过程创建一个包含重做点的checkpoint记录,以及把checkpoint地址和其他一些信息保存到pg_control文件
因此,PG启动后可以根据pg_control控制文件中记录的重做点并从对应的位置回放WAL中的数据,从而完成数据库的恢复过程

关于pg_control文件

由于pg_control文件中保存了checkpoint的基本信息,因此这个文件对数据库恢复非常重要,如果这个文件被损坏,数据库就不能进行正常的恢复。
pg_control文件中保存超过40个选项,其中有几个是主要的:

  • State - 保存最近一次checkpoint开始时的数据库状态。总共有7个状态,'start up’表示数据库处于启动状态;'shut down’表示数据库正在下线;'in production’表示数据库正在运行;等等。
  • Latest checkpoint location - 最近一次checkpoint记录的LSN位置
  • Prior checkpoint location - 前一次checkpoint记录的LSN位置,在PG 11版本开始已经被废弃。

以下是一个pg_control内容输出示例:

postgres> pg_controldata  /usr/local/pgsql/data
pg_control version number:            937
Catalog version number:               201405111
Database system identifier:           6035535450242021944
Database cluster state:               in production
pg_control last modified:             Thu Mar 30 15:16:38 2023
Latest checkpoint location:           0/C000F48
Prior checkpoint location:            0/C000E70

... snip ...

http://www.kler.cn/a/4722.html

相关文章:

  • Android SystemUI——服务启动流程(二)
  • Nginx配置VTS模块-对接Promethues监控
  • 零样本极速复刻语音!F5-TTS本地部署教程
  • 人工智能实验(四)-A*算法求解迷宫寻路问题实验
  • virtual box虚拟机误删Python3.6后导致UBUNTU18.04开机无UI界面(进不了desktop)的解决方法
  • 不同方式获取音频时长 - python 实现
  • 被大厂废掉的年轻人
  • Java虚拟机的类加载机制
  • “体育游戏第一股”投资未来,望尘科技走向价值兑现周期
  • ChatGPT使用拓展资料:BERT 带你见证预训练和微调的奇迹
  • 通俗易懂:什么是拉链表
  • NOIP模拟赛 序列(sequence)
  • 深入分析@PropertySource源码
  • SpringBoot源码学习系列——自动配置原理(一)
  • 简单的C++程序
  • java源码阅读 - TreeMap
  • 抖音进攻,B站退守
  • 单例模式是什么?如何实现它?
  • 【华为OD机试 2023最新 】 最大利润(C++)
  • 秃头警告 | 年薪50万PM总结的20个成功项目管理经验
  • GPT4中文调教指南。各种场景使用指南。学习怎么让它听你的话。
  • NOIP模拟赛 轰炸(bomb)
  • Callable接口
  • springboot整合redis实现秒杀功能
  • AI开发之——Leonardo—Finetuned Models及利用模型制图(5)
  • vue vben admin 使用, (个人感觉这项目封装的太深了!!!!)