导读:本期聚焦于小伙伴创作的《MySQL磁盘空间满无法启动怎么办?清理binlog二进制日志的完整操作步骤》,敬请观看详情。数据库突然起不来,报错提示No space left on device,多半是binlog把磁盘吃满了。binlog是MySQL记录数据变更的事务日志,默认不会自动删除,长期运行后可能占据几十甚至上百GB。此时直接启动实例会失败,因为MySQL在恢复阶段仍需写入日志。正确做法是在关闭实例或跳过部分启动流程后,手动定位binlog目录,用系统命令或mysqlbinlog工具筛选并删除过期文件,再调整expire_logs_days等参数防止复发。本文梳理从故障确认、安全清理到配置优化的实操路径,帮你快速恢复服务且避免误删正在使用的日志。

当MySQL所在服务器的磁盘被写满,实例往往会在重启或正常运行中突然崩溃,错误日志里经常出现“No space left on device”或者“Binlog has bad magic number”之类的提示。此时数据库无法完成正常的崩溃恢复,因为binlog目录同样没有剩余空间供新的日志写入。面对这种状况,最稳妥的思路是先释放binlog占用的空间,再让实例正常起来,而不是盲目扩容或重装。

MySQL磁盘空间满无法启动怎么办?清理binlog二进制日志的完整操作步骤

一、确认磁盘与binlog占用情况

在动手删除任何文件之前,需要先确认确实是binlog占用了大量空间。可以通过Linux的磁盘查看命令快速定位。通常MySQL的数据目录在/var/lib/mysql,binlog文件以“mysql-bin”或类似前缀命名,形如mysql-bin.000001

使用下面的命令查看各目录的占用比例:

df -h
du -sh /var/lib/mysql/*

如果看到/var/lib/mysql下的binlog文件总大小达到几十GB,而磁盘可用空间为0,就可以判定问题根源。注意不要直接删除正在被MySQL进程持有的文件,否则可能造成文件句柄泄漏或数据不一致。

二、安全清理binlog的两种方式

1. 实例可短暂启动时用SQL清理

如果磁盘只是临界满,MySQL还能以跳过部分检查的方式起来,可以优先使用MySQL自带的日志清理指令。这种方式最安全,因为它只会删除已经关闭且不在用的历史日志。

先查看当前正在使用的binlog文件名:

SHOW MASTER STATUS;

然后删除指定文件之前的所有日志,例如当前是mysql-bin.000100,就执行:

PURGE BINARY LOGS TO 'mysql-bin.000100';

该命令会保留mysql-bin.000100及之后的文件,之前的全删掉。相比手动rm,它不会破坏MySQL的内部索引。缺点是如果磁盘已经完全写满导致起不来,这条路就走不通。

2. 实例彻底无法启动时手动删文件

当MySQL根本无法启动,只能先停掉服务,手动从操作系统层面删除一部分最早的binlog。关键是绝不能删掉mysql-bin.index文件和当前最新的那几个日志。

进入binlog目录,按时间排序找出最旧的一批文件:

cd /var/lib/mysql
ls -ltr mysql-bin.*

删除例如最旧的20个(请确认这些不是服务崩溃时正在写的):

rm -f mysql-bin.000001 mysql-bin.000002 mysql-bin.000003

删完后要同步修改mysql-bin.index,把被删的文件名从里面去掉,否则MySQL启动时会因找不到文件而报错。可以用vi或sed处理该文本文件。

三、调整参数避免再次写满

设置自动过期时间

根本解决办法是让binlog自动清理。MySQL提供expire_logs_days参数(8.0后改为binlog_expire_logs_seconds),控制日志保留天数。例如保留3天:

SET GLOBAL expire_logs_days = 3;

同时在配置文件my.cnf写入,防止重启失效:

[mysqld]
expire_logs_days = 3

这样MySQL会在日志切换时自动删除超过期限的binlog。如果业务量极大,还可以考虑将binlog放到独立磁盘,并配合监控告警,在占用达到阈值时提前介入。

评估是否需要关闭binlog

对于纯测试环境或不需要主从复制的单机,可直接关闭binlog来彻底避免该问题。在配置中注释掉log-bin行并重启即可。但生产环境通常不建议,因为会失去时间点恢复能力。

四、启动前的最终检查

清理完毕后,先执行df -h确认有足够空间,再启动MySQL。若仍起不来,查看错误日志是否指向某个binlog校验失败,可尝试用mysqlbinlog工具解析定位损坏文件并单独移走。

启动成功后,立即用SHOW BINARY LOGS;确认列表与磁盘文件一致。整个处理过程的核心原则就是:不删索引文件、不删当前日志、优先用SQL命令清理。

MySQLbinlog磁盘空间修改时间:2026-08-03 09:21:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。