[walminer bug分析]checkpoint wal記錄的lsn與checkpoint記錄的redo點的關係

問題背景數據庫

walminer工具的用戶反饋來一個問題,無論添加了多少wal日誌,想要的wal文件的解析結果老是有未解析出的部分。ide

分析問題工具

分析問題發現,checkpoint wal記錄以後對某個數據page進行修改時,沒有對這個page執行FPW(疑問)。ui

而後去看wal文件中的checkpoint記錄(以下圖),this

發現checkpoint記錄的lsn與redo位置不一致,一時沒有想清楚這樣的緣由。最後想明白了checkpoint是一個須要花費必定時間的行爲。lsn記錄的是寫這條wal記錄的時候的wal位置,redo記錄的是checkpoint開始時的wal位置。所以以前的疑問就解決了:FPW行爲發生在checkpoint開始以後,而不是結束以後。我在遇到checkpoint wal記錄時執行了對程序內部FPW page的清理操做。所以會出現過早清理FPW page的問題,致使有一些wal記錄沒法解析。日誌

問題解決code

應該根據每個FPW page的lsn和checkpoint點的redo關係進行判斷是否要刪除這個FPW。blog

目前沒有時間作,暫時移除FPW page的中間清理機制。it

 

知識點記錄io

以下 是PG checkpoint的結構體,裏面有一個redo屬性,這個屬性記錄了checkpoint行爲開始時數據庫的最大LSN

typedef struct CheckPoint
{
	XLogRecPtr	redo;			/* next RecPtr available when we began to
								 * create CheckPoint (i.e. REDO start point) */
	TimeLineID	ThisTimeLineID; /* current TLI */
	TimeLineID	PrevTimeLineID; /* previous TLI, if this record begins a new
								 * timeline (equals ThisTimeLineID otherwise) */
	bool		fullPageWrites; /* current full_page_writes */
	uint32		nextXidEpoch;	/* higher-order bits of nextXid */
	TransactionId nextXid;		/* next free XID */
	Oid			nextOid;		/* next free OID */
	MultiXactId nextMulti;		/* next free MultiXactId */
	MultiXactOffset nextMultiOffset;	/* next free MultiXact offset */
	TransactionId oldestXid;	/* cluster-wide minimum datfrozenxid */
	Oid			oldestXidDB;	/* database with minimum datfrozenxid */
	MultiXactId oldestMulti;	/* cluster-wide minimum datminmxid */
	Oid			oldestMultiDB;	/* database with minimum datminmxid */
	pg_time_t	time;			/* time stamp of checkpoint */
	TransactionId oldestCommitTsXid;	/* oldest Xid with valid commit
										 * timestamp */
	TransactionId newestCommitTsXid;	/* newest Xid with valid commit
										 * timestamp */

	/*
	 * Oldest XID still running. This is only needed to initialize hot standby
	 * mode from an online checkpoint, so we only bother calculating this for
	 * online checkpoints and only when wal_level is replica. Otherwise it's
	 * set to InvalidTransactionId.
	 */
	TransactionId oldestActiveXid;
} CheckPoint;

 

 

每個wal記錄都有本身的LSN,checkpoint的wal記錄也有。

checkpoint會花費必定時間,checkpoint動做完成後纔會記錄checkpoint的wal記錄,所以redo與lsn有必定的差距。

相關文章
相關標籤/搜索