MySQL源码学习:关于InnoDB ib_logfile的 “顺序写”

同事问起线上的"诡异"现象:已经在使用ib_logfile2,但ib_logfile0的更新时间也在改变,不是说是顺序更新的?

 

1、              ib_logfiles文件及作用

大家都知道这个是InnoDBredolog。关于redolog的写入策略部分,可以看我之前的这个文章(链接)。

这个系列文件个数由参数innodb_log_files_in_group控制,若设置为4,则命名为ib_logfile0~3

很多文章都指出这些文件的写入是顺序、循环写的,logfile0写完从logfile1继续,logfile3写完则logfile0继续。

 

      ib_logfiles的作用,主要是在系统崩溃重启时,作事务重做的。而在系统正常时,每次checkpoint时间点,会将之前写入的事务应用到数据文件中。因此有一个问题:系统重启之后,怎么知道checkpoint做到哪儿了?

2、              Ib_logfilecheckpoint field

实际上不仅要记录checkpoint做到哪儿(LOG_CHECKPOINT_LSN),还要记录用到了哪个位置(LOG_CHECKPOINT_OFFSET)等其他信息。所以在ib_logfile0的头部预留了空间,用于记录这些信息。

因此即使使用后面的logfile,每次checkpoint完成后,ib_logfile0都是要更新的。同时你会发现所谓的顺序写盘,也并不是绝对的:)

 

3、              相关的一些数字

    a)  InnoDB留了两个checkpoint filed,按照注释的解释,目的是为了能够“write alternately

    b)  每个checkpint field需要的大小空间为304字节。(相关定义在log0log.h)

    c)  第一个checkpoint的起始位置在ib_logfile0的第512字节(OS_FILE_LOG_BLOCK_SIZE)处;

   d) 第二个在1536 (3 * OS_FILE_LOG_BLOCK_SIZE)字节处。

你可能感兴趣的:(mysql,ib_logfile,顺序写)