PG10.3 配置主從同步流複製:1主+1從,主從節點的的參數wal_keep_segments = 10 。 主節點頻頻插入數據,在從節點的pg_wal目錄下有時候會有40多個WAL文件。rest
主節點作checkpoint時,會把checkpoint的信息也寫到WAL日誌中。其中的checkpoint.redo記錄了當時的LSN,執行checkpoint操做的目的就是保證checkpoint.redo以前的數據改動都落盤。日誌
從節點端讀取WAL,作數據恢復時,會記錄從WAL中讀到的最近兩次checkpoint: -- checkpoint_new表示最近的一次 -- checkpoint_old表示比checkpoint_new更早的一次同步
從節點端在作恢復時,也會作checkpoint,內部叫作restartpoint, 即把數據落盤,可是不會在WAL中產生新的checkpoint記錄。配置
從節點只有作checkpoint時纔會刪掉/重用已有的WAL文件,若是不作checkpoint,則WAL文件持續增長。命名
包含不少狀況,每一種狀況下有不一樣的計算公式。 這裏舉例一種狀況,該狀況會保留不少的WAL文件。數據
處理邏輯舉例: wal_keep_segments = 10 #默認保留10個WAL文件。 max_wal_size = 1GB #轉換到WAL文件數:1G/16M=64個WAL文件文件
checkpoint_old.redo表示主節點上次checkpoint時候,已經落盤的數據對應的LSN+1, checkpoint_old.redo對應的WAL文件保留,更早的WAL文件稱做「可刪除WAL文件」,被刪除或重用。poi
每個WAL文件都有一個惟一的序號,PG內部使用這個序號。給定的LSN,計算LSN/16M(取模),獲得WAL文件序號。序號最終會對應到WAL文件名。new
若是從節點當前最新的WAL文件序號是cur_no, checkpoint_old.redo對應的WAL文件序號是old_no,那麼old_no-1以及以前的WAL文件通通刪掉/重用。保留的文件數量是keep_num=cur_no - old_no + 1,這個數可能會很大。若是keep_num < wal_keep_segments,例如:keep_num=5, wal_keep_segments=10,則old_no-6以及以前的WAL文件被刪掉或重用。參數
也是有幾種不一樣的狀況,每一種狀況下,其計算方式不一樣。
簡單的一種狀況: 比old_no-1老的10個「可刪除WAL文件」被重命名成10個將來的WAL文件,剩餘的「可刪除WAL文件」刪掉。
一種複雜的計算方式是: max_wal_size=1G, 轉換成WAL文件數量: max_num = max_wal_size/16M = =64 若是 reuse_num =(old_no + max_num ) - cur_no, 若是reuse_num>0, 則要把reuse_num個「可刪除WAL文件」重命名爲將來的WAL文件,其它的「可刪除WAL文件」刪掉。
在主節點,pg_wal目錄下的WAL文件數量遵循相似的規律,也會有多於wal_keep_segments個文件。