深入浅出 MySQL:彻底搞懂 redo log、undo log 与 binlog

为什么需要日志?

把 MySQL 想象成一个健忘但精明的掌柜。他需要三个"神仙本本":

  1. Redo Log (防断电备忘录) :生怕突然断电(宕机)后忘了刚完成的交易,MySQL会先飞快地记在这个本本上。这样重启后一看便知,保证生意一笔不落,这叫 持久性

  2. Undo Log (后悔药) :客人反悔不买了(事务回滚),掌柜就照着这个本本把东西恢复原样,好像无事发生。这保证了交易的"要么都做,要么都不做",这叫 原子性

  3. Binlog (监控录像):记录店里所有的操作流水。想开分店(主从复制)?把录像给分店照着做一遍就行。想恢复到昨天下午三点?拿出备份再播放录像到指定时间点。

没有这些日志,MySQL这位掌柜就会账目混乱,无法扩张,也经不起任何风浪。

Redo Log

想象一下,修改磁盘上的数据文件,就像是在一本已经精装成册的、厚重的书中修改一个错字。你得先找到那一页,小心翼翼地修改,这个过程非常缓慢(随机I/O性能差)。

为了不让用户(你)等得抓狂,MySQL 设计了一个"高效工作法":

  1. "草稿纸" (Redo Log) :当你的 UPDATE 请求来了,MySQL 不会立刻去翻那本厚书。它会先在手边的"草稿纸"(Redo Log)上飞快地记下一笔。这个过程是顺序追加的,像写日记一样,速度极快(顺序I/O性能高)。

  2. 承诺先行 (WAL 技术) :只要写上了"草稿纸",MySQL 就立刻告诉你:"放心,我记下了,你的修改不会丢!" 这就是大名鼎鼎的 WAL (Write-Ahead Logging) 技术 ------"先写日志,再动正文"。

  3. 记录"动作"而非"命令" (物理日志) :"草稿纸"上记的不是"把某某数据更新一下"这种模糊命令,而是极其具体的" 将第X本书(表空间)第Y页(数据页)第Z行的内容改成D "。这种 物理日志 的好处是,恢复时无需思考,照着"动作"重做一遍即可,简单高效。

最终目的:即便 MySQL 突然断电,内存里的东西全忘了,也没关系。重启后,它只需拿出这张"草稿纸",检查哪些记录还没来得及誊写到"精装书"(磁盘文件)上,然后照着重做一遍,就能确保你的数据一个字节都不会少。

Undo Log

如果说 Redo Log 是保证"承诺必达"的英雄,那么 Undo Log 就是那位手持"后悔药"和"时光机"的魔法师,它主要解决两个问题:事务回滚MVCC 并发控制

事务回滚

你是一位在厚重精装书上修改错字的编辑。

  • Redo Log 记录的是:"准备把 '张三' 改成 '李四'"。

  • Undo Log 则在动手前,先在另一张便利贴上写下:"第 1024 页的第 3 行,改之前是'张三'"。

现在,你改到一半,老板突然说:"别改了,保持原样!"(ROLLBACK 操作)。

怎么办?你淡定地拿出那张写着"改之前是'张三'"的便利贴(Undo Log),轻松地把"李四"又改回了"张三"。一次完美的"反向操作"完成了!

总结:Undo Log 记录了数据修改前的"旧模样",是事务想反悔、执行 ROLLBACK 时的唯一依据,保证了事务的原子性(Atomicity)。

MVCC 并发控制

当你 (事务 A ) 正在那页书上涂涂改改,还没最后确认 COMMIT时,另一位同事 (事务B) 跑过来说:"嘿,我现在想要看一下第 996 页的内容!"

如果没有 Undo Log 这个"时光机",同事** (事务 B) 要么只能看到你 (事务 A) 改得一塌糊涂的中间状态("脏读"),要么就得等你 (事务 A) **改完才能看(性能极差)。

这时,Undo Log 登场了!它会拦住同事B,把那张"改之前是'张三'"的便利贴递给他看。这样,同事 (事务 B) 读到的是你 (事务 A) 修改前那个"干净"的版本,而你也可以继续安心修改,互不干扰。

总结:通过为不同事务提供数据的"历史版本",Undo Log 实现了多版本并发控制(MVCC),让"读"和"写"可以同时进行,极大提高了数据库的并发性能。

Binlog

我们不应将 Binlog 简单视为一个"日志",而应看作是 MySQL Server 对外发布的 "操作纪要 ",它记录了所有导致数据变更的事件。它的两大核心使命是:主从复制数据恢复

主从复制

想象一下,主库(Master) 是总部,从库(Slave) 是遍布全球的加盟店。总部每完成一笔交易 (事务提交) ,就会在这份 "操作纪要" 上追加一条记录,并通过"内部专线"广播出去。加盟店基于这份纪要,一字不差地复刻总部的所有操作,从而保证全球业务同步,这便是 主从复制 的基石。

数据恢复

这更像是为数据库提供了一部可以回溯的"历史档案"。当有人(比如一个"手滑"的开发者)执行了错误的 DELETE 操作导致数据灾难时,Redo Log 无法救场(因为它只负责崩溃恢复)。

此时,管理员可以拿出昨天的完整备份,然后像历史学家一样,对照这份"历史档案"(Binlog),将从备份点到灾难发生前一秒的所有操作"重演"一遍,实现精准的 定点恢复(Point-in-Time Recovery)

相关推荐
2501_933670795 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
狗头大军之江苏分军7 小时前
《潮水漫过十七岁》开学了
后端
我要见SA姐17 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
苏三说技术7 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong8 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7048 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc8 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
xcLeigh8 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客8 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
aramae9 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端