8.0 新特性-Redo 配置的变化
说明
本篇文章将介绍 MySQL Redo 日志的作用,及需要关注的参数,在 5.7、8.0 Redo 的变化。
1. Redo 日志介绍
1.1. Redo 有什么作用
为了取得更好的读写性能,InnoDB 会将数据缓存在内存中(InnoDB Buffer Pool)对磁盘数据的修改也会落后于内存,这时如果进程或机器崩溃,会导致内存数据丢失,为了保证数据库本身的一致性和持久性,InnoDB 维护了 REDO LOG。
修改 Page 之前需要先将修改的内容记录到 REDO 中,并保证 REDO LOG 早于对应的 Page 落盘,也就是常说的 WAL(Write Ahead Log)日志优先写,Redo Log 的写入是顺序 IO,可以获得更高的 IOPS 从而提升数据库的性能。
当故障发生导致内存数据丢失后,InnoDB 会在重启时,通过重放 REDO,将 Page 恢复到崩溃前的状态。
1.2. Redo 大小区别
使用日志可以提升数据库的性能,那对于数据库来讲,还有什么因素会影响数据库的性能呢?那就是 Redo 日志文件的空间大小。
Redo 日志文件的容量是固定的,它是循环使用的,如果不够用了,就会引发一个 checkpoint 刷脏页的操作,让最小有效的 LSN 向前推,让出一部分空间给新产生的日志来使用。也就是说,只要日志空间未用完,Buffer Pool 中的脏页可以不用刷到磁盘(其它刷盘时机先不谈,单指因日志空间不够引起的刷盘)任务的修改都是在内存中,速度非常可观。
但也不是越大越好,如果 Redo 设置的很大,性能固然会很好,但如果数据库异常宕机了,此时有很多的日志都没有刷盘,恢复起来可能需要更长的时间。
所以,Redo 日志容量大小的设置,最好与 Buffer Pool 的大小相匹配。如果日志容量过小,Buffer Pool 设置的很大,就会频繁的触发 Buffer Pool 的 checkpoint 操作,大的 Buffer Pool 并不能被有效利用。
下方是官方给出的建议:
Buffer Pool Size | Log File Size |
Less than 8GB | 512MB |
8GB to 128GB | 1024MB |
Greater than 128GB | 2048MB |
Enabling Automatic Configuration for a Dedicated MySQL Server
2. Redo 的配置
2.1. 8.0.30 之前的版本
在 MySQL 8.0.30(也包含 5.7 版本) 版本 Redo 的配置相关的参数主要有下面两个:
innodb_log_files_in_group:Redo 文件的个数,默认为 2。
innodb_log_file_size:Redo 在磁盘上,单个文件的大小。
> du -sh ib_logfile* 128M ib_logfile0 128M ib_logfile1 > cat /etc/my.cnf | grep innodb_log_file_size innodb_log_file_size = 128M
该参数不支持在线修改,如果修改需要重启 MySQL 实例。
2.2. 8.0.30 之后的版本
MySQL 8.0.30 版本发布后提供新参数 innodb_redo_log_capacity 代替之前两个参数,不过原来两个参数并没有取消,会自动计算转换为 innodb_redo_log_capacity 抛出警告:
[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=1073741824. Please use innodb_redo_log_capacity instead.
使用新参数配置,非常简单,直接写大小即可,且支持在线修改:
>>> select @@innodb_redo_log_capacity; +----------------------------+ | @@innodb_redo_log_capacity | +----------------------------+ | 104857600 | +----------------------------+
修改 innodb_redo_log_capacity 为 1G:
set global innodb_redo_log_capacity=1073741824;
innodb_redo_log_capacity 默认为 100MB,如果容量不够,在 MySQL 的错误日志中会有下面的提示:
[Warning] [MY-013865] [InnoDB] Redo log writer is waiting for a new redo log file. Consider increasing innodb_redo_log_capacity.
可使用下方参数设置 Redo 文件存储的目录:
select @@innodb_log_group_home_dir;
磁盘中的文件不在是 ib_logfile0 而是会创建一个 #innodb_redo 文件夹,里面按照 #ib_redo* 的形式存储。
新增 innodb_redo_log_files 表,可以观测 Redo 文件 LSN 区间等信息:
select * from performance_schema.innodb_redo_log_files;