(1)回顾:
    执行CRUD时,从磁盘加载数据页到buffer pool的缓存页里,然后对缓存页做修改,同时还会写redo log 到日志文件里去,后续不定时把缓存页刷回磁盘文件。

    (2)redo log 格式回顾
    日志类型+表空间号+数据页号+数据页内偏移量+修改了几个字节的数据+实际修改数据
    redo log 是按照上述格式,一条一条直接写入磁盘的日志文件里的嘛?

    (3)redo log block数据结构
    redo log block 大概可以理解为,redo log不是单行单行的写入日志文件的,是用一个redo log block来存放多个单行日志的;
    个redo log block 是512字节,分为3部分,一个12字节的header 块头,一个496字节的body 块体,一个4字节的trailer块尾
    12字节块头又分为4部分:
    (1) 4字节的block no,块唯一编号
    (2) 2字节的data length,block里写入了多少字节数据
    (3) 2字节的first record group,每个事务都会有多个redo log,组成一个redo log group,即一组redo log,这个block里第一组redo log的
    偏移量就是这2字节存储的
    (4) 4字节的checkpoint on
    每个redo log都会写入到文件里的一个redo log block里,一个block最多放496字节的redo 日志
    31.png

    (4)一个个的redo log block在日志文件中是怎么存放的?一条条的redo log是如何写入日志文件的redo log block里的?
    当要写入第一个redo log,应该先在内存里把这个redo log加入到redo log block数据结构里去,然后等内存里的redo log block的512字节都满了,再一次性把这个redo log block写入磁盘文件,此时redo log文件就多了一个block。
    32.png 33.png

    (5)依次在磁盘文件的末尾追加不停的写字节数据,就是磁盘顺序写
    但是假设现在磁盘文件里已经有很多的redo log block了, 此时要在磁盘里某个随机位置找到一个redo log block去修改里面的几个字节的数据,这就是磁盘随机写了。一般情况下是 顺序写的,少数情况是 随机写

    问题1:redo log block 是必须装满512个字节才写入文件吗?
    : 不是的,事务提交时对应的redo log buffer 中的所有相关的redo log block都会刷入os cache 或者磁盘,根据 innodb_flush_log_at_trx_commit

    问题2:为什么会发生redo log block的修改?不应该是一直追加写入的嘛?
    :一般都是追加写入的

    知识点:redo log block是在redo log buffer 里划分好的,mysql启动就有了,在内存里写 redo log 就是进入 redo log block