Postgresql清理WAL日志


WALWrite Ahead Log的簡寫,和oracle的redo日志類似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目錄.

1、如果開啟了歸檔,在目錄archive_status下會有一些文件,以ready結尾的,表示可以歸檔但還沒有歸檔,done結尾的表示已經歸檔。

WAL日志數量相關的幾個參數:

2、如果沒有開啟歸檔的情況下:

不超過以下兩個公式計算得出的個數:

  • (2 + checkpoint_completion_target) * checkpoint_segments + 1
  • 或者checkpoint_segments + wal_keep_segments + 1

9.5以后,如果超過了max_wal_size,那么就會刪除不需要的wal.

如果開啟了歸檔,那么歸檔成功了,才會被清除,所以這里注意一下,如果你開啟了歸檔,但是歸檔命令是失效的,那么wal目錄會一直增長,不會自動刪除WAL,會使得此目錄被撐爆

3. 什么情況下回自動清理wal

  1. 做檢查點的時候;

  2. 數據庫啟動的時候,或者修改了相關參數后重啟數據庫。

    觸發檢查點的情況:

  3. 從前一個檢查點發生過后的時間超過checkpoint_timeout設置的間隔(默認間隔為300秒(5分鍾))。

  4. 在版本9.4或更早版本中,自上一個檢查點以來,超過使用checkpoint_segments(默認數量為3)設置的WAL段文件數量。

  5. 在9.5或更高版本中,pg_xlog(版本10或更高版本,pg_wal)中WAL段文件的總大小已超過參數max_wal_size的值(默認值為1GB(64個文件))。

  6. PostgreSQL服務在smart和fast模式下停止。

  7. 手動執行checkpoint.

3. 如何手動清理wal

可以通過縮小以上涉及到的函數減少wal segment的數量,也可以手動刪除,如下:

這里表示16/79FF54E8檢查點已經執行,已經包含在00000001000000160000001E日志文件中,那么這個日志之前的日志是可以清理的。

可以手動使用系統命令rm清理,也可以使用pg_archivecleanup清理
比如:

 

或者直接刪除指定前幾天日志

find ./ -mtime +10 -exec rm -f {} \; #刪除10天以前的所有日志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM