[特殊字符]MySQL主库binlog暴增100+文件!每天2-4个1.1G,不删爆盘?3步自动清理+手动急救指南
·
问题现象
mysql8.0.30 一主一从的主库的数据目录下的mysql-bin开头的文件已经有100多个了,每天产生2到4个mysql-bin**开头的文件,每个文件大小1.1G,这个文件不是自动删除的吗?
问题分析与处理方法
1. 检查从库复制状态
在从库执行:
mysql> SHOW REPLICA STATUS\G
Replica_IO_Running: 是否为 Yes
Replica_SQL_Running: 是否为 Yes
Seconds_Behind_Source: 复制延迟了0秒。如果这个值很大,或者为 NULL,说明从库有问题。
如果从库已经中断,您需要修复复制问题。这是治本的方法。
2. 检查主库并调整 binlog 过期策略
如果复制状态正常,那么很可能是配置问题。
查看主库配置:
SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs_seconds';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| binlog_expire_logs_seconds | 0 |
+----------------------------+-------+
1 row in set (0.25 sec)
从 MySQL 8.0.29 开始,引入了 binlog_expire_logs_auto_purge 和基于空间的清理优先级。
确保自动清理功能是开启的(默认是开启的):
SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs_auto_purge';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| binlog_expire_logs_auto_purge | ON |
+-------------------------------+-------+
1 row in set (0.00 sec)
设置为一个合理的值(例如,保留 7 天):
– 动态设置(重启后失效)
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7 * 24 * 60 * 60
mysql> SET GLOBAL binlog_expire_logs_seconds = 604800;
ERROR 4113 (HY000): The option expire_logs_days cannot be used together with option binlog_expire_logs_seconds. To set one, first unset the other by setting it to 0.
mysql> SHOW GLOBAL VARIABLES LIKE 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 30 |
+------------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL expire_logs_days = 0;
– 永久生效,需要写入配置文件 my.cnf
-- [mysqld]
MySQL 配置文件(通常是 my.cnf 或 my.ini),在 [mysqld] 部分添加或修改以下行:
[mysqld]
expire_logs_days = 0
binlog_expire_logs_seconds = 604800
设置后,MySQL 会自动清理超过 7 天的 binlog 文件。
知识扩展:
自动清理的触发时机
清理过程主要在以下时刻被触发:

3. 【立即释放空间】手动安全清理 binlog
如果想立即清理掉已经过期且不再需要的 binlog 文件,可以使用以下命令:
清理指定时间之前的所有 binlog:
-- 清理 3 天前的所有 binlog
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;
-- 或者清理某个时间点之前的
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
清理到某个特定的 binlog 文件(保留最新的几个):
-- 清理掉 mysql-bin.000100 之前的所有文件(但不包括 mysql-bin.000100)
PURGE BINARY LOGS TO 'mysql-bin.000100';
⚠️ 注意:手动执行 PURGE 命令前,最好再次确认从库状态,确保没有复制延迟,否则可能导致复制失败。
4. 触发日志轮转
有时,手动刷新日志可以帮助系统重新评估清理条件:
FLUSH LOGS;
这条命令会:
关闭当前的 binlog 文件。
创建一个新的 binlog 文件(例如,从 mysql-bin.000100 切换到 mysql-bin.000101)。
在切换过程中,自动触发过期 binlog 的清理检查,删除所有超过 7 天的文件。
⚠️ 重要提示:在执行 FLUSH LOGS; 或等待自动清理之前,请务必再次确认您的从库复制状态(即使您之前检查过)。因为这是清理发生的最后一道关卡。
更多推荐

所有评论(0)