PostgreSQL崩溃恢复读取WAL

Posted yzs的专栏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL崩溃恢复读取WAL相关的知识,希望对你有一定的参考价值。


PostgreSQL崩溃恢复读取WAL_mysql

1、崩溃恢复和备机回放都是StartupXLOG函数进行处理,从pgcontrol文件中读取checkpoint位置,从这个位置开始读取WAL记录进行回放。

2、读取一个WAL记录的函数是ReadRecord,读取会后,根据类型进行回放;然后循环调用这个函数读取下一个WAL记录。

3、ReadRecord调用函数XLogReadRecord读取下一个WAL记录,若请求的记录不在当前页中,则需要读取一页到内存。如果读取的record为NULL,且是备机则切换日志源,从下一个日志源读取WAL

4、读取WAL的函数ReadPageInternal->XLogPageRead,日志源为流复制则根据条件判断读入的长度,否则为1页大小,但真正进行read的时候是以页为单位的。这里应该是读取的真实日志量。

5、日志读入内存的XLogReaderState->readBuf中,这个大小为8KB即一页大小。XLogReaderState->readLen为读入的日志量,有可能比8KB小

6、若下个WAL记录在下一页,需要跳过页头信息,否则为state->EndRecPtr即当前已读取的WAL记录末尾+1,即下一个WAL记录头

7、请求的大小为Min(targetRecOff + SizeOfXLogRecord, XLOG_BLCKSZ),即targetRecOff为WAL记录页内偏移,加上SizeOfXLogRecord即WAL记录头,即ReadPageInternal的reqLen长度最大才为一页大小。所以判断请求的WAL是否还在当前readBuf中条件:

if (targetSegNo == state->readSegNo && targetPageOff == state->readOff && reqLen <= state->readLen)

以上是关于PostgreSQL崩溃恢复读取WAL的主要内容,如果未能解决你的问题,请参考以下文章

LevelDB 源码剖析WAL模块:LOG 结构读写流程崩溃恢复

LevelDB 源码剖析WAL模块:LOG 结构读写流程崩溃恢复

PostgreSQL 9.2 归档恢复后最后重放的 WAL

PostgreSQL故障恢复能力之检查点(Checkpoint)

PostgreSQL启动恢复通过checkpoint open wal文件

CheckPoint