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会崩。正确操作是:
- 先确认当前正在使用的binlog是哪个,登录MySQL执行:
结果里的SHOW MASTER STATUS;File字段就是当前活跃的binlog,比如如果是binlog.000591,那之前的binlog.000418、binlog.000328这些都可以放心清理。 - 如果你不需要主从同步,或者确认所有旧binlog的事务都已经备份/不需要恢复了,可以手动清理旧日志:
- 比如保留最近7天的:
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); - 或者指定保留某个文件及之后的:
PURGE BINARY LOGS TO 'binlog.000591';
- 比如保留最近7天的:
长期预防:避免再爆盘
腾完空间后,得改配置防止以后再出现同样的问题:
- 编辑MySQL的配置文件(一般是
/etc/my.cnf或者/etc/mysql/my.cnf,不同系统可能位置不一样),加上这几行:# binlog自动过期时间,比如保留7天,根据你的备份周期调整 expire_logs_days = 7 # 每个binlog文件最大100M,太大的话清理和管理都麻烦 max_binlog_size = 100M - 保存配置后重启MySQL服务生效:
systemctl restart mysql # 老系统可以用 service mysql restart - 如果有主从同步,一定要定期检查从库状态,确保同步正常:
看SHOW SLAVE STATUS\GSlave_IO_Running和Slave_SQL_Running都是Yes,如果有报错要及时处理,不然主库会一直留着binlog等从库同步。 - 以后做全量备份的时候,用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
相关产品推荐
相关产品推荐

