PostgreSQL的xlog/Wal歸檔及日誌清理

語言: CN / TW / HK

xlog/wal日誌

類似於Oracle的redo,PostgreSQL 的redo文件被稱為WAL文件或XLOG文件,存放在$PGDATA/pg_xlog 或($PGDATA/pg_wal)目錄中( Postgresql 從 10 版本開始,將所用xlog相關的全部用wal替換了)。 任何試圖修改數據庫數據的操作都會寫一份日誌到磁盤。

本文舉例的數據庫版本為 (PostgreSQL) 11.5

image.png

wal命名格式文件名稱為16進制的24個字符組成,每8個字符一組,每組的意義如下:

00000001 00000000 00000001
-------- -------- --------
時間線     邏輯id    物理id

通過select pg_switch_xlog();或select pg_switch_wal();可以切換xlog/wal日誌。

image.png

歸檔目錄

如果開啟了歸檔,則在歸檔路徑下的archive_status目錄裏, 會有類似000000010000000000000002.ready和000000010000000000000003.done的文件。

.ready表示XLOG文件已寫滿,可以調用歸檔命令了,.done表示已歸檔完成。開啟了歸檔後,只有歸檔成功的pg_xlog文件才會被清除。在每次歸檔命令被執行後,會觸發清除標籤的動作,在執行檢查點時,也會觸發清除歸檔標籤文件的動作。

image.png

影響wal保存的最大個數的參數

checkpoint_segments 和 wal_keep_segments,checkpoint_completion_target

通常地説,WAL 最大個數不超過:
( 2 + checkpoint_completion_target ) * checkpoint_segments + 1

在流複製環境下, WAL 最大數不超過:
wal_keep_segments + checkpoint_segments + 1

超過的話會自動清理。

默認的 WAL segments 為 16 M, 這個參數在PG 編譯執行 ./configure 時,指定 “–with-wal-segsize=target_value” 參數設置。

手動清理wal(通常情況下儘量讓數據庫自動清理,避免錯誤操作)

如果配置了archive_mode=on,但是沒有配置archive_command,那麼xlog文件會一直堆積(xlog寫完後,會寫.ready,但是由於沒有配置archive_command,也就是説不會觸發歸檔命令,所以一直都不會寫.done),所以xlog會一直不清理。

1)讀取控制文件,找到能清理的xlog範圍

pg_controldata $PGDATA

image.png

表示000000010000000000000009之前的文件可以刪除

2)通過pg_archivecleanup清理

[postgres@t1ysl bin]$ pg_archivecleanup -d $PGDATA/pg_wal 000000010000000000000009

image.png