1. 程式人生 > >PostgreSQL啟動恢復過程中日誌源的切換

PostgreSQL啟動恢復過程中日誌源的切換

日誌源會在XLOG_FROM_ARCHIVE->XLOG_FROM_STREAM->XLOG_FROM_ARCHIVE直接切換,只有讀取過程中出錯,就會切換到另外一個日誌源。但實際執行過程中,XLOG_FROM_ARCHIVE出錯後會到XLOG_FROM_PG_WAL讀取,但是日誌源的變數並不會改變。這個需要注意。

image.png

static int
XLogFileReadAnyTLI(XLogSegNo segno, int emode, int source)
{
 
	if (expectedTLEs)
		tles = expectedTLEs;
	else
		tles = readTimeLineHistory(recoveryTargetTLI);
	/*
	1、WaitForWALToBecomeAvailable呼叫時,source是XLOG_FROM_ARCHIVE時,會使用XLOG_FROM_ANY
	2、使用XLOG_FROM_ANY,會首先從歸檔中讀取xlog,如果open失敗,則會使用XLOG_FROM_PG_WAL
	3、外部日誌源變數並沒有切換
	*/
	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){
				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;
}