binlog/redolog/undolog三者对比

  1. redo:崩溃恢复、引擎层、物理+逻辑,保证持久性

  2. undo:事务回滚+MVCC、引擎层、逻辑,保证原子性

  3. binlog:主从同步、归档、Server层、逻辑SQL,数据备份

一、详细对照表

对比项 redo log undo log binlog

归属层 InnoDB引擎层 InnoDB引擎层 MySQL Server层,所有引擎都生成

作用 宕机崩溃恢复(WAL),落地脏页 事务回滚 + MVCC多版本快照读 主从复制、数据恢复、审计

日志内容 物理日志:修改的数据页内容 逻辑日志:反向SQL(原值) 逻辑日志:完整执行SQL/DML

写入时机 修改数据前(WAL) 修改数据前生成旧数据 事务提交最后一步写入磁盘

落盘规则 循环覆写(ib_logfile固定大小) 事务提交不立即删,purge后台回收 追加写入,永久留存,可配置过期删除

事务关系 所有DML都会生成 DML生成,DDL很少 提交才写入,失败回滚不生成

文件位置 ib_logfile0/1 undo表空间undo001 mysql-bin.xxx

二、一条update完整写入顺序(重点)

  1. 先查数据页到BufferPool

  2. 生成undo日志写入undo buffer

  3. 生成redo日志写入redo buffer

  4. 修改内存中数据页(脏页)

  5. 事务commit:刷redo到磁盘;写入binlog落盘

  6. 后台线程随机刷脏页到磁盘

    宕机:靠redo恢复脏页;回滚:靠undo还原;主从同步:靠binlog

    三、三种日志解决什么问题

  7. redo → 解决宕机丢数据(持久性)

    内存脏页没刷盘,库崩了,重启用redo重做数据。

  8. undo → 事务回滚+快照读(原子性+隔离)

    事务失败回退旧数据;MVCC靠undo链条生成历史版本。

  9. binlog → 备份、主从、时间点恢复

    innodb之外引擎没有redo/undo,全靠binlog记录数据变更。

四、补充区分(高频坑)

  1. redo是循环日志,满了覆盖;binlog是追加日志,不会覆盖

  2. undo不会立即删除:事务提交后,有快照在读就保留,purge线程定时清理

  3. binlog三种格式:

• statement:记SQL语句

• row:记行变更(主从最稳,默认)

• mixed:混合

五、Seata undolog 额外区分

Seata的undolog不属于MySQL三大日志,存业务数据快照,用于分布式AT回滚。

相关推荐
喜欢的名字被抢了1 分钟前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
江小渔3 分钟前
训练工程与训练平台入门 31 安装 Kubeflow Trainer,并跑第一个 TrainJob
后端
用户938515635074 分钟前
从 0 拆解一个 Next.js 笔记系统:npx、App Router、RSC 与组件规划全记录
前端·后端·全栈
城管不管29 分钟前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
GitLqr33 分钟前
玩转 Flutter 中的 Stack 与 Positioned:解决 UI 重叠问题的实战指南
flutter·面试·全栈
数据知道42 分钟前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
windliang1 小时前
Claude Code 源码分析(十二):错误处理与自动恢复:让 Agent 稳定运行
前端·javascript·面试
fatcoder1 小时前
玩转Docker 06 — 容器网络
前端·后端·docker
feng尘1 小时前
深入浅出 Java:ThreadLocal 为什么会产生内存泄漏?
后端
2601_949950631 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐