(1)回顾
    执行完增删改之后,要写入磁盘的redo log,其实是应该先进入到 redo log block 这个数据结构里的,然后再进入磁盘文件里,那么这个redo log 是如何通过内存缓冲之后再进入磁盘文件里的,这就涉及到一个新的组件,redo log buffer ,这是MySQL专门设计了用来缓存redo log写入的。

    (2)redo log buffer
    redo log buffer 其实就是MySQL启动的时候,跟操作系统申请的一块连续内存空间,大致相当于是buffer pool,buffer pool是申请内存之后划分了N多个空的缓存页和链表结构,让你把磁盘上的数据页加载到内存里来。
    redo log buffer 也是类似的,申请出来一块连续内存,然后在里面划分出N个空的 redo log block,可以通过设置innodb_log_buffer_size可以指定这个redo log buffer 的大小,默认的值是16MB,这已经足够大了,毕竟一个redo log block才512字节,每一条redo log也就是几个字节到几十个字节。

    (3)写入redo log buffer 过程
    redo log 都是先写入内存里的redo log block数据结构里去的,然后才会把redo log block写入磁盘文件,即当要写一条redo log 的时候,就会先从第一个redo log block开始写入,写满一个redo log block,就会写下一个 redo log block,直到所有的 redo log block都写满,如果redo log buffer 里所有的redo log block 都写满了,此时会强制把redo log block刷入磁盘中去,其实就是把512字节的redo log block追加到redo log 日志文件里。
    34.png

    (4)针对事务提交的redo log
    在执行一个事务的过程中,每个事务都会有多个增删改操作,那么就会有多个redo log,这多个redo log就是 一组 redo log,其实每次一组redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log 写入redo log buffer 的block里去。如果一组redo log 实在太多了,那么就可能存放到两个redo log block中。反之如果一个redo log buffer 较小,那么可能多个redo log group 是在一个 redo log block里的。
    35.png

    知识点
    提交事务的时候,redo log block必然进入磁盘,进入磁盘事务提交成功,就不会丢失数据