MySQL 的二进制日志(Binlog)是记录所有修改数据库数据的 SQL 语句(以及这些语句执行时间)的日志文件。它主要用于: - 数据复制(主从同步) - 数据恢复 - 审计
随着数据库运行,Binlog 文件会不断增长,占用大量磁盘空间。如果不定期清理,可能导致: 1. 磁盘空间耗尽 2. 影响系统性能 3. 增加备份和恢复的复杂度
-- 删除指定时间点之前的binlog
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
-- 删除指定文件之前的binlog
PURGE BINARY LOGS TO 'mysql-bin.000010';
注意事项: - 确保删除的binlog不再用于复制或恢复 - 删除前建议备份重要binlog - 主从环境下,确保从库已经应用了这些日志
-- 查看当前设置
SHOW VARIABLES LIKE 'expire_logs_days';
-- 设置自动删除7天前的binlog
SET GLOBAL expire_logs_days = 7;
此方法会自动删除指定天数前的binlog,但需要注意:
- 需要重启MySQL或执行FLUSH LOGS
才能立即生效
- 确保设置的天数大于备份周期
# 首先确认MySQL当前正在使用的binlog
mysql> SHOW MASTER STATUS;
# 然后可以删除比当前使用文件更早的文件
rm mysql-bin.000001
rm mysql-bin.000002
警告: - 必须确保MySQL服务没有在使用这些文件 - 删除后需要更新index文件 - 此方法风险较高,可能导致数据不一致
#!/bin/bash
# 获取当前正在使用的binlog文件
CURRENT_BINLOG=$(mysql -uroot -p'password' -e "SHOW MASTER STATUS" | awk 'NR==2 {print $1}')
# 获取比当前文件早的所有binlog文件
BINLOGS_TO_DELETE=$(mysql -uroot -p'password' -e "SHOW BINARY LOGS" | awk '{if ($1 < "'$CURRENT_BINLOG'") print $1}')
# 安全删除这些文件
for binlog in $BINLOGS_TO_DELETE
do
echo "Purging binlog: $binlog"
mysql -uroot -p'password' -e "PURGE BINARY LOGS TO '$binlog'"
done
检查磁盘空间是否释放:
df -h
检查剩余的binlog文件:
SHOW BINARY LOGS;
检查复制状态(如果有主从):
SHOW SLAVE STATUS\G
通过以上方法,可以安全有效地管理MySQL的binlog文件,既保证数据安全又避免磁盘空间浪费。