概念

硬盘上存储的 redo log 日志文件不只一个,而是以一个日志文件组的形式出现的,每个的 redo 日志文件大小都是一样的。
比如可以配置为一组 4 个文件,每个文件的大小是 1GB,整个 redo log 日志文件组可以记录 4G 的内容。

数据结构

它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写。

两个重要属性

  • write pos 是当前记录的位置,一边写一边后移
  • checkpoint 是当前要擦除的位置,也是往后推移

write pos 和 checkpoint 之间的还空着的部分可以用来写入新的 redo log 记录。

如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录,MySQL 得停下来,清空一些记录,把 checkpoint 推进一下。

在 MySQL 8.0.30 之前可以通过 innodb_log_files_in_group 和 innodb_log_file_size 配置日志文件组的文件数和文件大小,但在 MySQL 8.0.30 及之后的版本中,这两个变量已被废弃,即使被指定也是用来计算 innodb_redo_log_capacity 的值。而日志文件组的文件数则固定为 32,文件大小则为 innodb_redo_log_capacity / 32 。

关于这一点变化,我们可以验证一下。

首先创建一个配置文件,里面配置一下 innodb_log_files_in_group 和 innodb_log_file_size 的值:

[mysqld]
innodb_log_file_size = 10485760
innodb_log_files_in_group = 64

docker 启动一个 MySQL 8.0.32 的容器:

docker run -d -p 3312:3309 -e MYSQL_ROOT_PASSWORD=your-password -v /path/to/your/conf:/etc/mysql/conf.d --name
MySQL830 mysql:8.0.32

现在我们来看一下启动日志:

2023-08-03T02:05:11.720357Z 0 [Warning] [MY-013907] [InnoDB] Deprecated configuration parameters innodb_log_file_size and/or innodb_log_files_in_group have been used to compute innodb_redo_log_capacity=671088640. Please use innodb_redo_log_capacity instead.

这里也表明了 innodb_log_files_in_group 和 innodb_log_file_size 这两个变量是用来计算 innodb_redo_log_capacity ,且已经被废弃。

我们再看下日志文件组的文件数是多少:

可以看到刚好是 32 个,并且每个日志文件的大小是 671088640 / 32 = 20971520

所以在使用 MySQL 8.0.30 及之后的版本时,推荐使用 innodb_redo_log_capacity 变量配置日志文件组。

工作机制

Redolog 日志文件组的工作机制见 Redolog 日志文件组与检查点工作机制