1. 配置重做日志容量配置(>=MySQL 8.0.30)
从MySQL 8.0.30开始,innodb_redo_log_capacity系统变量控制重做日志文件占用的磁盘空间量。您可以在启动时或运行时使用 SET GLOBAL 语句在选项文件中设置此变量;例如,以下语句将重做日志容量设置为8GB:
SET GLOBAL innodb_redo_log_capacity = 8589934592;
在运行时设置时,配置更改会立即生效,但新限制可能需要一些时间才能完全生效。如果重做日志文件占用的空间小于指定值,则脏页会不太积极地从缓冲池刷新到表空间数据文件,最终会增加重做日志文件占用的磁盘空间。如果重做日志文件占用的空间超过指定值,则会更积极地刷新脏页,最终减少重做日志文件占用的磁盘空间。
如果未定义 innodb_redo_log_capacity,并且未定义 innodb_log_file_size 或 innodb_log_files_in_group,则使用默认的 innodb_redo_log_capacity 值。
如果未定义 innodb_redo_log_capacity,并且定义了 innodb_log_file_size和innodb_log_files_in_group其中一个或两个,则 InnoDB 重做日志容量计算为 (innodb_log_files_in_group * innodb_log_file_size)。此计算不会修改未使用的 innodb_redo_log_capacity 设置的值。
Innodb_redo_log_capacity_resized 服务器状态变量指示所有重做日志文件的总重做日志容量。
重做日志文件驻留在数据目录中的 #innodb_redo 目录中,除非 innodb_log_group_home_dir 变量指定了不同的目录。如果定义了 innodb_log_group_home_dir,则重做日志文件驻留在该目录中的 #innodb_redo 目录中。重做日志文件有两种类型:普通重做日志文件和备用重做日志文件。普通重做日志文件是正在使用的文件。备用重做日志文件是那些等待使用的文件。 InnoDB尝试总共维护32个重做日志文件,每个文件的大小等于1/32 * innodb_redo_log_capacity;但是,修改 innodb_redo_log_capacity 设置后,文件大小可能会暂时有所不同。
重做日志文件使用 #ib_redoN 命名约定,其中 N 是重做日志文件编号。备用重做日志文件由 _tmp 后缀表示。以下示例显示了 #innodb_redo 目录中的重做日志文件,其中有 21 个活动重做日志文件和 11 个备用重做日志文件,按顺序编号。
'#ib_redo582' '#ib_redo590' '#ib_redo598' '#ib_redo606_tmp'
'#ib_redo583' '#ib_redo591' '#ib_redo599' '#ib_redo607_tmp'
'#ib_redo584' '#ib_redo592' '#ib_redo600' '#ib_redo608_tmp'
'#ib_redo585' '#ib_redo593' '#ib_redo601' '#ib_redo609_tmp'
'#ib_redo586' '#ib_redo594' '#ib_redo602' '#ib_redo610_tmp'
'#ib_redo587' '#ib_redo595' '#ib_redo603_tmp' '#ib_redo611_tmp'
'#ib_redo588' '#ib_redo596' '#ib_redo604_tmp' '#ib_redo612_tmp'
'#ib_redo589' '#ib_redo597' '#ib_redo605_tmp' '#ib_redo613_tmp'
每个普通重做日志文件都与特定范围的 LSN 值相关联;例如,以下查询显示上一示例中列出的活动重做日志文件的 START_LSN 和 END_LSN 值:
mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
+----------------------------+--------------+--------------+
| FILE_NAME | START_LSN | END_LSN |
+----------------------------+--------------+--------------+
| ./#innodb_redo/#ib_redo582 | 117654982144 | 117658256896 |
| ./#innodb_redo/#ib_redo583 | 117658256896 | 117661531648 |
| ./#innodb_redo/#ib_redo584 | 117661531648 | 117664806400 |
| ./#innodb_redo/#ib_redo585 | 117664806400 | 117668081152 |
| ./#innodb_redo/#ib_redo586 | 117668081152 | 117671355904 |
| ./#innodb_redo/#ib_redo587 | 117671355904 | 117674630656 |
| ./#innodb_redo/#ib_redo588 | 117674630656 | 117677905408 |
| ./#innodb_redo/#ib_redo589 | 117677905408 | 117681180160 |
| ./#innodb_redo/#ib_redo590 | 117681180160 | 117684454912 |
| ./#innodb_redo/#ib_redo591 | 117684454912 | 117687729664 |
| ./#innodb_redo/#ib_redo592 | 117687729664 | 117691004416 |
| ./#innodb_redo/#ib_redo593 | 117691004416 | 117694279168 |
| ./#innodb_redo/#ib_redo594 | 117694279168 | 117697553920 |
| ./#innodb_redo/#ib_redo595 | 117697553920 | 117700828672 |
| ./#innodb_redo/#ib_redo596 | 117700828672 | 117704103424 |
| ./#innodb_redo/#ib_redo597 | 117704103424 | 117707378176 |
| ./#innodb_redo/#ib_redo598 | 117707378176 | 117710652928 |
| ./#innodb_redo/#ib_redo599 | 117710652928 | 117713927680 |
| ./#innodb_redo/#ib_redo600 | 117713927680 | 117717202432 |
| ./#innodb_redo/#ib_redo601 | 117717202432 | 117720477184 |
| ./#innodb_redo/#ib_redo602 | 117720477184 | 117723751936 |
+----------------------------+--------------+--------------+
当执行检查点时,InnoDB 将检查点 LSN 存储在包含该 LSN 的文件的标头中。在恢复期间,将检查所有重做日志文件,并从最新的检查点 LSN 开始恢复。
MySQL提供了几个状态变量用于监视重做日志和重做日志容量调整操作;例如,您可以查询 Innodb_redo_log_resize_status 来查看调整大小操作的状态:
mysql> SHOW STATUS LIKE 'Innodb_redo_log_resize_status';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_redo_log_resize_status | OK |
+-------------------------------+-------+
Innodb_redo_log_capacity_resized 状态变量显示当前重做日志容量限制:
mysql> SHOW STATUS LIKE 'Innodb_redo_log_capacity_resized';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| Innodb_redo_log_capacity_resized | 104857600 |
+----------------------------------+-----------+
其他适用的状态变量包括:
- Innodb_redo_log_checkpoint_lsn
- 重做日志检查点 LSN。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_current_lsn
- 当前LSN表示重做日志缓冲区中最后写入的位置。 InnoDB在请求操作系统将数据写入当前重做日志文件之前,会将数据写入MySQL进程内部的重做日志缓冲区。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_flushed_to_disk_lsn
- 刷新到磁盘的 LSN。 InnoDB首先将数据写入重做日志,然后请求操作系统将数据刷新到磁盘。刷新到磁盘的 LSN 表示 InnoDB 知道已刷新到磁盘的重做日志中的最后一个位置。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_logical_size
- 数据大小值(以字节为单位),表示包含正在使用的重做日志数据的 LSN 范围,范围从重做日志使用者所需的最旧块到最新写入的块。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_physical_size
- 磁盘上所有重做日志文件当前消耗的磁盘空间量(以字节为单位),不包括备用重做日志文件。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_read_only
- 重做日志是否是只读的。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_uuid
- 重做日志 UUID。
- 该变量是在 MySQL 8.0.30 中添加的。
- Innodb_redo_log_resize_status
- 重做日志大小调整状态指示重做日志容量调整机制的当前状态。可能的值包括:
- ok:没有问题,也没有待处理的重做日志容量调整操作。
- Resizing down:正在进行Resizing down操作。
- 调整大小操作是即时生效,因此没有待处理状态。
- 该变量是在 MySQL 8.0.30 中添加的。
- 重做日志大小调整状态指示重做日志容量调整机制的当前状态。可能的值包括:
查看有关活动重做日志文件的信息可以通过查询 innodb_redo_log_files Performance Schema 表。以下查询从表的所有列中检索数据:
SELECT FILE_ID, START_LSN, END_LSN, SIZE_IN_BYTES, IS_FULL, CONSUMER_LEVEL
FROM performance_schema.innodb_redo_log_files;
2. 配置重做日志容量配置(>=MySQL 8.0.30)
在MySQL 8.0.30之前,InnoDB默认在数据目录中创建两个重做日志文件,名为ib_logfile0和ib_logfile1,并以循环方式写入这些文件。
修改重做日志容量需要更改重做日志文件的数量或大小,或同时更改两者。
- 停止 MySQL 服务器并确保其关闭时没有错误。
- 编辑 my.cnf 以更改重做日志文件配置。要更改重做日志文件大小,请配置 innodb_log_file_size。要增加重做日志文件的数量,配置 innodb_log_files_in_group。
- 重新启动MySQL
如果InnoDB检测到innodb_log_file_size与重做日志文件大小不同,它会写入日志检查点,关闭并删除旧的日志文件,按请求的大小创建新的日志文件,然后打开新的日志文件。
3. 自动配置MySQL实例Redo log容量
当使用–innodb-dedicated-server启动服务器时,InnoDB会自动计算并设置某些InnoDB参数的值,包括重做日志容量。自动配置适用于驻留在 MySQL 专用服务器上的 MySQL 实例,其中 MySQL 服务器可以使用所有可用的系统资源。




