--flush-logs 的作用:刷新 MySQL 的日志文件(主要是二进制日志 binlog)
在 mysqldump
命令中,--flush-logs
是一个非常有用的选项,它的作用是:
🔧 --flush-logs
的作用:刷新 MySQL 的日志文件(主要是二进制日志 binlog)
当你执行:
mysqldump -u$user -p$password --flush-logs $dbname > $bakdir/${baknamefile}-webdb.sql
其中的 --flush-logs
选项会让 MySQL 在执行备份 之前,先刷新(即重新打开)日志文件,通常是 二进制日志(binary log,即 binlog)。
🎯 为什么要刷新日志?有什么好处?
1. 便于实现增量备份或时间点恢复(Point-In-Time Recovery)
MySQL 的 二进制日志(binlog) 记录了所有更改数据的 SQL 操作(比如 INSERT、UPDATE、DELETE 等),它是实现:
- 主从复制(Replication)
- 时间点恢复(PITR, Point-In-Time Recovery)
的关键。
当你使用 --flush-logs
,MySQL 会:
- 关闭当前的 binlog 文件
- 创建一个新的 binlog 文件
这意味着:此次备份对应的所有数据变更,都会从新的 binlog 文件开始记录。
这样你就可以:
✅ 清楚地知道:备份之后,所有的数据变化都记录在新 binlog 文件中,方便你之后做增量备份或恢复到某个具体时间点。
2. 逻辑上划分备份与后续操作
通过刷新日志,你相当于在备份这个时间点,“切了一刀”,之后的所有数据变更都会记录到新的日志中。
这样在数据恢复时,你可以:
- 先恢复这个全量备份(比如你用 mysqldump 导出的 sql 文件)
- 然后根据 新的 binlog 文件,应用从备份时间点之后的所有变更,直到你想要恢复的时刻
这对于数据库的灾备和精细恢复非常重要。
📌 举个例子:
假设你每天凌晨 3 点做一次全库备份,并使用 --flush-logs
:
mysqldump -u root -p --flush-logs mydb > /backup/mydb-$(date +%F).sql
那么:
- 备份前,MySQL 会把当前的 binlog 文件 flush 掉,生成一个新的 binlog
- 你备份的数据是“到备份时刻为止”的完整数据
- 之后的所有数据变更,都会记录到新 binlog 文件中
当某一天你的数据库挂了,你可以:
- 先恢复这个全量备份(比如 2024-06-01 的备份)
- 然后从备份时间点之后产生的 binlog 文件中,提取变更并重放(使用 mysqlbinlog 工具),恢复到故障前的某个时间点
⚠️ 注意事项:
-
--flush-logs
只刷新二进制日志(binlog),不会刷新其他日志(如 InnoDB 的 redo log 等) - 需要有足够的权限(通常需要 RELOAD 权限,以及 SELECT、LOCK TABLES 等权限,视具体情况而定)
- 在生产环境慎用,尤其是在高并发写入场景下,flush 可能会引起短暂的阻塞(不过通常很短暂)
-
--flush-logs
通常和全量备份(如 mysqldump 全库导出)一起使用效果最佳
✅ 总结:--flush-logs
的主要用途
作用 | 说明 |
---|---|
🔄 刷新日志文件 | 让 MySQL 重新打开新的二进制日志(binlog)文件 |
📦 便于增量备份 | 备份后产生的数据变更会记录到新的 binlog,方便后续增量恢复 |
🕒 支持时间点恢复(PITR) | 结合 mysqlbinlog 工具,可实现精确到秒的恢复 |
🧩 逻辑分割备份点 | 清晰划分“这次备份包含哪些变更,之后又有哪些” |
🧠 补充建议:
如果你要做更专业的备份策略,通常还会结合以下操作:
- 定期做全量备份(如每天或每周,配合
--flush-logs
) - 持续备份 binlog(用于增量恢复)
- 使用
mysqlbackup
(官方企业版工具)或xtrabackup
(Percona 工具)做物理备份(对大型数据库更高效)
但在使用 mysqldump
+ --flush-logs
的轻量级方案中,这个选项已经能显著提升备份的可恢复性与管理性。