mysql 的三大日志可以这样理解:undo log 管回滚、redo log 管崩溃恢复、binlog 管主从复制和数据归档,它们分别属于 innodb 引擎层(前两者)和 server 层(后者),配合起来才保证了事务的原子性、持久性和主从数据一致性。
1. 引言:mysql 为什么需要这么多日志?
在使用 mysql 时经常听到这样几个名词:
- undo log
- redo log
- binlog
❓ 不就是写数据库吗?为什么还要搞这么多日志?
其实,本质原因只有一个:
👉 为了保证事务安全、数据不丢失、主从一致性。
mysql 的三大日志,分别从三个维度解决问题:
| 日志 | 解决问题 |
|---|---|
| undo log | 事务回滚 |
| redo log | 崩溃恢复 |
| binlog | 逻辑复制 |
2. undo log:事务回滚的“后悔药”
2.1 什么是 undo log?
undo log 的核心作用是:
记录数据修改前的状态,用于事务回滚。
通俗理解:
做错事 → 有后悔药 → 能回退
2.2 undo log 解决什么问题?
主要解决两类问题:
✅ 事务回滚(rollback)
begin; update user set money = 0; rollback;
此时通过 undo log 恢复原值。
✅ mvcc(多版本并发控制)
undo log 是 mvcc 的基础:
- 每次修改生成历史版本
- 不同事务读取不同版本
提高并发性能。
有关mvcc,可参考innodb存储引擎对mvcc的实现
2.3 undo log 工作原理
执行更新时:
- 先写 undo log(旧数据)
- 再修改数据页
- 提交事务
示意:
旧值 → undo log 新值 → buffer pool
2.4 undo log 的特点
| 特性 | 说明 |
|---|---|
| 类型 | 逻辑日志 |
| 存储 | 表空间 |
| 生命周期 | 事务结束后可清理 |
| 作用阶段 | 事务内 |
3. redo log:崩溃恢复的“救命符”
3.1 什么是 redo log?
redo log 的核心思想是:
记录“做了什么修改”,用于宕机恢复。
也叫:
wal(write ahead logging)
先写日志,再写磁盘。
3.2 redo log 解决什么问题?
解决:
❗ mysql 宕机后数据丢失问题
因为:
- 数据页先在内存中修改
- 磁盘写入较慢
如果宕机,内存数据丢失。
3.3 redo log 工作流程
更新流程:

3.4 redo log 的物理含义
redo log 记录的是:
对某个数据页做了什么物理修改
例如:
page 10, offset 20, value 3 → 5
3.5 redo log 的特点
| 特性 | 说明 |
|---|---|
| 类型 | 物理日志 |
| 存储 | ib_logfile |
| 结构 | 循环写 |
| 作用阶段 | 崩溃恢复 |
4. binlog:主从复制的“桥梁”
4.1 什么是 binlog?
binlog 是 mysql server 层日志:
记录所有对数据库产生影响的逻辑操作。
与 innodb 无关。
4.2 binlog 的作用
主要作用:
✅ 主从复制
主库写 binlog → 从库重放
✅ 数据恢复
支持时间点恢复(pitr)
4.3 binlog 格式
三种格式:
| 格式 | 说明 |
|---|---|
| statement | sql 语句 |
| row | 行变化(推荐) |
| mixed | 混合 |
生产环境一般用:
binlog_format = row
4.4 binlog 写入流程
事务提交时:写 binlog → 刷盘 → 提交
4.5 binlog 特点
| 特性 | 说明 |
|---|---|
| 层级 | server 层 |
| 类型 | 逻辑日志 |
| 是否循环 | 否 |
| 用途 | 复制/恢复 |
5. 三大日志协作流程(重点)
以一次 update 为例:
update user set money = 100 where id = 1;
完整流程:

👉 这就是著名的 两阶段提交(2pc)。
6. 两阶段提交(2pc)
目的:
保证 redo log 和 binlog 一致
阶段一(prepare):
redo log prepare
阶段二(commit):
binlog 写入 redo log commit
防止主从不一致。
7. 三大日志对比总结
| 维度 | undo log | redo log | binlog |
|---|---|---|---|
| 层级 | innodb | innodb | server |
| 类型 | 逻辑 | 物理 | 逻辑 |
| 作用 | 回滚/mvcc | 崩溃恢复 | 复制/恢复 |
| 生命周期 | 短 | 长 | 长 |
| 是否循环 | 否 | 是 | 否 |
8. 常见面试题解析
q1:为什么 redo 是物理,binlog 是逻辑?
- redo:页级修改 → 快速恢复
- binlog:sql/行 → 跨引擎复制
q2:只有 redo 行不行?
❌ 不行
redo 不能做主从复制。
q3:undo 会一直存在吗?
❌ 不会
purge 线程定期清理。
q4:宕机时如何恢复?
- 未提交 → undo 回滚
- 已提交 → redo 重放
9. 生产环境建议
推荐配置
innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog_format = row
保证最强一致性。
10. 总结
三大日志分工明确:
- undo:负责“后悔”
- redo:负责“复活”
- binlog:负责“传播”
undo 保证回滚,redo 保证不丢,binlog 保证同步。
参考资料
面试官:mysql中的undo log,redo log,bin log有什么区别?
到此这篇关于mysql三大日志 undo log、redo log、binlog详解的文章就介绍到这了,更多相关mysql ndo log、redo log、binlog内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论