Skip to content
极高困难

一句话答案

redo log 是 InnoDB 的物理日志保证崩溃恢复(WAL),binlog 是 Server 层的逻辑日志用于主从复制和数据恢复。

核心要点
日志所属层作用格式写入时机
redo logInnoDB 引擎层崩溃恢复(保证持久性)物理日志(记录数据页的物理修改)事务执行过程中持续写
undo logInnoDB 引擎层事务回滚 + MVCC 版本链逻辑日志(记录逆操作)事务执行过程中持续写
binlogMySQL Server 层主从复制 + 数据归档恢复逻辑日志(SQL语句或行变更)事务提交时一次性写

关键区别:

  • redo log 是循环写(固定大小,写满后从头覆盖),binlog 是追加写(可保留完整历史)
  • redo log 是 InnoDB 引擎私有,binlog 是 MySQL Server 层,所有引擎共享
  • redo log 用于实例恢复(宕机后恢复内存数据),binlog 用于数据恢复(时间点恢复)和主从同步
追问与易错

追问方向:

  • 为什么需要两种日志?(redo log 是引擎层保证崩溃恢复,binlog 是 Server 层保证复制和备份)
  • redo log 大小固定怎么办写满了?(checkpoint 推进,刷脏页腾空间)
  • binlog 有哪几种格式?(STATEMENT/ROW/MIXED,推荐 ROW)

易错点:

  • ❌ "有了 binlog 为什么还需要 redo log"——binlog 不能恢复未提交的页修改
  • ❌ 混淆 redo log 和 undo log——redo 保证持久性(重做),undo 保证原子性(回滚)

💡 记忆锚点

redo log 是引擎层的"施工草稿"(物理日志,循环写,保证宕机后能把没刷盘的脏页补回来),binlog 是 Server 层的"公证书"(逻辑日志,追加写,用于主从复制和时间点恢复)。一个管崩溃恢复,一个管数据同步,缺一不可。