1. 程式人生 > 其它 >PG Wal 日誌清理

PG Wal 日誌清理

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)

** 注意 **

  1. 當 max_wal_size/wal_segment_size 與  wal_keep_segments 這兩個誰大儲存誰
  2. 只有當在做檢查點時才會去清理日誌
  3. 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)