返回

redo log:MySQL事务背后的幕后英雄

后端

MySQL8事务篇2-MySQL事务日志redo log



本文将聚焦于MySQL事务日志redo log,深入剖析其日志格式、组成、刷盘策略以及写入过程,并探索redo log file日志文件格式和checkpoint机制。




redo log的日志格式,组成和刷盘策略

redo log的日志格式采用循环写的方式,由多个大小相同的日志块组成,每个日志块的存储内容包括:

  • 日志块头:记录日志块的基本信息,如日志块编号、大小等。
  • 事务日志:记录事务操作的信息,包括事务ID、操作类型、修改的数据等。
  • 日志校验和:用来校验日志块的完整性,防止数据损坏。

redo log的刷盘策略有多种,包括:

  • 同步刷盘 :每个日志块在写入内存后立即写入磁盘,是最安全可靠的刷盘策略,但性能较低。
  • 异步刷盘 :每个日志块在写入内存后,先写入操作系统文件系统缓存,再由操作系统负责将缓存中的数据写入磁盘。这种策略性能较高,但存在数据丢失的风险。
  • 半同步刷盘 :介于同步刷盘和异步刷盘之间,每个日志块在写入内存后,先写入操作系统文件系统缓存,但要求操作系统在将缓存中的数据写入磁盘之前,必须收到至少一台从库的确认,然后再将数据从缓存中删除。这种策略兼顾了性能和数据安全性。

redo log 的写入过程

redo log的写入过程如下:

  1. 事务开始时,系统会在redo log中创建一个新的日志块,并记录事务ID和事务开始时间。
  2. 事务执行过程中,每当对数据进行修改时,系统都会在redo log中记录一条日志,包括事务ID、操作类型、修改的数据等。
  3. 事务提交时,系统会在redo log中记录一条事务提交日志,并释放事务占用的资源。
  4. 当redo log中的日志块写满时,系统会创建一个新的日志块,并将后续的日志写入新的日志块中。
  5. 当redo log中的日志块被覆盖时,系统会将该日志块从redo log中删除。

redo log file 日志文件的格式和checkpoint机制

redo log file日志文件由多个大小相同的日志块组成,每个日志块存储的内容与redo log中的日志块相同。

为了提高redo log的性能,MySQL采用了checkpoint机制。checkpoint机制会定期将redo log中已经提交的事务日志从内存刷新到磁盘,并删除这些日志。这样可以减少redo log中的日志数量,提高redo log的写入效率。

结语

redo log是MySQL事务日志的重要组成部分,它记录了事务操作的信息,保证了事务的原子性、一致性、隔离性和持久性。理解redo log的日志格式、组成、刷盘策略和写入过程,对于理解MySQL事务处理机制非常重要。