代码改变世界

MySQL8中如何估算redo日志的大小

2023-03-12 15:07  abce  阅读(684)  评论(0编辑  收藏  举报

先说公式:

mysql> pager grep sequence; show engine innodb status\G select sleep(60); show engine innodb status\G nopager;

mysql> select (<second_value> - <first_value>) / 1024 / 1024 as MB_per_min;

统计一分钟内生成了多少的redo。

在MySQL 8.0.30之前,redo相关的变量是innodb_log_file_size和innodb_log_files_in_group。缺省情况下,innodb创建两个redo日志文件,以循环的方式写入日志。innodb_log_file_size定义了每个日志文件的大小。

从MySQL 8.0.30开始,优化redo的变量是innodb_redo_log_capacity;一个好消息是该变量可以动态修改!innodb在mysql的数据目录下的#innodb_redo子目录下创建32个文件(每个文件的大小是innodb_redo_log_capacity/32),也可以通过变量innodb_log_group_home_dir指定相应的目录。

 

引入这些新的变量后,该如何估算redo的大小呢?

1.如果配置了innodb_redo_log_capacity,就是该变量设定的值,忽略innodb_log_file_size和innodb_log_files_in_group的设置

2.如果没有设置innodb_redo_log_capacity,但是配置了innodb_log_file_size和innodb_log_files_in_group,mysql就会将innodb_redo_log_capacity默认设置成innodb_log_files_in_group * innodb_log_file_size

3.如果上面三个变量都没有设置,就采用innodb_redo_log_capacity的默认值100MB

 

通常的建议是redo的大小能保存一个小时的日志量。从而避免频发检查点。

 

测试一下公式

mysqlslap来进行测试。不过,这样测试距离真实的应用场景还很远,在有些场景下还是有用的。

$ while true; do mysqlslap --auto-generate-sql -vv --concurrency=100 --iterations=200 --number-char-cols=7 --number-int-cols=10;

mysql> pager grep sequence; show engine innodb status\G select sleep(60); show engine innodb status\G nopager;

Log sequence number          3182015832

Log sequence number          3252604221

mysql> select (3252604221 - 3182015832) / 1024 / 1024 as MB_per_min;

+-------------+
| MB_per_min  |
+-------------+
| 67.31833363 |
+-------------+

以下是多次测量的结果:

mysql> select (3428540758 - 3366312894) / 1024 / 1024 as MB_per_min;
+-------------+
| MB_per_min  |
+-------------+
| 59.34511566 |
+-------------+

mysql> select (3517465187 - 3449605532) / 1024 / 1024 as MB_per_min;
+-------------+
| MB_per_min  |
+-------------+
| 64.71601009 |
+-------------+

 

借助PMM监控来分析redo的生成量

[MySQL]-->[InnoDB Details]-->[InnoDB Logging]

第一个要看的图表是Redo Generation Rate。在上面测试过程中,监控显示生成速度是1.1MB/s。即66MB/min(3.87GB/h)。和上面的公式差不多。

还有另外一个监控图表[InnoDB Log File Usage Hourly]。这里可以看到过去24h内的情况: