当前位置: 首页 > news >正文

Undo、Redo、Binlog的相爱相杀

什么是 undo log?为什么需要 undo log?

一句话定义

Undo Log(撤销日志)是 InnoDB 存储引擎层的逻辑日志,记录**“数据修改前的旧值”,用于事务回滚MVCC 多版本并发控制**。


为什么需要 Undo Log?

场景没有 Undo Log 的后果Undo Log 的作用
事务回滚无法撤销已执行一半的 SQL → 数据不一致保存旧值,ROLLBACK 时把数据还原
MVCC 一致性读其他事务只能看到最新值,不可重复读/幻读通过旧版本链提供 历史快照,实现 RR 隔离级别
崩溃恢复崩溃时未提交事务残留脏数据Redo 重放后,用 Undo 回滚未提交事务

面试金句

“Undo Log 保存旧值,负责 事务回滚MVCC 历史版本,与 Redo Log 的 新值 互补,共同保证 ACID 里的原子性和隔离性。”

什么是 redo log?为什么需要 redo log?

一句话定义

Redo Log(重做日志)是 InnoDB 引擎的物理日志,记录**“对哪个数据页、哪个偏移量做了什么修改”,用来在崩溃时重做已提交事务**,确保持久性(Durability)。


为什么需要 Redo Log?

场景没有 Redo Log 的后果Redo Log 的作用
系统崩溃已提交的数据可能只写 Buffer Pool,未落盘 → 数据丢失崩溃后按 Redo Log 把页修改重新刷盘,保证已提交事务不丢
随机写优化每次事务刷盘需随机写数据页,I/O 放大顺序追加写 Redo Log(WAL),延迟批量刷脏页,性能提升 10 倍+
原子性写到一半断电,页半新半旧 → 页损坏Redo 保证页级幂等,可重放完整修改

面试金句

“Redo Log 让 InnoDB 先写日志再写磁盘(WAL),崩溃后重放日志即可恢复已提交事务,既保数据不丢,又减少随机写。”

什么是 binlog?它有几种模式?用来做什么?

一句话定义

Binlog(Binary Log)是 MySQL Server 层的二进制日志,记录所有数据变更事件(SQL 或行级修改),用于 主从复制基于时间点的数据恢复


三大用途

  1. 主从复制:从库重放 binlog 同步数据。
  2. 增量备份与恢复:按时间点恢复误删、误改数据。
  3. 审计 & 数据变更追踪

三种模式(binlog_format)

模式记录内容特点场景
STATEMENT原始 SQL 语句日志小,可能主从不一致无函数/触发器的简单 OLTP
ROW每行变更前后镜像日志大,一致性最强金融、高一致性需求
MIXED(默认 5.7+)智能切换:STATEMENT 为主,危险操作自动切 ROW兼顾大小与一致性线上最常用

面试金句

“Binlog 是 MySQL 的 逻辑复制日志,三大用途:主从同步、时点恢复、审计追踪;三种模式 STATEMENT / ROW / MIXED,线上默认 MIXED,强一致性需求切 ROW。”

三者关系和配合

一张图 + 三个阶段,把 Undo、Redo、Binlog 在事务生命周期里的配合关系彻底串起来。


🎯 三者职能一句话

日志记录内容核心目的
Undo“旧值”回滚未提交事务、提供 MVCC 历史版本
Redo“新值”崩溃后 重做已提交事务(持久性)
Binlog“逻辑事件”主从复制、时点恢复

🔄 事务三阶段协作流程(背这张图)

ClientInnoDBDiskBEGIN① 写 Undo(旧值)② 修改 Buffer Pool③ 写 Redo 日志(prepare)④ 写 Binlog(落盘)⑤ Redo 写 commit 标记COMMITClientInnoDBDisk

🛡️ 崩溃恢复时再跑一次

  1. Redo 重放所有已提交事务 → 数据页最新。
  2. Undo 回滚未提交事务 → 去掉脏数据。
  3. Binlog 不参与崩溃恢复,仅用于 主从人工回放

🎓 面试一句话

“事务提交时 先写 Undo 旧值、再写 Redo prepare、再写 Binlog、最后 Redo commit;崩溃后用 Redo 重做 + Undo 回滚 保证原子性与持久性,Binlog 负责复制。”

http://www.dtcms.com/a/306693.html

相关文章:

  • GIS工程师面试题
  • Java项目:基于SSM框架实现的济南旅游网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 力扣 hot100 Day60
  • Rabbit MQ的消息模式-Java原生代码
  • 发那科机器人P点位置号码自动变更功能为禁用状态
  • 认识ansible(入门)
  • 《嵌入式C语言笔记(十六):字符串搜索、动态内存与函数指针精要》
  • RocketMQ 核心特性解析及与 Kafka区别
  • 思途JSP学习 0730
  • DP-v2.1-mem-clean学习(3.6.7)
  • 片上变化(OCV)
  • 7.Origin2021如何绘制拟合数据图?
  • Python 之抽象方法 @abstractmethod 的理解
  • Day06_C++编程
  • 9《MySQL 教程》MySQL 的数据类型(2)
  • 云原生环境里的显示变革:Docker虚拟浏览器与cpolar穿透技术实战
  • 赵义弘-----补题报告
  • 【python】Python爬虫入门教程:使用requests库
  • 【git】在 GitLab 上如何把 A 分支(如 feature/xxx)合并到 B 分支(如 trunk)
  • Scala实现常用排序算法
  • 深入理解 Kotlin Flow:异步数据流处理的艺术
  • MidJourney精选图集与提示词生成器:AI创意灵感与高效提示词工具
  • composer 常用命令
  • 高防CDN与高防IP的选择
  • docker可视化管理工具lazydocker
  • 【百卷编程】Go语言大厂高级面试题集
  • 3GPP TS 38.331 V18.6.0 (2025-06)中文版
  • 工业5G路由器赋能高速公路实时监控
  • 【问题未解决-寻求帮助】VS Code 中使用 Conda 环境,运行 Python 后 PowerShell 终端输出内容立即消失
  • 《Java 程序设计》第 12 章 - 异常处理