WAL
是Write 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
做檢查點的時候;
數據庫啟動的時候,或者修改了相關參數后重啟數據庫。
觸發檢查點的情況:
從前一個檢查點發生過后的時間超過checkpoint_timeout設置的間隔(默認間隔為300秒(5分鍾))。
在版本9.4或更早版本中,自上一個檢查點以來,超過使用checkpoint_segments(默認數量為3)設置的WAL段文件數量。
在9.5或更高版本中,pg_xlog(版本10或更高版本,pg_wal)中WAL段文件的總大小已超過參數max_wal_size的值(默認值為1GB(64個文件))。
PostgreSQL服務在smart和fast模式下停止。
手動執行checkpoint.
3. 如何手動清理wal
可以通過縮小以上涉及到的函數減少
wal segment
的數量,也可以手動刪除,如下:
這里表示
16/79FF54E8
檢查點已經執行,已經包含在00000001000000160000001E
日志文件中,那么這個日志之前的日志是可以清理的。可以手動使用系統命令
rm
清理,也可以使用pg_archivecleanup
清理
比如:
或者直接刪除指定前幾天日志
find ./ -mtime +10 -exec rm -f {} \; #刪除10天以前的所有日志。