57人参与 • 2026-10-09 • Mysql
mysql已经学习过了事务和锁,今天就来讲一讲日志的相关知识,主要讲解了mysql的三大日志,以及其对应的作用,并且探究了mysql是如何做到数据持久化,遇到mysql重启时数据丢失怎么恢复,mysql在提交事务时redolog和binlog的两阶段提交原理
mysql 有三种最核心的日志:
作用:是innodb的引擎层生成的日志,保证事务持久性,用于掉电等故障恢复
作用:是innodb的引擎层生成的日志,保证事务原子性,事务回滚,支撑 mvcc
作用:是一种二进制日志文件,是servicer层日志,数据归档、主从复制、时间点恢复
wal = write-ahead logging(预写日志) 核心思想:先写日志,再写磁盘。
如果每次事务提交都直接刷数据页:
wal 做法:
只要 redo log 落盘成功,数据就永久安全。
这就是 redo log 最核心的价值:保证事务持久性 + 大幅提升写入性能。
redo log采用追加写入的方式,将redo日志记录追加到文件末尾,而不是随机写入。这样可以减少磁盘的随机i/o操作,提高写入性能,因为redo log是一个环形大小的缓冲区,那么在末尾时会从头开始写,覆盖已经刷盘、不再需要的旧记录(循环写)
因为数据库会定期将内存中的数据刷新到磁盘,此时就会将最新的lsn(log sequence number)写入磁盘,lsn标志了当前redo log刷新磁盘的操作到哪一个位置了。这个 lsn 表示:此 lsn 之前的数据都已经安全落盘。
所以总体流程就是
- 数据页 = mysql 真实落在磁盘上的数据文件(.ibd)
- 崩溃前:磁盘数据页的 lsn 一定 ≤ redo log 的 lsn
- 恢复时:从「较小的那个 lsn(数据页 lsn)」开始,重做 redo log 里更大、更新的部分
- 最终把内存没来得及刷盘的数据,重新补写到磁盘数据页里
binlog 是 mysql server 层的逻辑日志,server层每进行一次数据操作就会生成一条binlog,等事务结束后,统一把所有binlog写入binlog文件,并且binlog不会记录select语句,只会记录修改表结构和数据的语句
binlog是追加写,一个文件写满后再新建一个文件继续写。
结论:生产环境直接用 row 格式。
| 对比项 | redo log | binlog |
|---|---|---|
| 所属层级 | innodb 引擎层 | mysql server 层 |
| 日志类型 | 物理日志(数据页修改) | 逻辑日志(sql / 行变化) |
| 写入方式 | 循环写(固定大小) | 追加写(无限文件) |
| 主要作用 | 崩溃恢复 | 主从复制、数据备份 |
| 事务保证 | 保证 acid 持久性 | 不保证事务,只记录变更 |
| 生成时机 | 事务执行中持续写 | 事务提交时一次性写 |
一句话记忆:redo 管崩溃,bin 管复制。
如果没有两阶段提交:
两阶段提交就是为了:让 redo log 与 binlog 逻辑完全一致。

prepare阶段是xid写入redo log, commit阶段是xid写入binlog
- 如果 binlog 已写入 + redo 是 commit (时刻b后)→ 提交
- 如果 binlog 已写入 + redo 是 prepare (时刻b前)→ 提交
- 如果 binlog 未写入(时刻a) → 回滚
即只要 binlog 已经写入了该事务的 xid(事务 id),恢复时就一定会把事务提交,不管此时 redo log 是
prepare还是commit状态。
两阶段提交 = mysql 分布式事务的基石。
undo log是用于回滚的日志,在一个事务中记录sql语句执行前的数据,在失败之后就做sql语句的反操作来回退
- 在插入一条记录时,要把这条记录的主键值记下来,这样之后回滚时只需要把这个主键值对应的记录删掉就好了;
- 在删除一条记录时,要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了;
- 在更新一条记录时,要把被更新的列的旧值记下来,这样之后回滚时再把这些列更新为旧值就好了。
到此这篇关于mysql三大日志redo log、undo log、binlog作用与两阶段提交原理的文章就介绍到这了,更多相关mysql日志redo log、undo log、binlog内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论