天天看點

pg_wal目錄的清理

pg_wal目錄存放了資料庫在運作過程中産生的WAL檔案,很顯然随着資料庫的增長wal檔案會不斷的增加,那麼自然也就需要一種清理機制去報錯pg_wal的穩定。

wal檔案是循環使用的嗎

​min_wal_size​

​​ (​

​integer​

​)

隻要 WAL 磁盤用量保持在這個設定之下,在檢查點時舊的 WAL 檔案總是 被回收以便未來使用,而不是直接被删除。這可以被用來確定有足夠的 WAL 空間被保留來應付 WAL 使用的高峰,例如運作大型的批處理任務。 如果指定值時沒有機關,則以兆位元組為機關。預設是 80 MB。這個參數隻能在​

​postgresql.conf​

​ 或者伺服器指令行中設定。

從官網中對min_wal_size的描述中就可以發現,wal檔案并不是删除在建立的,而且是通過重複使用的方式完成。熟悉oracle的就知道oracle中的redo檔案就是通過循環使用的,循環使用的,而且一次性就會配置設定member所指定的大小,是以不管什麼時候都會看到redo的檔案的大小都是保持不變的。那麼為什麼不采用append的方式産生多少就占用多少空間的方式去寫日志檔案呢?那是因為如果采用append的方式去寫日志,那麼每一次寫入都會産生2次IO操作,一次是對資料本身的寫入,另外一次是對中繼資料的寫入也就是需要更新這個檔案占用空間的大小,很顯然這種方式在性能上面是損失的。

在postgresql中,我們表面上看到的是不斷有新的wal檔案産生,然後在進行寫入,實際上postgresql是采用硬連結重命名的方式進行wal檔案的。

關于pg_wal目錄的檔案清理

pg_wal目錄存放的是檢查點之後的wal日志,在做執行個體恢複的時候需要的日志,一般情況下不建議手工清理pg_wal裡面的日志檔案,假設我們想減少pg_wal目錄裡面的數量,就可以适當的提高檢查點的頻率,反之亦然。

pg_wal目錄的大小,本質上就是取決于檢查點的頻率。檢查點頻率越高,執行個體恢複的資料越少,那麼pg_wal目錄需要儲存的wal檔案就越少。檢查點頻率越低,記憶體中的髒資料就越多,執行個體恢複的資料就越多,pg_wal目錄需要儲存的檔案也就越多。