PG数据库内核分析学习笔记_XLOG日志恢复策略
在PostgreSQL中,系统在崩溃后重新启动时会调用StartupXlog入口函数.
// xlog.c
/*
* This must be called ONCE during postmaster or standalone-backend startup
*/
void
StartupXLOG(void)
{
XLogCtlInsert *Insert;
CheckPoint checkPoint;
bool wasShutdown;
bool reachedStopPoint = false;
bool haveBackupLabel = false;
bool haveTblspcMap = false;
XLogRecPtr RecPtr,
checkPointLoc,
EndOfLog;
TimeLineID EndOfLogTLI;
TimeLineID PrevTimeLineID;
XLogRecord *record;
TransactionId oldestActiveXID;
bool backupEndRequired = false;
bool backupFromStandby = false;
DBState dbstate_at_startup;
XLogReaderState *xlogreader;
XLogPageReadPrivate private;
bool fast_promoted = false;
struct stat st;
该函数首先会扫描全 局信息控制文件(global/pg_control)读取系统的控制信息.
/*
* Read control file and check XLOG status looks valid.
*
* Note: in most control paths, *ControlFile is already valid and we need
* not do ReadControlFile() here, but might as well do it to be sure.
*/
ReadControlFile();
然后扫描XLOG 0志目录的结构检测其 是否完整.
/*
* Verify that pg_wal and pg_wal/archive_status exist. In cases where
* someone has performed a copy for PITR, these directories may have been
* excluded and need to be re-created.
*/
ValidateXLOGDirectoryStructure();
进而读取到最新的日志检査点记录.
/*
* When a backup_label file is present, we want to roll forward from
* the checkpoint it identifies, rather than using pg_control.
*/
record = ReadCheckpointRecord(xlogreader, checkPointLoc, 0, true);
if (record != NULL)
接下来根据日志记录序列的偏序关系检测到系统是 否处于非正常状态下,若系统处于非正常状态,则触发恢复机制进行恢复。恢复完成后重新建立检 査点并初始化XlogCtl控制信息,然后启动事务提交日志以及相关辅助日志模块。
日志中岀现以下三种情况需要进行恢复操作
1) 日志文件中扫描到backup_label文件。
if
PG数据库XLOG恢复策略

本文深入探讨了PostgreSQL数据库的XLOG日志恢复机制,包括崩溃后重启的处理流程,如扫描全局信息控制文件、验证XLOG目录结构、读取最新日志检查点记录,以及基于偏序关系的日志恢复条件。文章详细解析了不同日志类型的恢复操作,如Database、Heap、B-Tree和Xlog类型的Redo操作,最后介绍了事务提交日志及辅助日志模块的启动过程。
最低0.47元/天 解锁文章
512

被折叠的 条评论
为什么被折叠?



