fail2ban数据库空间压缩
问题
前几天收到prometheus监控告警说有一台VPS的硬盘空间不太够了。虽然那台的硬盘确实小,但也没跑什么东西,应该不至于有空间问题。
上去排查了一下,发现是/var/lib/fail2ban/fail2ban.sqlite3
文件过大了。
解决
问了一下chatgpt,建议缩小数据库空间,但是试了一下vacuum;
命令,结果因为执行时sqlite3生成的操作日志过大,把硬盘彻底搞爆了,最后也没能实现缩小。
还是得放狗,找到SO的这个问题解答:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
"DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2023-01-01'; VACUUM;"
原理就是先把旧的bans记录删除,再vacuum。
不过因为sqlite3不是RDBMS,最好先停了fail2ban再操作,操作完再启动fail2ban,免得操作被锁。
另外,删除操作也将产生操作日志,如果硬盘剩余空间不大的话,建议少量多次删除,不要一次大量删除。
终极解决方案
写一个脚本定时清理吧:
#!/bin/sh
LASTDAY=`/bin/date -d'-7 day' +%Y.%m.%d`
/bin/systemctl stop fail2ban
/usr/bin/sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
"DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '$LASTDAY'; VACUUM;"
/bin/systemctl start fail2ban
放在cron里每天跑一下即可。
推送到[go4pro.org]