上一讲我们给大家说了一下redo log block这个概念,大家现在都知道平时我们执行完增删改之后,要写入磁盘的redo log,其实应该是先进入到redo log block这个数据结构里去的,然后再进入到磁盘文件里,如下图所示。

那么今天我们就来讲讲,这个redo log到底是如何通过内存缓冲之后,再进入磁盘文件里去的,这就涉及到了一个新的组件,redo log buffer,他就是MySQL专门设计了用来缓冲redo log写入的。
这个redo log buffer其实就是MySQL在启动的时候,就跟操作系统申请的一块连续内存空间,大概可以认为相当于是buffer pool吧。那个buffer pool是申请之后划分了N多个空的缓存页和一些链表结构,让你把磁盘上的数据页加载到内存里来的。
redo log buffer也是类似的,他是申请出来的一片连续内存,然后里面划分出了N多个空的redo log block,如下图所示。

通过设置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开始写入,如下图。

写满了一个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。

另外还要给大家讲一点的是,其实在我们平时执行一个事务的过程中,每个事务会有多个增删改操作,那么就会有多个redo log,这多个redo log就是一组redo log,叫做redo log group。其实每次一组redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log给写入到redo log buffer的block里去的。
如果一组redo log实在是太多了,那么就可能会存放在两个redo log block中,比如group1存放在两个block中,我们看下图示意。

但是反之,如果说一个redo log group比较小,那么也可能多个redo log group是在一个redo log block里的,如下图所示。

想必今天的内容学习完,大家对于平时我们一个一个的事务里产生的多条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刷入磁盘吗?