代码改变世界

【MySQL】MySQL8动态调整redo日志的大小

2022-08-12 16:04  abce  阅读(1175)  评论(0编辑  收藏  举报

MySQL8.0.30引入了一个新特性:动态调整redo日志的大小。

除了InnoDB的buffer pool大小,我们通常会觉得设置合适的redo文件大小对MySQL的性能至关重要。MySQL在5.7中就实现了动态调整buffer pool的大小,但是直到现在8.0.30才实现了动态调整redo文件的大小。

mysql> SET GLOBAL innodb_redo_log_capacity = 2*1024*1024*1024;

为了让修改生效,现在,redo日志文件位于datadir下的一个新的目录:#innodb_redo

可以使用参数innodb_log_group_home_dir设置redo日志文件的路径。

有两种类型的redo日志文件:ordinary类型、spare类型。ordinary类型的redo日志文件是指被使用的redo日志文件;spare类型的redo日志文件是指等待被使用的redo日志文件。InnoDB维护了32个redo日志文件,每个文件的大小是1/32 * innodb_redo_log_capacity。

redo日志文件的命名规则是:#ib_redoN,这里的N是日志文件号。spare类型的redo日志文件会加上一个_tmp后缀。例如:

$ ls
#ib_redo31  #ib_redo33 #ib_redo35  #ib_redo37 #ib_redo39  #ib_redo41 #ib_redo43  #ib_redo45 #ib_redo47  #ib_redo49_tmp  #ib_redo51_tmp  #ib_redo53_tmp  #ib_redo55_tmp  #ib_redo57_tmp  #ib_redo59_tmp  #ib_redo61_tmp
#ib_redo32  #ib_redo34 #ib_redo36  #ib_redo38 #ib_redo40  #ib_redo42 #ib_redo44  #ib_redo46 #ib_redo48  #ib_redo50_tmp  #ib_redo52_tmp  #ib_redo54_tmp  #ib_redo56_tmp  #ib_redo58_tmp  #ib_redo60_tmp  #ib_redo62_tmp

 

为了监控redo日志文件的状态和大小,增加了一些状态变量。例如:

mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_resize_status';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_redo_log_resize_status | OK   |
+-------------------------------+-------+
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_capacity_resized';
+----------------------------------+------------+
| Variable_name                   | Value     |
+----------------------------------+------------+
| Innodb_redo_log_capacity_resized | 3221225472 |
+----------------------------------+------------+

 

其他的状态变量:

Innodb_redo_log_checkpoint_lsn
Innodb_redo_log_current_lsn
Innodb_redo_log_flushed_to_disk_lsn
Innodb_redo_log_logical_size
Innodb_redo_log_physical_size
Innodb_redo_log_read_only
Innodb_redo_log_uuid

 

估算redo日志文件的容量

mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn'; SELECT SLEEP(60); SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn';

根据上面的执行结果进行估算:

mysql > SELECT ABS(20641693317 - 20903377487) / 1024 / 1024 AS MB_per_min;
+--------------+
| MB_per_min   |
+--------------+
| 249.56147194 |
+--------------+
1 row in set (0.00 sec)

大概是250MB/min,根据该结果,最好是将redo日志容量设置成250*60(1小时),即15GB。

 

过期的参数

·innodb_log_files_in_group
·innodb_log_file_size

如果尝试在my.cnf文件中设置该过期参数,设置会被忽略,并会在错误日志中打印警告信息:

2022-08-07T20:23:39.898370Z 0 [Warning] [MY-013869] [InnoDB] Ignored deprecated configuration parameter innodb_log_file_size. Used innodb_redo_log_capacity instead.
2022-08-07T20:23:39.898441Z 0 [Warning] [MY-013870] [InnoDB] Ignored deprecated configuration parameter innodb_log_files_in_group. Used innodb_redo_log_capacity instead.