记一次postgresql的归档日志爆仓磁盘处理
收到磁盘跑满的问题,登录机器查看数据库磁盘近乎跑满/data
查看/data下最大占用目录文件,
cd /data
du -sh *
查看pgwalarchive目录就占用了320G多,顾名思义pgwalarchive就是归档日志。
查看配置文件核对目录
查看配置文件,默认在postgresql.conf里面。
archive_command = 'gzip < %p > /data/backup/pgwalarchive/%f.gz && echo %f.gz >> /data/backup/pgwalarchive/archive.list'
归档文件名和目录与/data目录内的文件一致。确定这个是pg_log产生的。
看样子是归档日志一直存放没有定期清理导致持续跑满磁盘。
那删除老的归档日志即可。
删除老的归档日志
脚本说明:
写个脚本定时检测磁盘大小,删除保存指定多少天数的日志归档即可。
cat clear_bin_log.sh
#!/bin/bash
disk_free=$(df -hP | awk '{if($NF == "/data"){gsub(/%/,"",$(NF-1));print $(NF-1)}}')
if [ "$disk_free" -gt 90 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' | xargs -i rm {}
elif [ "$disk_free" -gt 88 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' -mtime +3 | xargs -i rm {}
elif [ "$disk_free" -gt 86 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' -mtime +6 | xargs -i rm {}
elif [ "$disk_free" -gt 80 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' -mtime +15 | xargs -i rm {}
elif [ "$disk_free" -gt 70 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' -mtime +20 | xargs -i rm {}
elif [ "$disk_free" -gt 60 ];then
find /data/backup/pgwalarchive -type f -name '*.gz' -mtime +25 | xargs -i rm {}
fi
加入定时任务
root@xx-xx-DB-02:/data/backup# crontab -l
00 20 * * * /bin/bash /data/backup/clear_bin_log.sh >/dev/null 2>&1
执行脚本看下效果:
好了,可以了,磁盘释放了,记得切记保留时长以及数据重要性记得核对哦,是否可以删除。
补充说明:
pg_log记录各种Error信息,以及服务器与DB的状态信息,可由用户随意更新删除
pg_xlog与pg_clog记录数据库的事务信息,不得随意删除更新,做物理备份时要记得备份着两个日志。
[参考链接] https://www.cnblogs.com/mingfan/p/14038680.html
专业从事搬砖多年,还是在继续搬砖中,厚积薄发~