您的位置:首页 >宏观经济 >

如何运用StartupXLOG函数恢复读取WAL?

时间:2021-05-20 11:55:04 来源:yzsDBA

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)


郑重声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。
猜你喜欢