Postgresql内核源码分析-redo代码流程

 


目录

前言

总体介绍

代码路径

接口

入口函数

恢复状态检测

执行wal恢复

流程

扫描二维码关注公众号,回复: 15239261 查看本文章

关键流程

启动时机

结尾


前言

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。


总体介绍

当我们的数据库意外down机后,在内存缓存中的数据就会丢失,那如何恢复它们呢,这个步骤就是redo的过程。

简单来说,在数据库启动时会检查上次停止的状态,如果不是正常停止就会启动redo流程,redo也就是找到上一个checkpoint,然后对之后的wal进行回放。

代码路径

src/backend/access/transam

xlog.c

xlogrecovery.c

接口

  • 入口函数

void StartupXLOG(void)

在启动时调用一次

  • 恢复状态检测

在StartXlog时检测是否要进行恢复

  • 执行wal恢复

void PerformWalRecovery(void)

执行实际恢复

流程

  • 关键流程

  • 数据库状态

读取control文件,在postmasterMain中 调用 LocalProcessControlFile将文件读取到本地内存中,并进行CRC校检

计算每次checkpoint需要的wal 日志段文件数量,通过max_wal_size/max_seg_size *checkpoint_target_compeletion

最小为一个段文件

  • 事务号需要回卷,需要紧急启动vacuum

  • 进行恢复

启动startup进程进行恢复,主要在startupXLOG中,流程如下:

(1)根据control文件内容,判断是否需要恢复;

(2)删除relcache文件,更新control文件,加载两阶段事务文件,重置unlog表和snapshot文件,同时备份backup_label和tablespace_map文件

(3)在PerformWalRecovery中执行恢复;

(4)在checkpoint附近按块读取WAL,进行redo,直到达到恢复目标;

(5)调用由ApplyWalRecordWAL应用。其中调用各个资源对应的

rm_redo调用进行恢复

  • checkpoint创建

恢复成功后,需要将所有数据进行一次刷盘,创建一个新的checkpoint。

启动时机

redo是在StartupProcess进程中StartupXlog进行检查和执行的,此进程执行完成后就退出了。

PostmasterMain在serverloop前启动,此时数据库状态为STARTUP_RUNNING。


结尾

作者邮箱:[email protected]
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

猜你喜欢

转载自blog.csdn.net/senllang/article/details/129484339
今日推荐