当前位置: 代码网 > it编程>数据库>Mysql > MySQL三大日志 Undo Log、Redo Log、Binlog详解

MySQL三大日志 Undo Log、Redo Log、Binlog详解

2026年09月24日 • Mysql •我要评论
mysql 的三大日志可以这样理解:‌undo log 管回滚、redo log 管崩溃恢复、binlog 管主从复制和数据归档‌,它们分别属于 innodb 引擎层(前两者)和

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 工作原理

执行更新时:

  1. 先写 undo log(旧数据)
  2. 再修改数据页
  3. 提交事务

示意:

旧值 → 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 格式

三种格式:

格式说明
statementsql 语句
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 logredo logbinlog
层级innodbinnodbserver
类型逻辑物理逻辑
作用回滚/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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com