Skip to content
进阶

一句话答案

undo log 记录数据修改前的值,用于事务回滚(INSERT→DELETE)和 MVCC 版本链的快照读。

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

关键区别:

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

追问方向:

  • undo log 什么时候被清理?
  • 长事务为什么有害?
  • undo log 和 MVCC 什么关系?

易错点:

  • ❌ undo log 就是备份——是逻辑逆操作日志
  • ❌ 事务提交后 undo 立即删——其他事务可能还在读

💡 记忆锚点

undo log 是数据的"后悔药":INSERT 了就记一条 DELETE,UPDATE 了就记住旧值。事务回滚时吃后悔药恢复原样(保证原子性),同时这些旧版本串成版本链供 MVCC 快照读使用。注意长事务会让 undo log 堆积不能清理,像后悔药过期不扔占满药柜。