当前位置:首页|资讯

CheckPoint之检查点执行流程(2)

作者:david007Bili发布时间:2024-09-05

      自数据库运行伊始,数据页始终存储于内存之中,唯有WAL日志会落盘留存。倘若数据库整整运行了一年,却突然崩溃,此时若要恢复,就不得不重放整整一年的WAL日志,这对于生产环境而言,是断然无法接受的。为化解此难题,PostgreSQL 提出了 “检查点(Checkpoint)” 这一概念,以此来解决上述问题。

      检查点(Checkpoint)代表这样一种操作,在某一个检查点时,所有脏数据页会写回到磁盘中,使得磁盘和内存中的数据保持一致。这样当故障恢复时,只需要从该检查点开始回放操作日志即可。

      另外,当数据页落盘之后,在这个检查点之前的WAL日志就可以不用了,可以安全的将其删除。使用检查点能够极大地减少恢复的时间和磁盘的用量。

     checkpoint是非常重的操作,涉及到多种进程以及文件协同工作,本文解析checkpoint执行流程。

checkpoint功能

      检查点的主要功能是将共享缓存(buffer)中的脏页面刷入磁盘,该部分主要由函数CreateCheckPoint完成,具体包含如下重要步骤:

1)、检查是否有重要数据更新;对于普通检查点创建来说,如果没有重要更新则不进行检查点创建;对于shutdown、恢复、强制检查点创建,即使没有重要日志依然需要做checkpoint

2)、记录检查点开始时LSN. 日志插入点Insert->CurrBytePos记录到RedoRecPtr变量中,这样在数据库故障恢复时,就可以以此为起点进行恢复。创建检查点后,此位置之前的WAL日志可以被删除.

3)、获取并记录CheckPoint结构体对应值.

checkPoint.redo保存检查点开始的LSN值,可用于故障恢复使用.

4)、收集脏页并将其刷入磁盘: 这是检查点的主要功能,遍历整个共享缓存,将其中的脏页刷入磁盘缓存,然后将磁盘缓存中的页面sync到磁盘介质,保证数据不会丢失,该部分由函数CheckPointGuts完成.除了共享缓冲区中的脏页,还包括其他需要落盘的数据,对应源码如下所示:


5)、生成记录检查点的WAL日志并落盘.

6)、更新控制文件信息并落盘,对应结构体为ControlFileData,通过pg_controldata命令可以查看详细字段信息.

      在global/pg_control文件中保存着数据库运行过程中的控制信息,可以通过pg_controldata工具查看该文件中的内容,其中包含checkpoint执行信息,执行命令为: pg_controldata -D 数据目录

ControlFileData包含如下几个重要字段:

    // 数据库状态 DBState

    DBState     state;        

    // 控制文件最后一次更新时间

    pg_time_t   time;          

    // 最近一次checkpoint的lsn位置

    XLogRecPtr  checkPoint;    

    // 最近一次checkpoint结构信息

    CheckPoint  checkPointCopy;

7)、删除无用的日志文件

计算哪些WAL日志是过时可以清理的,并将其清理.

CreateCheckPoint对应具体源码如下所示:

        本文主要介绍了 PostgreSQL 中检查点(Checkpoint)的执行流程,包括其背景和主要功能。背景方面,为解决数据库运行长时间后崩溃恢复时需重放大量 WAL 日志的问题,引入了检查点机制,它能使磁盘和内存数据一致,并删除之前无用的 WAL 日志,减少恢复时间和磁盘用量。功能方面,检查点的执行主要由CreateCheckPoint函数完成,具体步骤包括:

  1. 检查重要数据更新情况,某些特殊类型的检查点即使无重要更新也需创建。

  2. 记录检查点开始时的 LSN。

  3. 获取并记录 CheckPoint 结构体的值。

  4. 收集脏页并刷入磁盘,由CheckPointGuts函数完成,包括处理各种相关数据。

  5. 生成并落盘记录检查点的 WAL 日志。

  6. 更新控制文件信息并落盘。

  7. 删除无用的日志文件。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1