在 MySQL 中,二进制日志(Binary Log,简称 binlog) 用于记录所有对数据库的更改操作(如 INSERT、UPDATE、DELETE 等),主要用于主从复制和数据恢复。但 binlog 文件会持续增长,若不清理,可能占满磁盘空间。
**✅ 一、安全清理 binlog 的方法**
**方法 1:使用 **PURGE BINARY LOGS**(推荐)**
**1.1 按时间清理(保留最近 N 天)**
-- 删除 3 天前的所有 binlog(不包括正在使用的) PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;⚠️ 注意:NOW() 是当前服务器时间,确保时区正确。
**1.2 按文件名清理**
-- 删除 mysql-bin.000010 之前的所有 binlog(不包括该文件) PURGE BINARY LOGS TO 'mysql-bin.000010';🔍 先用 SHOW BINARY LOGS; 查看当前有哪些 binlog 文件。
**方法 2:设置自动过期(推荐长期使用)**
在 MySQL 配置文件(如 /etc/my.cnf 或 my.ini)中添加:
[mysqld] # 自动删除 7 天前的 binlog binlog_expire_logs_seconds = 604800 # 单位:秒(7天 = 7*24*3600)📌 注意:
MySQL 8.0+ 使用 binlog_expire_logs_seconds(单位秒)。
MySQL 5.7 及更早版本使用 expire_logs_days(单位天):
ini编辑expire_logs_days = 7
修改配置后需重启 MySQL 或动态设置(MySQL 8.0+ 支持动态生效):
-- MySQL 8.0+ SET GLOBAL binlog_expire_logs_seconds = 604800; -- MySQL 5.7 SET GLOBAL expire_logs_days = 7;**✅ 二、查看 binlog 状态**
-- 查看所有 binlog 文件及大小 SHOW BINARY LOGS; -- 查看当前正在使用的 binlog SHOW MASTER STATUS; -- 查看 binlog 相关变量 SHOW VARIABLES LIKE 'log_bin%'; SHOW VARIABLES LIKE '%expire%';**⚠️ 三、重要注意事项**
不要手动删除 binlog 文件!
必须通过 SQL 命令(如 PURGE)或 MySQL 自动清理机制删除。否则 MySQL 会报错或崩溃。主从复制环境下要特别小心!
确保从库已经应用了要删除的 binlog。可先在从库执行:SHOW SLAVE STATUS\G查看 Relay_Master_Log_File,确保主库要删除的 binlog 文件名 小于 该值。
备份后再清理(重要数据场景)
如果 binlog 用于 PITR(时间点恢复),请先备份再清理。磁盘已满的紧急处理
如果磁盘已满,可临时关闭 binlog(不推荐生产环境):SET sql_log_bin = OFF; -- 仅对当前会话有效或直接 purge 到当前正在使用的文件(危险!):
PURGE BINARY LOGS TO '当前正在使用的文件名'; -- 如 mysql-bin.000015
**✅ 四、最佳实践建议**
| 场景 | 建议 |
|---|---|
| 有主从复制 | 保留至少 3~7 天,监控从库延迟 |
| 无复制,仅用于备份恢复 | 保留 1~3 天,配合全量备份 |
| 开发/测试环境 | 可设为 1 天或更短 |
| 磁盘空间紧张 | 立即 purge + 设置自动过期 |
**示例:完整清理流程**
-- 1. 查看当前 binlog SHOW BINARY LOGS; -- 2. 查看主从状态(如有从库) -- 在从库运行:SHOW SLAVE STATUS\G → 记下 Relay_Master_Log_File -- 3. 安全清理(例如保留最近2天) PURGE BINARY LOGS BEFORE NOW() - INTERVAL 2 DAY; -- 4. 设置自动过期(永久生效需改配置文件) SET GLOBAL binlog_expire_logs_seconds = 172800; -- 2天