- 专栏内容:postgresql内核源码分析
- 个人主页:我的主页
- 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.
目录
前言
本文是基于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调用进行恢复
结尾
作者邮箱:[email protected]
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!