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]