首页 - 技术 - 《原创》连redolog写入机制都不懂……怎么破解呢?

《原创》连redolog写入机制都不懂……怎么破解呢?

2023-10-01 10:17

本文简单讲解了MySQL中redolog的写入机制,有助于深入理解MySQL中数据一致性和持久化的实现,同时还可以学习如何使用redolog 调整 MySQL IOPS。

重做日志写入机制

MySQL更新数据时,首先更新数据,然后生成redolog。此时redolog处于prepare状态,然后保存binlog,然后提交事务。此时redolog转为commit状态,写入完成。

这一步在之前的文章中已经详细介绍过。如果您不明白,请继续阅读。

「原创」讲讲从RedoLog和BinLog中执行Update语句

2022-06-02

事务未提交时,log无法直接写入磁盘上的ib-logfile-n文件(重做日志磁盘中的文件名),因此需要占用一块内存需要临时存储,因此该页需要相应的缓冲区——redolog buffer

回顾整个redolog写入过程,在prepare阶段,log 可能会被存储在redolog buffer中。事务提交后,日志会保存到binlog中。


最后将commit事务保存到binlog中。这个阶段其实有两种可能:

1。日志从缓冲区写入文件系统的页缓存。在适当的时候,系统会调用fsync将page cache中的redolog数据持久化到磁盘(保存到ib-logfile-n文件中)

2。日志直接从缓冲区持久化到磁盘。

tips:将日志写入重做日志缓冲区非常快,将日志写入页缓存也更快,但持久化到磁盘会慢很多。


redolog 的 fsync 策略

注意,当redolog写入或者直接执行fsync时,redolog缓冲区中的所有内容都会被刷新。

  1. 事务提交时执行fsync
  2. 当三个事务ABC同时进行时,如果事务A已提交,事务B尚未结束,而C已准备好提交,则BC会跟随事务A持久化到磁盘。
  3. 定时任务每秒会将redo log buffer中的日志写入到文件系统中的page cache中,然后调用fsync进行持久化
  4. 当redo log buffer占用的空间即将达到innodb_log_buffer_size的一半时,后台线程会主动写入磁盘。

在阶段 2、3 和 5 中,可以将未提交的事务刷新到磁盘。


redo log的写入策略可以通过参数innodb_flush_log_at_trx_commit配置。

  • 设置为 0:重做日志保留在重做日志缓冲区中,并依赖计划任务每​​秒刷新到磁盘(不推荐),无论事务提交如何。
  • 设置为1(默认):表示每次提交事务时都会将重做日志持久化到磁盘(最安全)
  • 设置为2:表示每次提交事务时,重做日志每秒只写入页缓存并刷新到磁盘一次(速度快,但会丢失1s的数据,甚至更多, 1秒并不严格)

为了方便大家深入研究,我在下面贴出了官网对这个参数的解释。