redo log的刷盘时机

  • log buffer 空间不足时(大概一半左右)
  • 事务提交时
  • 后台线程不停的刷刷刷(大概每秒刷一次)
  • 正常关闭服务器时
  • 做所谓的 checkpoint

redo日志文件组

磁盘上的 redo 日志文件不只一个,而是以一个 日志文件组 的形式出现的

image-20220302114025504

MySQL 的数据目录(使用 SHOW VARIABLES LIKE 'datadir' 查看)下默认有两个名为 ib_logfile0 和ib_logfile1的文件, log buffer 中的日志默认情况下就是刷新到这两个磁盘文件中。如果我们对默认的redo 日志文件不满意,可以通过下边几个启动参数来调节:

innodb_log_group_home_dir

该参数指定了 redo 日志文件所在的目录,默认值就是当前的数据目录。

innodb_log_file_size

该参数指定了每个 redo 日志文件的大小,在 MySQL 5.7.21 这个版本中的默认值为 48MB

innodb_log_files_in_group

该参数指定 redo 日志文件的个数,默认值为2,最大值为100。

总共的 redo 日志文件大小其实就是: innodb_log_file_size × innodb_log_files_in_group 。

redo日志文件格式

我们前边说过 log buffer 本质上是一片连续的内存空间,被划分成了若干个 512 字节大小的 block 。将logbuffer中的redo日志刷新到磁盘的本质就是把block的镜像写入日志文件中,所以 redo 日志文件其实也是由若干个 512 字节大小的block组成。redo 日志文件组中的每个文件大小都一样,格式也一样,都是由两部分组成:

  • 前2048个字节,也就是前4个block是用来存储一些管理信息的。
  • 从第2048字节往后是用来存储 log buffer 中的block镜像的。

所以每次一开始写都是重ib_logfile的2048字节处开始写

image-20220302115109895

解释ib_logfile的前4个block

image-20220302115350722

log file header

描述redo日志文件的整体信息。

image-20220302115538544

包括以下属性(有印象就好)

属性名 长度(单位:字节) 描述
LOG_HEADER_FORMAT 4 redo 日志的版本,在 MySQL 5.7.21 中该值永远为1
LOG_HEADER_START_LSN 8 标记本 redo 日志文件开始的LSN值,也就是文件偏移量为204字节初对应的LSN值(关于什么是LSN我们稍后再看哈,看不懂的先忽略)。
LOG_HEADER_CREATOR 32 一个字符串,标记本 redo 日志文件的创建者是谁。正常运行时该值为 MySQL 的版本号,比如: "MySQL 5.7.21" ,使用mysqlbackup 命令创建的 redo 日志文件的该值为 "ibbackup" 和创建时间。
LOG_BLOCK_CHECKSUM 4 本block的校验值,所有block都有,我们不关心