Postgresql wal 歸檔文件處理

數據庫採用主從備份方式進行搭建,未及時清理歸檔,歸檔文件夾目錄不斷增大,撐爆整個磁盤。

所謂WAL日誌歸檔,其實就是把在線的WAL日誌備份出來。
wal_level='replica'

# - Archiving -

archive_mode = on               # enables archiving; off, on, or always
                                # (change requires restart)
archive_command = 'test ! -f /mnt/backup/%f && cp %p /mnt/backup/%f'
                                # command to use to archive a logfile segment
                                # placeholders: %p = path of file to archive
                                #               %f = file name only
                                # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0            # force a logfile segment switch after this
                                # number of seconds; 0 disables
                                
#wal_level archive 或更高級別
#archive_mode on 開啓歸檔模式,always 主從模式時,從庫也開啓歸檔模式。需要重啓數據庫
#archive_command 歸檔時觸發的命令或腳本, 不需要重新啓動數據庫。 systemctl reload postgresql-10 即可。
#archive_timeout 可以理解爲超過指定時間強制執行 select pg_switch_wal(); 場景, 數據庫不是很活躍,數據庫wal日誌產生的過慢時。

歸檔觸發條件說明:

  1. 手動執行 select pg_switch_wal();
  2. WAL 日誌寫滿後觸發歸檔 WAL 日誌文件默認爲 16MB,這個值可以在編譯 PostgreSQL 時通過參數 “–with-wal-segsize” 更改,編譯後不能修改。
  3. 如果設置 archive_timeout, 超時觸發。

實際應用

目標:按日期存放wal日誌到/mnt/archdir/

編寫歸檔腳本 archive.sh ,設置權限 chmod 700 archive.sh

#!/bin/bash    
    
export LANG=en_US.utf8    
export DATE=`date +"%Y%m%d"`    
    
BASEDIR="/mnt/archdir"    
    
if [ ! -d $BASEDIR/$DATE ]; then    
  mkdir -p $BASEDIR/$DATE    
  if [ ! -d $BASEDIR/$DATE ]; then    
    echo "error mkdir -p $BASEDIR/$DATE"    
    exit 1    
  fi    
fi    
    
cp $1 $BASEDIR/$DATE/$2    
if [ $? -eq 0 ]; then    
  exit 0    
else    
  echo -e "cp $1 $BASEDIR/$DATE/$2 error"    
  exit 1    
fi
echo -e "backup failed"    
exit 1    

配置postgres.conf 中的archive_command命令:

archive_command = 'archive.sh %p %f' 

重新加載生效


systemctl reload postgresql-10

定時清空歸檔文件

可以查看到歸檔目錄下的wal 文件。

清空腳本

編輯腳本pg_wal_clean.sh,使用pg_controldata 查看最後歸檔點,配合pg_archivecleanup命令清除最新歸檔點之前的wal。


#!/bin/bash
LASTWAL=`sudo /usr/lib/postgresql/9.5/bin/pg_controldata  -D /home/user3/pg/data |grep "Latest checkpoint's REDO WAL file" |awk '{print $6}'`
echo $LASTWAL 
sudo /usr/lib/postgresql/9.5/bin/pg_archivecleanup -d /home/user3/pg/pg_archive $LASTWAL

sudo /usr/lib/postgresql/9.5/bin/pg_archivecleanup -d /home/user3/pg/pg_archive $LASTWAL

定時任務啓動清空wal腳本

crontab -e這樣可以已編輯模式打開個人的crontab配置文件,然後加入一下這行:

0 0 * * * /home/user3/pg_wal_clean.sh

這將會在每天凌晨運行指定的.sh文件

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G2NCH6dJ-1577417590274)

注意:
執行腳本要擁有可進入目錄,和執行pg_controldata等命令的權限。

引用:
Archive wal 歸檔

發佈了66 篇原創文章 · 獲贊 29 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章