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

T1YSL發表於2021-07-21

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2782598/,如需轉載,請註明出處,否則將追究法律責任。

相關文章