43、直接强行把redo log写入磁盘?非也,揭秘redo log buffer
00 分钟
2022-8-26

43、直接强行把redo log写入磁盘?非也,揭秘redo log buffer

notion image
  • w1027
我们今天学习下,这个redo log到底是如何通过内存缓存之后,再进入磁盘文件里去的,这就涉及到了一个新的组件,redo log buffer,他就是MySQL专门设计了用来缓冲redo log写入的。
这个redo log buffer其实就是MySQL在启动的时候,就跟操作系统申请的一块连续内存空间,大致可以认为相当于是Buffer Pool吧,那个Buffer Pool是申请之后划分了N多个空的缓存页和一下链表结构,让你把磁盘上的数据页加载到内存里来的。
redo log buffer也是类似的,他是申请出来的一片连续内存,然后里面划分出了N多个空的redo log block,如下图所示:
notion image
通过设置MySQL的innodb_log_buffer_size可以指定这个redo log buffer的大小,默认的值就是16MB,其实已经够大了,毕竟一个redo log block才512字节而已,每一条redo log其实也就几个字节到几十个字节罢了。
所以大家看到这里就明白了,上一篇我们就说了,其实redo log都是先写入内存里的redo log block数据结构里去的,然后完事儿了才会把redo log block写入到磁盘文件里去的。
这里我们看到了redo log buffer的结构,就很清晰的知道,当你要写一条redo log的时候,就会先从第一个redo log block开始写入,如下图:
notion image
写满一个redo log block,就会继续写下一个redo log block,以此类推,直到所有的redo log block都写满。
那么此时肯定就有人会问了,万一要是redo log buffer里所有的redo log block都写满了呢?
那此时必然会强制把redo log block刷入到磁盘中去的
我们上一篇讲到了redo log block刷入磁盘文件中的示意,其实就是把512字节的redo log block追加到redo log日志文件里去就可以了
看下面的图,里面就画的很清楚,在磁盘文件里不停的追加一个又一个的redo block。
notion image
另外还要给大家讲一点的是,其实在我们平时执行一个事物的过程中,每个事物会有多个增删改操作,那么就会有多个redo log,这多个redo log就是一组redo log,其实每次一次redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log给写入到redo log buffer的block里去的。
如果一组redo log实在太多了,那么久可能会存放在两个redo log block中,我们看下图示意:
notion image
但是反之,如果说一个redo log group比较小,那么也可能多个redo log group是在一个redo log block里的,如下图所示:
notion image
想必这篇内容学习完,大家对于平时我们一个一个的事物里产生的多余redo log,是如何形成一个redo log组的,一组redo log是如何写入redo log buffer中的redo log block的,然后redo block是如何写入redo log磁盘文件的,这个全流程就有了一个清晰地理解和认识了
下面我们会继续探索,就是redo log buffer里的redo log block们到底是如何写入到磁盘文件里去的
一定要等待redo log block全部写满了才会刷入磁盘吗?还有哪些其他的时机会把redo log block刷入磁盘吗?
这些问题,我们下面继续。

评论