MySQL 的二进制日志(Binlog)是记录数据库变更的重要组件,用于复制、恢复和审计。合理设置 Binlog 过期时间可以避免磁盘空间被占满,同时确保有足够的历史日志用于故障恢复。
1. Binlog 过期时间参数
MySQL 通过以下参数控制 Binlog 的过期策略:
1.1 expire_logs_days
- 作用:自动删除超过指定天数的 Binlog 文件。
- 默认值:0(表示永不删除,需手动清理)。
- 设置方式:
-- 临时修改(重启后失效)
SET GLOBAL expire_logs_days = 7; -- 保留7天的Binlog
-- 永久修改(修改配置文件)
[mysqld]
expire_logs_days = 7
1.2 binlog_expire_logs_seconds
- 作用:MySQL 8.0.22+ 版本引入,替代
expire_logs_days
,使用秒为单位更精确。 - 默认值:0(永不删除)。
- 设置方式:
-- 临时修改
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天(604800秒)
-- 永久修改
[mysqld]
binlog_expire_logs_seconds = 604800
2. 手动清理 Binlog
除了自动过期,也可以手动删除 Binlog:
2.1 删除指定日志之前的所有日志
PURGE BINARY LOGS TO 'mysql-bin.000100'; -- 删除编号小于000100的所有日志
2.2 删除指定时间之前的所有日志
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; -- 删除2023年之前的日志
2.3 删除所有 Binlog(慎用)
RESET MASTER; -- 删除所有Binlog,生成新的日志文件
3. 查看 Binlog 状态
3.1 查看当前过期设置
SHOW VARIABLES LIKE 'expire_logs_days';
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
3.2 查看当前 Binlog 文件列表
SHOW BINARY LOGS;
3.3 查看日志空间占用
du -sh /var/lib/mysql/mysql-bin.* # 查看Binlog文件大小
4. 最佳实践
4.1 合理设置过期时间
- 生产环境:通常设置为 7-14 天,平衡磁盘空间和恢复需求。
- 复制环境:确保从库有足够时间同步,建议设置为从库延迟的 2 倍以上。
4.2 监控磁盘空间
# 添加定时任务监控Binlog空间
0 0 * * * du -sh /var/lib/mysql/mysql-bin.* > /var/log/binlog_size.log
4.3 结合磁盘自动清理
对于空间有限的服务器,可以使用 expire_logs_days
和磁盘使用率监控结合:
# 当磁盘使用率超过80%时,强制清理Binlog
if [ $(df -h /var/lib/mysql | awk 'NR==2 {print $5}' | sed 's/%//') -gt 80 ]; then
mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);"
fi
5. 注意事项
- 主从复制依赖:
- 确保从库已同步需要删除的 Binlog,否则会导致复制中断。
- 恢复需求:
- 如果需要基于时间点恢复(PITR),需保留足够的历史日志。
- 大事务影响:
- 未提交的大事务会阻止 Binlog 过期,需监控长事务。
- 磁盘空间监控:
- 定期检查 Binlog 目录大小,避免空间占满导致 MySQL 崩溃。
通过合理设置 Binlog 过期时间并结合手动清理策略,可以有效管理 MySQL 的磁盘空间,同时保障数据安全和复制功能的正常运行。