You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL大量binlog文件占用30GB存储导致服务器磁盘满的问题排查与解决求助

MySQL大量binlog文件占用30GB存储导致服务器磁盘满的问题排查与解决求助

兄弟,刚看到你的问题,这种迁移后突然磁盘爆满的情况确实头疼,我之前也踩过MySQL binlog的坑,太懂这种焦虑了!给你梳理下可能的原因和对应的解决办法:

先搞懂为啥会堆这么多binlog文件

MySQL的binlog是它的二进制日志,主要用来做主从复制和数据恢复,正常情况下会自动清理过期日志,但迁移后大概率是这几个原因导致它没自动删:

  • 迁移后配置了主从同步,但从库同步卡住了(比如网络断了、SQL执行报错),主库会一直保留binlog等着从库同步,时间一久就堆成山了;
  • 没开binlog自动清理策略,或者默认的过期时间设得太长——比如有些老版本MySQL默认expire_logs_days是0,也就是永远不自动删;
  • 迁移后做了全量备份,但备份工具没触发binlog清理(比如用mysqldump的时候没加清理参数),旧的binlog就一直留着占空间。

紧急解决:先释放磁盘空间

先把磁盘腾出来是当务之急,但是绝对不能直接用rm命令删/var/lib/mysql下的binlog文件!MySQL自己维护了binlog索引,直接删会导致索引和实际文件不匹配,搞不好MySQL会崩。正确操作是:

  1. 先确认当前正在使用的binlog是哪个,登录MySQL执行:
    SHOW MASTER STATUS;
    
    结果里的File字段就是当前活跃的binlog,比如如果是binlog.000591,那之前的binlog.000418、binlog.000328这些都可以放心清理。
  2. 如果你不需要主从同步,或者确认所有旧binlog的事务都已经备份/不需要恢复了,可以手动清理旧日志:
    • 比如保留最近7天的:
      PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
      
    • 或者指定保留某个文件及之后的:
      PURGE BINARY LOGS TO 'binlog.000591';
      

长期预防:避免再爆盘

腾完空间后,得改配置防止以后再出现同样的问题:

  1. 编辑MySQL的配置文件(一般是/etc/my.cnf或者/etc/mysql/my.cnf,不同系统可能位置不一样),加上这几行:
    # binlog自动过期时间,比如保留7天,根据你的备份周期调整
    expire_logs_days = 7
    # 每个binlog文件最大100M,太大的话清理和管理都麻烦
    max_binlog_size = 100M
    
  2. 保存配置后重启MySQL服务生效:
    systemctl restart mysql
    # 老系统可以用 service mysql restart
    
  3. 如果有主从同步,一定要定期检查从库状态,确保同步正常:
    SHOW SLAVE STATUS\G
    
    看Slave_IO_Running和Slave_SQL_Running都是Yes,如果有报错要及时处理,不然主库会一直留着binlog等从库同步。
  4. 以后做全量备份的时候,用mysqldump可以加--delete-master-logs参数,备份完成后自动清理旧binlog(注意要确认备份没问题再用,或者先手动刷新日志再备份):
    mysqldump -u root -p --all-databases --delete-master-logs > full_backup.sql
    

最后提个醒

操作前最好先备份下binlog的索引文件,比如:

cp /var/lib/mysql/mysql-bin.index /var/lib/mysql/mysql-bin.index.bak

万一操作失误还能恢复。

备注:内容来源于stack exchange,提问作者Kiran Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:38:10