不能手动删除 mysql-bin.* 文件,因其文件名和内容被记录在 mysql-bin.index 中,手动删除会导致索引与实际文件不一致,MySQL 重启时读取失败报错退出,或运行中写入中断。

直接删 mysql-bin.* 文件会破坏主从同步、导致 MySQL 启动失败,必须通过 MySQL 自身机制清理。
为什么不能手动删 mysql-bin.* 文件
MySQL 的 binlog 是按序号连续写入的,mysql-bin.000001 → mysql-bin.000002……,文件名和内容被记录在 mysql-bin.index 中。手动删除任意一个文件,会导致索引与实际文件不一致,MySQL 重启时读取 index 失败,直接报错退出(常见错误:Failed to open log (file 'mysql-bin.0000XX', errno 2))。
即使 MySQL 正常运行中,手动删了正在使用的 binlog(比如 mysql-bin.000010 被 SHOW MASTER STATUS 显示为当前日志),也会触发内部校验失败,后续写入可能中断。
宝塔面板设置保留天数的原理和生效条件
宝塔在「数据库 → 设置 → MySQL 配置」里填的「binlog 过期时间(天)」,本质是写入 MySQL 配置项 expire_logs_days(MySQL 5.7 及以前)或 binlog_expire_logs_seconds(MySQL 8.0+)。但这个配置只对新生成的日志生效,且需 MySQL 主动触发清理。
- MySQL 每次启动时会检查并清理过期 binlog
- MySQL 运行期间,每小时会自动扫描一次过期日志(默认行为,不可关闭)
- 如果没重启过,或刚改配置,旧日志不会立刻消失
所以:填了 7 天 ≠ 立刻只剩 7 天内的日志。你得确认 MySQL 是否已加载新配置(看 mysqld 进程启动参数或执行 SHOW VARIABLES LIKE 'expire_logs_days')。
立即清理 binlog 的安全操作步骤
不要等自动清理,用 SQL 命令精准控制:
- 登录 MySQL:
mysql -u root -p(宝塔里点「phpMyAdmin」或「终端」都可) - 查看当前 binlog 状态:
SHOW MASTER LOGS;(看有多少个、最大序号、文件大小) - 查看最早可删的时间点:
SHOW MASTER STATUS;(注意File字段,这是当前正在写的日志,它之前的都可删) - 按时间清理(推荐):
PURGE BINARY LOGS BEFORE '2024-05-01 00:00:00';(删掉该时间前的所有 binlog) - 按文件名清理(谨慎):
PURGE BINARY LOGS TO 'mysql-bin.000020';(删掉mysql-bin.000020之前的所有,不含该文件)
执行后立刻释放磁盘空间,且不影响任何功能。注意:PURGE 是原子操作,不可回滚。
清理后务必验证主从和备份是否正常
清理 binlog 不影响单机使用,但如果你开了主从复制或用了基于 binlog 的备份工具(如 mydumper 增量、Canal、Maxwell),就得格外小心:
- 从库还没读完的 binlog,不能删(查从库
SHOW SLAVE STATUS\G,看Relay_Master_Log_File对应的主库日志是否还在) - 用
mysqldump --master-data做全量备份时,备份语句里会记录CHANGE MASTER TO的 binlog 位置,若该位置已被 purge,从库无法正确接续 - 宝塔自带的「数据库备份」默认不依赖 binlog,但「远程同步」功能依赖,清理前先暂停同步任务
最稳妥的做法:清理前先确认所有从库 Seconds_Behind_Master = 0,且无增量备份任务正在运行。










