mysql慢查询日志瞬时膨胀导致磁盘写满熔断,本质是os级空间耗尽(error 28),处理核心为“立即停写→安全轮转→释放空间→加固防护”,须禁用rm直接删除、禁止跳过验证,且不可依赖重启。

MySQL因慢查询日志(slow_query_log_file)瞬时膨胀而被“强行熔断”,本质是磁盘写满触发了操作系统级阻断(OS error code 28: No space left on device),导致MySQL无法写入任何数据、日志甚至内部临时文件,进而表现为连接拒绝、查询卡死、服务假死或直接崩溃。这不是配置错误,而是物理空间耗尽引发的硬性失败——处理核心是“快速释放空间 + 安全停写 + 后续加固”,不能重启、不能删文件、不能跳过验证。
立刻停止慢日志写入,切断源头
这是最紧急且零风险的第一步:让MySQL立即停止往慢日志里追加内容,避免在清理过程中继续写入导致空间进一步恶化。
登录 MySQL(若还能连上):SET GLOBAL slow_query_log = OFF;
确认已关闭:SELECT @@slow_query_log; —— 返回 0 即生效
注意:该操作即时生效,不需重启,也不会丢失已有日志内容;但关闭后新产生的慢查询将不再记录,因此仅用于应急,不可长期维持
安全清空或轮转慢日志文件
关闭写入后,再处理磁盘上那个已经膨胀的慢日志文件。切忌直接 rm -f 删除——若 mysqld 进程仍持有该文件句柄,删除后空间不会释放(变成“幽灵文件”),还可能引发后续写入异常。
推荐方式:使用 mysqladmin flush-logs 触发日志轮转
执行:mysqladmin -u root -p flush-logs
效果:当前 mysql-slow.log 被重命名为 mysql-slow.log-202605202136(含时间戳),新建一个空的 mysql-slow.log 文件,原文件可安全删除
若已无法执行命令(如 MySQL 连接超时),改用系统层确认并清理:
先查是否被占用:lsof +D /var/lib/mysql | grep slow
若无输出,说明文件未被进程打开,可安全删除:rm -f /var/lib/mysql/mysql-slow.log
删除后立即运行 df -h 验证空间是否释放成功
检查并释放其他潜在占空间项
慢日志只是导火索,往往背后还有 binlog、临时文件、残留 ibtmp1 等“共犯”。尤其在瞬时写满场景下,这些文件常同步堆积:
清理过期 binlog(必须用 PURGE,不可 rm):PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
或按文件名清理(更稳妥):PURGE BINARY LOGS TO 'mysql-bin.000150';(确保目标文件比 SHOW MASTER STATUS 返回的 File 更旧)
清理 tmpdir 下残留临时文件:
查路径:SELECT @@tmpdir;(通常是 /tmp 或 /var/lib/mysql/tmp)
进目录找大而旧的临时表/排序文件:find /tmp -name "#sql_*" -o -name "ibtmp*" -size +50M -mtime +1
确认无进程占用:lsof +D /tmp | grep mysqld,无输出即可删除
检查是否有“已删未释”的幽灵文件:lsof +L1 —— 列出所有已被删除但仍被进程占用的大文件,重点看 mysqld 相关项,重启 mysqld 可释放(但仅在腾出空间后才可安全重启)
恢复后必须做的三件事
空间腾出来、MySQL 恢复响应,并不等于风险解除。以下检查缺一不可,否则几天内极可能再次熔断:
重新启用慢日志,但必须限流:SET GLOBAL long_query_time = 2.0;(调高阈值,减少记录量)SET GLOBAL slow_query_log = ON;
同时在配置文件中设置 log_output = FILE + slow_query_log_file = /data/mysql/logs/mysql-slow.log,**务必把日志路径移到独立分区**(如 /data/mysql/logs),与数据目录分离
配置自动清理策略:
在 my.cnf 中添加:expire_logs_days = 3max_binlog_size = 100M
并确保 log_error_verbosity = 2 控制错误日志粒度
建立空间监控闭环:
部署每5分钟执行一次的脚本,当 df /var/lib/mysql | awk 'NR==2 {print $5}' | sed 's/%//' > 85 时,自动触发告警 + 自动 PURGE binlog + 自动 flush-logs;不要依赖人工发现











