定时自动清理MySQL慢查询日志释放磁盘
为什么需要定期清理慢查询日志
慢查询日志是MySQL记录执行时间超过阈值的SQL语句的文件。
如果长时间不处理,这个文件可能膨胀到几十GB,直接导致磁盘空间告警,甚至影响数据库写性能。很多新手以为只要开启了慢日志,就必须留着,其实完全可以按天、按周自动清理,既保留近期排查数据,又避免磁盘爆满。
第一步:确认慢查询日志的当前位置和大小
登录服务器后,先找到慢日志的实际位置和占用情况。
- 连接MySQL(或使用宝塔数据库管理工具):
mysql -u root -p
然后执行:
SHOW VARIABLES LIKE 'slow_query_log%';
会输出类似:
slow_query_log= ONslow_query_log_file= /var/lib/mysql/slow-query.log
- 回到操作系统,查看文件大小:
ls -lh /var/lib/mysql/slow-query.log
记下你实际的路径,后续脚本中要使用。
第二步:用脚本+定时任务实现自动清理
清理的原则是:保留最近N天的日志,其余清空(或者备份后再删除)。
这里以保留7天为例。
- 创建一个清理脚本(比如
/opt/clean_slow_log.sh):
#!/bin/bash
# 设置慢日志路径(替换为你自己查到的路径)
SLOW_LOG="/var/lib/mysql/slow-query.log"
# 保留最近7天的日志
find $(dirname "$SLOW_LOG") -name "$(basename "$SLOW_LOG")" -mtime +7 -exec truncate -s 0 {} \;
注意:truncate -s 0 会直接清空文件内容,不会删除文件本身,MySQL进程仍能正常写入。
不要用 rm 删除文件,否则MySQL会重新创建,可能产生新文件。
- 赋予执行权限:
chmod +x /opt/clean_slow_log.sh
- 添加定时任务,每天凌晨3点执行一次:
crontab -e
在末尾添加一行:
0 3 * * * /bin/bash /opt/clean_slow_log.sh > /dev/null 2>&1
- 保存退出,重启cron(根据系统):
systemctl restart cron # 或 service cron restart
常见问题和避坑提醒
- Q:执行脚本后MySQL不写日志了? A:只要文件还在,MySQL会继续追加。如果误删了文件,MySQL不会自动创建新文件,需要去MySQL里执行
SET GLOBAL slow_query_log=OFF;再SET GLOBAL slow_query_log=ON;来重置。 - Q:想备份而不是直接清空? A:在清理前复制一份到压缩目录:
cp "$SLOW_LOG" "/backup/slow-$(date +%Y%m%d).log"再清空。 - Q:宝塔面板用户怎么配? A:在宝塔的计划任务里添加Shell脚本,内容同上,时间选每天。更方便。
- Q:如何只保留最近3天? A:把
-mtime +7改成-mtime +3即可。
验证清理是否生效及后续建议
- 手动执行一次脚本看效果:
bash /opt/clean_slow_log.sh
ls -lh /var/lib/mysql/slow-query.log # 检查文件大小是否变小
- 确认MySQL日志仍在正常写入:临时生成一条慢查询(比如
SELECT SLEEP(5);),然后查看文件末尾是否有新记录:
tail -n 5 /var/lib/mysql/slow-query.log
- 建议定期(比如每月)检查磁盘使用率,同时关注慢日志文件是否在预期范围内增长。如果增长过快,说明数据库存在大量低效查询,建议配合慢日志分析工具(如 pt-query-digest)优化SQL。
如果你按照上述步骤操作,磁盘空间紧张的问题应该会明显缓解。
遇到报错时,优先检查脚本中的路径是否写对、crontab是否生效(可以查看 /var/log/syslog 或 /var/log/cron)。