1. 程式人生 > >Postgresql日誌系統的實現(六)

Postgresql日誌系統的實現(六)

1.3.2需要寫日誌的操作分析

1.3.2.1主要操作步驟分析:

所有可進行恢復的專案,都需要在事務進行的過程中按照如下順序寫日誌,以便在需要恢復時有足夠的備份資訊幫助恢復。

如執行“insert into table_1 values(1,1)”,將呼叫“heap_insert”方法,執行“heap_insert”方法完畢後,就需要立即執行“XLogInsert”,以便記載資訊:

recptr = XLogInsert(RM_HEAP_ID, info, rdata);

PageSetLSN(page, recptr);

PageSetTLI(page, ThisTimeLineID);

注意,所有寫日誌的操作都呼叫XlogInsert()進行,XlogInsert()中通過呼叫XLogWrite()將日誌記錄寫入緩衝區,“XLogInsert”的返回值是“XLogRecPtr”結構型別,其實際功效可以作為“LSN”(log secquence number)使用,在執行“XLogInsert”後,即把其返回值“XLogRecPtr”型別的內容通過呼叫“PageSetLSN”記載到“page”中,這提示我們將來可以據此考慮實現增量備份。

隨後,呼叫“PageSetTLI”把本次系統啟動以來(不管是否恢復過)相對應的正確的時間線“ThisTimeLineID”記載到“page

”(page將在適時的時候被pgwriter刷出到磁碟),這樣,保證了本次系統執行中所執行的事務在xlog日誌中記載的時間線不和上次相同,以便於區分不同的恢復資料。

當事務要結束的時候,將呼叫“XlogFlush 把日誌緩衝區中的資料刷到磁碟上,以保證“WAL”的實施(注意下圖中的事務提交和取消呼叫與“XlogFlush”的關係):