MySQL8.0.30在线调整redo
- 概念描述
- 测试验证
- 总结
概念描述
redo log 包括两部分:一部分是在内存中的日志缓冲redo log buffer,另一部分是在磁盘上的物理日志文件redo log file。MySQL每执行一次DML操作都会先将记录写入redo log buffer中然后某个时间点再将记录刷到redo log file中,保证了事务的持久性,即只要事务提交成功,那对数据库做的修改就会被永久保存下来。
MySQL最新版本 8.0.30 的发布带来一个与redo日志文件有关的新功能点:在线调整redo日志文件的大小。
测试验证
在8.0.30版本之前,修改redo日志文件大小的步骤比较复杂,如下:
-
控制redo log文件的传统参数有两个,其最终大小是这两个参数值相乘。
(1)innodb_log_files_in_group:redo日志磁盘上的文件个数,默认为2.
(2)innodb_log_file_size:redo日志磁盘上单个文件的大小,默认为48MB。
-
设置innodb_fast_shutdown=0以确保Innodb刷新所有脏页到磁盘
-
停掉MySQL实例
-
删掉数据目录下的旧redo日志文件:
-
去配置文件my.cnf中修改参数,例如将innodb_log_file_size改为1G,innodb_log_files_in_group改为5:
-
启动MySQL实例
-
查看新的数据文件大小:
8.0.30之后,更改redo日志大小:
最新版本 MySQL8.0.30发布后,使用新参数innodb_redo_log_capacity来代替之前的两个参数(目前设置这两个参数依然有效)。使用新参数调整大小非常简单,直接设置为要调整的值就行。
在调整之前,该参数默认值大小为100MB:
该参数会在数据目录下生成’#innodb_redo’的子目录,磁盘文件的存储形式不再是类似 ib_logfileN 这样的文件,而是替代为 #ib_redoN 这样新文件形式。这些新的文件默认存储在’#innodb_redo’ 里。这样的文件一共有32个,按照参数 innodb_redo_log_capacity 来平均分配。
redo日志文件中不带有_tmp后缀的说明是正在使用的日志文件,带有_tmp后缀的是等正在使用的文件写满后再写它。
-
调整innodb_redo_log_capacity=6G
-
查看调整后的值大小
新增对应的状态变量innodb_redo_log_capacity_resized,方便在 MySQL 侧监控当前redo日志文件大小:
同时 performance_schema 库里新增表innodb_redo_log_files:获取当前使用的redo日志文件 LSN 区间、实际写入大小、是否已满等统计数据。
总结
- redo log的大小是固定的。
- redo log是Innodb引擎层实现的,并不是所有引擎都有。
- redo log采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。
- redo log适用于崩溃恢复(crash-safe)。