Skip to content

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"配置保证不丢数据。

基于 VitePress 重建