問題背景數據庫
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有必定的差距。