最近我的备份开始失败,我将问题跟踪到文件 /var/lib/fail2ban/fail2ban.sqlite3. 它超过500mb。我不确定它是否随着时间的推移而增长,或者这是否是最近的发展。
我怎样才能让它达到合理的尺寸并保持它的尺寸?(出于这个目的,我们假设小于 500mb。)
Pio*_*asz 21
中有一个dbpurgeage参数fail2ban.conf,它告诉在数据库中保留多少天的数据。默认值为一天 ( 1d),因此请尝试将其减少到几个小时:
dbpurgeage = 8h
Run Code Online (Sandbox Code Playgroud)
此设置与findtime:具有findtime更长的时间毫无意义dbpurgeage。
编辑(2021 年):以下说明在撰写本文时是正确的。然而,现在请查看neingeist 的答案:fail2ban 0.11.x 开始在 Linux 发行版中可用(例如Debian 测试、Ubuntu 20.04及更高版本、Fedora 33),尊重dbpurgeage设置。
过时说明:通过查看我自己的fail2ban数据库,该dbpurgeage设置似乎不起作用。因此,唯一的解决方案是手动删除条目。例如,要删除去年的条目,请运行:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
"DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2020-01-01'; VACUUM;"
Run Code Online (Sandbox Code Playgroud)
(sqlite3可执行文件通常在同名包中)。
VACUUM没有sqlite在同一目录中执行数据库的副本,似乎没有办法执行数据库
。但是,您可以在执行操作之前将文件复制到另一个文件系统,然后再复制回较小的数据库。
您可以更新到 0.11.x(其中包含执行清除的代码),然后删除庞大的数据库,然后重新启动 fail2ban。它将重新创建数据库。对于大多数人来说,这是最简单的解决方案,没有任何缺点。
虽然fail2ban 0.11.x 实际上包含清除旧条目的代码(旧版本没有!),但它没有VACUUM。因此,另一种选择是等待 fail2ban 清除旧条目(每小时发生一次)并执行手动sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "VACUUM;". 没有VACUUM数据库文件将保持其大小。
小智 6
sudo /etc/init.d/fail2ban stop
sudo rm -rf /var/lib/fail2ban
sudo /etc/init.d/fail2ban start
sudo reboot
Run Code Online (Sandbox Code Playgroud)
为我解决了一切。重启后检查
df -h
Run Code Online (Sandbox Code Playgroud)
我有 25GB 的 sqlite 文件,内存是 40GB 的 94%
除了Piotr P. Karwasz 的正确答案之外,我还会使用 GNU (而不是 BSD )展示我的简单shell语法:date date
首先显示bans表的统计信息:
sqlite3 fail2ban.sqlite3 'SELECT count(timeofban) FROM bans'
1147784
sqlite3 fail2ban.sqlite3 "SELECT count(timeofban) FROM bans
WHERE timeofban < `date -d 'now -1 month' +%s`;"
1129083
Run Code Online (Sandbox Code Playgroud)
在命令行参数扩展中进行UNIXEPOCH转换速度更快,因为不必转换每一行!sqlite
当然,您的系统上的答案应该不同!
然后
sqlite3 fail2ban.sqlite3 "DELETE FROM bans WHERE
timeofban < $(date -d 'now -1 month' +%s); VACUUM;"
Run Code Online (Sandbox Code Playgroud)
(不要错过VACUUM;!)
使用date延时命令的主要优点是可以将其放置在定期脚本中。
now -1 month注意:我的选择是每晚随着时间推移运行此程序。
date,使用sqlite3语法:浏览sqlite手册,我终于找到了正确的语法:
sqlite3 fail2ban.sqlite3 "DELETE FROM bans
WHERE timeofban <= STRFTIME('%s', DATE('now', '-1 month'));VACUUM;"
Run Code Online (Sandbox Code Playgroud)
再次强调:使用此语法,sqlite3将根据请求进行翻译,而不是根据行进行翻译!
crontabs如果您打算将其写入 crontab,请不要错过转义所有百分号!
1 2 * * * root /usr/bin/sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "delete from bans where timeofban <= strftime('\%s', date('now', '-42 days'));vacuum;"
Run Code Online (Sandbox Code Playgroud)
将在每晚运行此程序02:01。/etc/cron.weekly例如,该命令还可以添加到 BASH 脚本中。
| 归档时间: |
|
| 查看次数: |
7205 次 |
| 最近记录: |