數據庫採用主從備份方式進行搭建,未及時清理歸檔,歸檔文件夾目錄不斷增大,撐爆整個磁盤。
所謂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日誌產生的過慢時。
歸檔觸發條件說明:
- 手動執行 select pg_switch_wal();
- WAL 日誌寫滿後觸發歸檔 WAL 日誌文件默認爲 16MB,這個值可以在編譯 PostgreSQL 時通過參數 “–with-wal-segsize” 更改,編譯後不能修改。
- 如果設置 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文件
注意:
執行腳本要擁有可進入目錄,和執行pg_controldata
等命令的權限。
引用:
Archive wal 歸檔