PG Wal 日誌清理
阿新 • • 發佈:2022-04-08
1.wal日誌介紹
WAL是Write Ahead Log的簡寫,和oracle的redo日誌類似,存放在$PGDATA/pg_wal目錄中,如果開啟了歸檔,在目錄archive_status下會有一些檔案,以ready結尾的,表示可以歸檔但還沒有歸檔,done結尾的表示已經歸檔。
2.wal 相關的引數
#wal_segment_size --報告預寫日誌段的大小。預設值為 16MB #wal_keep_segments --指定儲存在pg_wal目錄中的過去日誌檔案段的最小數量,以防備用伺服器需要獲取它們以進行流複製。pg13改為wal_keep_segments #checkpoint_completion_target = 0.5 --指定檢查點完成的目標,作為檢查點之間總時間的一部分。預設值為 0.5 #checkpoint_timeout=300 --自動 WAL 檢查點之間的最長時間。如果指定此值沒有單位,則以秒為單位。有效範圍在 30 秒到 1 天之間。預設值為五分鐘 ( 5min)。 #max_wal_size = 1GB --最大不超過這個值 ,在自動檢查點期間讓 WAL 增長的最大大小。這是一個軟限制;WAL 大小max_wal_size在特殊情況下可能會超出,例如重負載、失敗archive_command或高wal_keep_segments設定。如果此值指定為不帶單位,則以兆位元組為單位。預設值為 1 GB。 #min_wal_size = 80MB --最小保留這個值,只要 WAL 磁碟使用率低於此設定,舊的 WAL 檔案總是在檢查點被回收以供將來使用,而不是被刪除。這可用於確保保留足夠的 WAL 空間來處理 WAL 使用中的峰值,例如在執行大型批處理作業時。如果此值指定為不帶單位,則以兆位元組為單位。預設值為 80 MB。
3.清理方式
3.1.wal 自動清理
#軟體限制,當日志達到這個最大值時,會做一個檢查點。 postgres=# show max_wal_size; max_wal_size -------------- 8GB (1 row) # 儲存多個日誌 在PG13以前,我們能過wal_keep_segments 設定儲存日誌大小,在PG13後引數改為wal_keep_size postgres=# show wal_keep_segments postgres-# ; wal_keep_segments ------------------- 128 (1 row) #每個日誌大小 postgres=# show wal_segment_size ; wal_segment_size ------------------ 16MB (1 row) [postgres@LXUATEDPD2 wal]$ ls -lrt 000* | wc -l 512 512*16MB(wal_segment_size) = 8192MB = 8G (max_wal_size)
** 注意 **
- 當 max_wal_size/wal_segment_size 與 wal_keep_segments 這兩個誰大儲存誰
- 只有當在做檢查點時才會去清理日誌
- wal 日誌裡的 archive_status 裡的狀態比 pg_controldata $PGDATA 新, pg_controldata 只是在做檢查 點時才會去更新。
3.2.wal手動清理
[postgres@LXUATEDPD2 log]$ pg_controldata $PGDATA pg_control version number: 1201 Catalog version number: 201909212 Database system identifier: 7080150410741737694 Database cluster state: in production pg_control last modified: Fri 08 Apr 2022 09:22:12 AM HKT Latest checkpoint location: 17/3F000028 Latest checkpoint's REDO location: 17/3F000028 Latest checkpoint's REDO WAL file: 00000001000000170000003F Latest checkpoint's TimeLineID: 1 Latest checkpoint's PrevTimeLineID: 1 Latest checkpoint's full_page_writes: on Latest checkpoint's NextXID: 0:2180 Latest checkpoint's NextOID: 32768 Latest checkpoint's NextMultiXactId: 1 Latest checkpoint's NextMultiOffset: 0 Latest checkpoint's oldestXID: 480 Latest checkpoint's oldestXID's DB: 1 Latest checkpoint's oldestActiveXID: 2176 Latest checkpoint's oldestMultiXid: 1 Latest checkpoint's oldestMulti's DB: 1 Latest checkpoint's oldestCommitTsXid:0 Latest checkpoint's newestCommitTsXid:0 Time of latest checkpoint: Fri 08 Apr 2022 09:22:05 AM HKT Fake LSN counter for unlogged rels: 0/3E8 Minimum recovery ending location: 0/0 Min recovery ending loc's timeline: 0 Backup start location: 0/0 Backup end location: 0/0 End-of-backup record required: no wal_level setting: replica wal_log_hints setting: on max_connections setting: 2000 max_worker_processes setting: 128 max_wal_senders setting: 10 max_prepared_xacts setting: 0 max_locks_per_xact setting: 64 track_commit_timestamp setting: off Maximum data alignment: 8 Database block size: 16384 Blocks per segment of large relation: 65536 WAL block size: 8192 Bytes per WAL segment: 16777216 Maximum length of identifiers: 64 Maximum columns in an index: 32 Maximum size of a TOAST chunk: 4044 Size of a large-object chunk: 4096 Date/time type storage: 64-bit integers Float4 argument passing: by value Float8 argument passing: by value Data page checksum version: 1 Mock authentication nonce: 4e7ad0bd2ddb2077bf0b5dceabbac911be4ef1e72634f197b5e433f4e70773ea # 清理指定 wal 日誌以前的日誌 [postgres@LXUATEDPD2 wal]$ pg_archivecleanup -d /db_log/wal 00000001000000170000003F pg_archivecleanup: keeping WAL file "/db_log/wal/00000001000000170000003F" and later
4.觸發檢查點的情況
1.從前一個檢查點發生過後的時間超過checkpoint_timeout設定的間隔(預設間隔為300秒(5分鐘))。
2.在新版本(9.5以後)當max_wal_size 大於pg_wal總和時,會觸發檢查點
3.PostgreSQL服務在smart和fast模式下停止。
4.手動執行checkpoint
5.資料庫recover完成
來自為知筆記(Wiz)