外观
一句话答案
redo log 是 InnoDB 的物理日志保证崩溃恢复(WAL),binlog 是 Server 层的逻辑日志用于主从复制和数据恢复。
核心要点
| 日志 | 所属层 | 作用 | 格式 | 写入时机 |
|---|---|---|---|---|
| redo log | InnoDB 引擎层 | 崩溃恢复(保证持久性) | 物理日志(记录数据页的物理修改) | 事务执行过程中持续写 |
| undo log | InnoDB 引擎层 | 事务回滚 + MVCC 版本链 | 逻辑日志(记录逆操作) | 事务执行过程中持续写 |
| binlog | MySQL 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 层的"公证书"(逻辑日志,追加写,用于主从复制和时间点恢复)。一个管崩溃恢复,一个管数据同步,缺一不可。