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内的情况: