背景
發現數據庫宕機,排查原因發現數據磁盤爆滿,經排查發現是數據庫數據目錄下,pg_wal目錄占用過大導致。
pg_wal(Write-AHead Logging) 說明
wal日志位置:
$PGDATA/pg_wal(pg10之前叫pg_xlog)
#
#wal日志文件命名規則:
#我們看到的wal日志是這樣的:000000010000000100000092
#其中前8位:00000001表示timeline;
#中間8位:00000001表示logid;
#最后8位:00000092表示logseg
清除檢查點以前的XLOG文件
root@~> pg_controldata $PGDATA
Latest checkpoint location: 1/E000028
Prior checkpoint location: 1/D18C068
Latest checkpoint's REDO location: 1/E000028
Latest checkpoint's REDO WAL file: 00000001000000010000000E
表示00000001000000010000000E之前的pg_wal文件可以刪除
如何人為清理pg_wal文件
如果你的數據庫配置不當,導致pg_wal文件堆積的話,如何人為的處理呢?
比如你配置了archive_mode=on,但是沒有配置archive_command,那么xlog文件會一直堆積(pg_wal寫完后,會寫.ready,但是由於沒有配置archive_command,也就是說不會觸發歸檔命令,所以一直都不會寫.done)。
從而導致pg_wal一直不會被清理。
然后使用pg_archivecleanup命令來清理。
# 1. 讀取控制文件,找到哪個文件是可以被清理的
pg_controldata $PGDATA
Latest checkpoint location: 1/E000028
Prior checkpoint location: 1/D18C068
Latest checkpoint's REDO location: 1/E000028
Latest checkpoint's REDO WAL file: 00000001000000010000000E
# 表示00000001000000010000000E之前的pg_wal文件可以刪除 (pg10以前的叫做pg_xlog)
pg_archivecleanup -d $PGDATA/pg_xlog 00000001000000010000000E
pg_archivecleanup: keep WAL file "/disk1/digoal/pgdata/pg_root1921/pg_xlog/00000001000000010000000E" and later
pg_archivecleanup: removing file "/disk1/digoal/pgdata/pg_root1921/pg_xlog/00000001000000010000000D"
如何關閉或修改歸檔模式
-
修改
archive_mode
配置當啟用archive_mode時,通過設置archive_command將已完成的WAL段發送到歸檔存儲。除了off,disable,還有兩種模式:on,always。在正常操作期間,兩種模式之間沒有區別,但是當設置為always的情況下,WAL archiver在存檔恢復或待機模式下也被啟用。在always模式下,從歸檔還原或流式復制流的所有文件都將被歸檔(再次)。archive_mode和archive_command是單獨的變量,因此可以在不更改存檔模式的情況下更改archive_command。此參數只能在服務器啟動時設置。當wal_level設置為minimal時,無法啟用archive_mode。
-
修改
wal_level
配置- 1、minimal是默認的值,它僅寫入崩潰或者突發關機時所需要的信息(不建議使用)。
- 2、archive是增加wal歸檔所需的日志(最常用)。
- 3、hot_standby是在備用服務器上增加了運行只讀查詢所需的信息,一般實在流復制的時候使用到。
- 1、minimal是默認的值,它僅寫入崩潰或者突發關機時所需要的信息(不建議使用)。
-
修改
archive_command
配置