PostgreSQL启动恢复读取checkpoint时open wal日志

在上一篇博客https://blog.csdn.net/yanzongshuai/article/details/81415211中写到StartupXLOG最终会调用XLogFileReadAnyTLI打开归档日志或者WAL日志。

static int
XLogFileReadAnyTLI(XLogSegNo segno, int emode, int source)
{

	if (expectedTLEs)
		tles = expectedTLEs;
	else
		tles = readTimeLineHistory(recoveryTargetTLI);
    /*
    1、遍历时间线列表里的每一个时间线,从最新的开始
    2、当读取checkpoint的时候,source是XLOG_FROM_ANY
    3、先找归档的日志进行open;如果open失败再找WAL日志进行open
    4、如果都没有open成功,则向前找时间线,open前一个时间线segno和文件号相同的文件进行open
    5、open成功后expectedTLEs被赋值为当前时间线列表的所有值
    */
	foreach(cell, tles){
		TimeLineID	tli = ((TimeLineHistoryEntry *) lfirst(cell))->tli;

		if (tli < curFileTLI)
			break;				/* don't bother looking at too-old TLIs */

		if (source == XLOG_FROM_ANY || source == XLOG_FROM_ARCHIVE){
			fd = XLogFileRead(segno, emode, tli,XLOG_FROM_ARCHIVE, true);
			if (fd != -1){
				elog(DEBUG1, "got WAL segment from archive");
				if (!expectedTLEs)
					expectedTLEs = tles;
				return fd;
			}
		}

		if (source == XLOG_FROM_ANY || source == XLOG_FROM_PG_WAL)
		{
			fd = XLogFileRead(segno, emode, tli,XLOG_FROM_PG_WAL, true);
			if (fd != -1){
				if (!expectedTLEs)
					expectedTLEs = tles;
				return fd;
			}
		}
	}
	return -1;
}

这里有个问题,如果从pg_control文件里读取的checkpoint所在文件被删除了,则向前找上个时间线的文件。这样定位的checkpoint记录还正确吗?

猜你喜欢

转载自blog.csdn.net/yanzongshuai/article/details/81429337
WAL