P26 binlog 刷盘机制
面试题:MySQL 的 binlog 是怎么刷盘的?刷盘时机是什么?
1. binlog 是什么
- Server 层的二进制日志,记录所有逻辑变更(DDL/DML),不记录 SELECT;
- 用途:主从复制、数据恢复/回滚(时间点恢复)、审计。
2. 写入流程
text
事务提交 → 把 binlog 写入 binlog cache(事务内存缓冲区)→ 事务提交时写入 binlog 文件(OS buffer)→ 刷盘每个事务有自己的 binlog cache(binlog_cache_size),提交时统一写入文件。
3. 刷盘机制:sync_binlog 参数
关键参数 sync_binlog 决定 binlog 何时从 OS 缓存刷到磁盘:
| 值 | 行为 | 可靠性 |
|---|---|---|
| 0 | 交给 OS 决定何时刷盘 | 最快,但系统崩溃可能丢 binlog(丢最近事务) |
| 1(默认) | 每次事务提交都刷盘 | 最安全,不丢已提交事务的 binlog |
| N | 每 N 次提交刷一次盘 | 折中,崩溃最多丢 N 个事务的 binlog |
4. 与 redo log 的关系(两阶段提交)
为了保证 binlog 和 redo log 一致,事务提交采用两阶段提交:
text
① 修改数据 → 写 redo log(prepare 状态)
② 写 binlog
③ redo log 标记 commit- 崩溃发生在 ①→② 之间:回滚(redo 没 commit,binlog 没写);
- 崩溃发生在 ②→③ 之间:以 binlog 为准重做(防止主从不一致)。
5. 生产建议
sync_binlog=1+innodb_flush_log_at_trx_commit=1:双 1 配置,最安全,主从复制不会丢数据;- 追求更高性能可适当放宽(如 sync_binlog=100~1000 + 组提交),但要做好丢数据的心理预期;
- 大事务会产生很大的 binlog,注意磁盘空间和复制延迟。
加分点
- binlog 三种格式:STATEMENT(记录 SQL)、ROW(记录行变更,默认)、MIXED;ROW 更安全但日志量大;
- 追问"主从复制延迟":binlog 同步 + 从库串行应用,可用并行复制(MTS)缓解;
- binlog 可以用来做误删恢复:
mysqlbinlog --stop-datetime重放。
一句话总结
binlog 是 Server 层逻辑日志,事务提交时从 binlog cache 写入文件并按 sync_binlog 刷盘(默认 1:每次提交刷盘);与 redo log 用两阶段提交保持一致,生产推荐"双 1"配置保证不丢数据。