MySQL redo log 格式解析

本文简单介绍MySQL redo log 文件格式,本文涉及的MySQL 版本为8.0.20。

一、基础知识

1.1 字节序

在具体介绍redo log文件格式之前,先了解一下 InnoDB 数值类型的字节序,InnoDB采用大端字节序存储数值,这个与Binlog使用的小端字节序不同,举个例子,数值0x12345678,占用4个字节,不同的字节序其存储方式如下:

  • 大端字节序:12 34 56 78
  • 小端字节序:78 56 34 12

显然大端字节序更符合人的阅读习惯,然而目前使用广泛的x86架构CPU,比如Intel、AMD,都是小端字节序。

1.2 redo log 相关参数
  • innodb_log_files_in_group,redo log文件个数,默认值2,取值范围2~100。
  • innodb_log_file_size,单个redo log文件大小,默认值为48M,最小值4M,最大值为512G/innodb_log_files_in_group
  • innodb_log_buffer_size,redo log 内存缓存大小,默认值16M。
  • innodb_log_write_ahead_size,定义了预写入的大小,默认值8KB,最小值512B,最大值与页大小相同。
  • innodb_log_checksums,是否为redo log启用checksum校验。

二、redo log格式

2.1 redo log 整体格式

MySQL redo log,默认配置下有两个文件,分别是ib_logfile0和ib_logfile1,这两个文件有完全相同的格式。redo log 文件最小单位是512字节的一个块,每个块的最后4个字节,存储这个块的checksum校验值。redo log 文件前4个块,也就是前2048个字节为文件头,文件头存储了redo log文件元数据信息和checkpoint信息。整体来看redo log文件格式如下:

0 -------------------------------- log file header block 512 --------------------------------- checkpoint block1 1024-------------------------------- 5.7保留,8.0用于加密 1536-------------------------------- checkpoint block2 2048-------------------------------- redo log record ... xxxxx--------------------------------