概念
硬盘上存储的 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 = 64docker 启动一个 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 日志文件组与检查点工作机制。