PostgreSQL之WAL日志歸檔配置


關於pg_wal

pg的wal日志保存在數據庫目錄下的pg_wal/子目錄

這個日志存在的目的是為了保證崩潰后的安全,如果系統崩潰,可以“重放”從最后一次檢查點以來的日志項來恢復數據庫的一致性。
但是也存在日志膨脹的問題
pg提供如下參數控制wal日志的大小
max_wal_size = 1GB
min_wal_size = 80MB
 
測試一下
1、查看當前pg_wal目錄大小
[postgres@mingfan pg_wal]$ pwd
/usr/local/pgsql/data/pg_wal
[postgres@mingfan pg_wal]$ du -sh
16M .

2、插入可產生約2Gwal日志的數據

create table t1(a int);
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));

3、查看當前pg_wal目錄大小

[postgres@mingfan pg_wal]$ du -sh
1.1G    .

基本符合預期,看下官方的介紹:

max_wal_size (integer)
在自動 WAL 檢查點之間允許 WAL 增長到的最大尺寸。這是一個軟限制, 在特殊的情況下 WAL 尺寸可能會超過max_wal_size, 例如在重度負荷下、archive_command失敗或者高的 wal_keep_segments設置。如果指定值時沒有單位,則以兆字節為單位。默認為 1GB。增加這個參數 可能導致崩潰恢復所需的時間。這個參數只能在postgresql.conf 或者服務器命令行中設置。
min_wal_size (integer)
只要 WAL 磁盤用量保持在這個設置之下,在檢查點時舊的 WAL 文件總是 被回收以便未來使用,而不是直接被刪除。這可以被用來確保有足夠的 WAL 空間被保留來應付 WAL 使用的高峰,例如運行大型的批處理任務。 如果指定值時沒有單位,則以兆字節為單位。默認是 80 MB。這個參數只能在postgresql.conf 或者服務器命令行中設置。

 

關於歸檔

在生產環境,為了保證數據高可用性,通常需要設置歸檔,所謂的歸檔,其實就是把pg_wal里面的日志備份出來,當系統故障后可以通過歸檔的日志文件對數據進行恢復:

配置歸檔需要開啟如下參數:

  • wal_level = replica (pg13默認已經開啟replica)
    該參數的可選的值有minimal,replica和logical,wal的級別依次增高,在wal的信息也越多。由於minimal這一級別的wal不包含從基礎的備份和wal日志重建數據的足夠信息,在該模式下,無法開啟wal日志歸檔

  • archive_mode = on
    上述參數為on,表示打開歸檔備份,可選的參數為on,off,always 默認值為off,所以要手動打開

  • archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
    該參數的默認值是一個空字符串,他的值可以是一條shell命令或者一個復雜的shell腳本。在shell腳本或命令中可以用 “%p” 表示將要歸檔的wal文件包含完整路徑的信息的文件名,用“%f” 代表不包含路徑信息的wal文件的文件名

注意:wal_level和archive_mode參數修改都需要重新啟動數據庫才可以生效。而修改archive_command則不需要。所以一般配置新系統時,無論當時是否需要歸檔,這要建議將這兩個參數開啟

測試一下

1、配置參數

# - Archiving -

archive_mode = on               # enables archiving; off, on, or always
                                # (change requires restart)
archive_command = 'test ! -f /usr/local/pgsql/archive/%f && cp %p /usr/local/pgsql/archive/%f'  

2、重啟數據庫

pg_ctl -D /usr/local/pgsql/data/ restart

3、插入數據,查看歸檔

insert into t1 values (generate_series(1,10000000));

 

 4、查看pg_wal

archive_status下會有已經完成歸檔的日志信息

 

 通過歸檔進程也可以看到當前完成歸檔的日志

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM