Yihui’s Blog

MySQL 中的日志类型有哪些?binlog、redo log 和 undo log 的作用和区别是什么?

日期:2026-07-05 难度:中等 标签:#面试 #八股 #MySQL #日志 #binlog #redoLog #undoLog #VIP

一句话答案

MySQL 常见日志包括 binlog、redo log、undo log、慢查询日志、错误日志、通用查询日志等;其中 binlog 用于归档和复制,redo log 用于崩溃恢复,undo log 用于事务回滚和 MVCC。

面试口语版

binlog 是 Server 层日志,记录逻辑变更,主要用于主从复制和基于时间点恢复。redo log 是 InnoDB 的物理日志,记录数据页做了什么修改,用来保证事务提交后即使宕机也能恢复。undo log 记录修改前的旧版本,用于事务回滚,也用于 MVCC 的一致性读。更新语句提交时,redo log 和 binlog 需要两阶段提交,避免出现引擎层和 Server 层日志不一致。

原理拆解

日志所属层记录内容主要作用
binlogServer 层逻辑变更主从复制、恢复
redo logInnoDB物理页修改崩溃恢复、持久性
undo logInnoDB旧版本数据回滚、MVCC
slow logServer 层慢 SQL性能排查
error logServer 层错误和启动信息运维诊断
sequenceDiagram
  participant S as Server
  participant I as InnoDB
  S->>I: 执行更新
  I->>I: 写 undo log
  I->>I: 写 redo log prepare
  S->>S: 写 binlog
  I->>I: 写 redo log commit

关键细节

  • redo log 是循环写,binlog 通常追加写。
  • redo log 偏物理,binlog 偏逻辑。
  • undo log 不只是回滚,还支撑 MVCC 的历史版本读取。
  • 两阶段提交保证 redo log 和 binlog 状态一致。
  • 主从复制主要依赖 binlog。
  • 崩溃恢复主要依赖 redo log。

面试官追问

  1. binlog 和 redo log 有什么区别?
  2. undo log 如何支持 MVCC?
  3. 为什么需要两阶段提交?
  4. redo log 为什么可以提升性能?
  5. 主从复制依赖哪种日志?

常见错误说法

错误说法问题更好的说法
binlog 和 redo log 都是恢复日志,所以一样混淆层次和用途binlog 用于复制/归档,redo 用于崩溃恢复
undo log 只用于回滚不完整还用于 MVCC 一致性读
redo log 记录 SQL错误redo 记录物理页修改

学习清单

  • 背清楚三类核心日志的所属层和作用。
  • 能画出两阶段提交流程。
  • 结合事务 ACID 理解 redo 和 undo。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文