MySQL慢查询日志暴涨导致磁盘告警:slow query log膨胀至397G的生产故障排查:清理、参数优化

这次现场里,/data 一度使用到 76%/data/mysql/logs 占了 408G ,其中 mysql-slow.log 单文件约 397G ;处理后 /data 使用率降到 6% ,并最终将 slow_query_log 关闭、log_queries_not_using_indexes 关闭、GLOBAL long_query_time 调整为 5


MySQL 慢查询日志暴涨导致磁盘告警:一次生产环境处理 SOP

一、问题现象

生产环境巡检时,发现数据盘 /data 使用率偏高:

复制代码
df -h

现场结果显示:

复制代码
/dev/mapper/vg_data-lv_data  591G  429G  138G  76% /data

继续进入 MySQL 日志目录排查:

复制代码
cd /data/mysql/logs
du -sh
ls -lh

结果很直接:

  • /data/mysql/logs 总占用 408G

  • mysql-slow.log397G

  • mysql-bin.000469 ~ mysql-bin.000480 每个约 1.1G

  • mysqld.log 很小

也就是说,这次不是 binlog 把盘吃满,而是 slow log 直接长成了巨无霸


二、原因定位

查看 MySQL 配置文件:

复制代码
cat /etc/my.cnf

日志相关配置如下:

复制代码
slow_query_log = 1
slow_query_log_file = /data/mysql/logs/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

这个组合在生产上风险不小:

  • 开启了慢查询日志

  • 慢查询阈值只有 2 秒

  • log_queries_not_using_indexes = 1 也开着

这意味着,不只是"真正慢"的 SQL 会进日志,很多没走索引的 SQL 也会被持续记录。业务一旦量上来,慢日志膨胀速度会非常猛。

这次故障里,真正的高风险点其实就是这句:

复制代码
log_queries_not_using_indexes = 1

它像把日志水龙头彻底拧开了。


三、处理过程

1. 先确认慢日志状态

登录 MySQL 后先核实当前状态:

复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';

现场确认:

  • slow_query_log = ON

  • slow_query_log_file = /data/mysql/logs/mysql-slow.log

说明 MySQL 当时确实还在持续往这个文件写内容。

2. 先关闭慢查询日志

生产环境里,不建议一上来就删文件。

正确顺序是先停写:

复制代码
SET GLOBAL slow_query_log='OFF';
SHOW VARIABLES LIKE 'slow_query_log';

确认结果变成:

复制代码
slow_query_log = OFF

这一步非常关键。

先关日志,再处理文件,才是稳妥姿势。

3. 清空慢日志文件

退出 MySQL 后,在系统层执行:

复制代码
truncate -s 0 /data/mysql/logs/mysql-slow.log
ls -lh /data/mysql/logs/mysql-slow.log

执行后,mysql-slow.log 变成了 0 字节

复制代码
-rw-r-----. 1 mysql mysql 0 /data/mysql/logs/mysql-slow.log

这里使用的是 truncate,不是 rm -f

原因很简单:在生产环境里,truncate 更温和、更可控。

4. 验证空间是否真正释放

清空慢日志后,再次检查目录和磁盘:

复制代码
ls -lh
df -h

处理结果非常明显:

  • logs 目录从 408G 降到 12G

  • /data 使用率从 76% 降到 6%

  • /data 已用空间从 429G 降到 33G

这说明空间不是"看起来清了",而是真正回收成功了


四、参数收口与复盘

日志清掉只是止血,真正要做的是防复发。

因此后续又检查并持久化调整了参数:

复制代码
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW VARIABLES LIKE 'long_query_time';

SET PERSIST slow_query_log = OFF;
SET PERSIST log_queries_not_using_indexes = OFF;
SET PERSIST long_query_time = 5;

最终再看全局参数:

复制代码
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW GLOBAL VARIABLES LIKE 'long_query_time';

确认结果为:

  • slow_query_log = OFF

  • log_queries_not_using_indexes = OFF

  • long_query_time = 5.000000

这里还有一个容易误判的小点:

你在现场中发现 SHOW VARIABLES LIKE 'long_query_time'; 仍然显示 2 ,但 SHOW GLOBAL VARIABLES LIKE 'long_query_time'; 已经是 5 。这不是配置失败,而是 SESSION 值还没变,GLOBAL 值已经生效。新连接会继承新的全局值。


五、最终结论

这次故障的根因,不是数据文件异常,也不是 binlog 暴涨,而是:

  • 开启了慢查询日志

  • long_query_time 设置偏低

  • log_queries_not_using_indexes 开启

三者叠加后,mysql-slow.log 最终膨胀到 397G ,直接把 /data 顶到 76%

处理思路其实很清晰:

先定位日志目录 → 确认 slow log 状态 → 关闭 slow log → truncate 清空文件 → 验证空间释放 → 持久化调整参数。

一句话总结就是:

能把磁盘清出来,只是完成抢救;能把参数收住,才算真正收工。


六、可直接复用的命令清单

复制代码
# 1. 看磁盘
df -h

# 2. 看日志目录
cd /data/mysql/logs
du -sh
ls -lh

# 3. 登录 MySQL
mysql -u root -p

-- 4. 查看慢日志状态
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 5. 关闭慢日志
SET GLOBAL slow_query_log='OFF';
SHOW VARIABLES LIKE 'slow_query_log';

# 6. 退出后清空慢日志
truncate -s 0 /data/mysql/logs/mysql-slow.log

# 7. 验证空间
ls -lh /data/mysql/logs/mysql-slow.log
df -h

-- 8. 持久化防复发
SET PERSIST slow_query_log = OFF;
SET PERSIST log_queries_not_using_indexes = OFF;
SET PERSIST long_query_time = 5;

-- 9. 验收
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW GLOBAL VARIABLES LIKE 'long_query_time';

如果你要,我可以继续把这版改成更像 CSDN/博客园发文风格 的成稿版,标题、摘要、结尾都一起润一下。

相关推荐
SelectDB3 小时前
Apache Doris Variant 动态 JSON 实战教程:从建表到跑通 100M Agent 日志查询
数据库
AOwhisky3 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
重生的黑客3 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
sg_knight3 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
Urbano3 小时前
夹克与商务单西口袋工序自动化技改研究报告
运维·自动化
星空露珠4 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
骑上单车去旅行4 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻4 小时前
Linux 常用命令
linux
期待着20134 小时前
docker 安装 ,在centos7.9
运维·docker·容器
踏月的造梦星球5 小时前
DM8 DSC 单机双实例部署
运维·开发语言·数据库