8.0 新特性-Redo 配置的变化

文若2年前技术文章1175

说明

本篇文章将介绍 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 的配置相关的参数主要有下面两个:

  1. innodb_log_files_in_group:Redo 文件的个数,默认为 2。

  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;


相关文章

cattle-cluster-agent产生的僵尸进程处理

cattle-cluster-agent产生的僵尸进程处理

现象zabbix告警服务器存在僵尸进程排查步骤1、登陆服务器使用top命令,确认下僵尸进程数量。2、使用ps -aux | grep Z命令,过滤出僵尸进程PID。3、根据查到的PID,借助ps命令,...

Hbase部署

安装前准备1.1. 设置环境变量所有hbase节点都要做vi /etc/profile export HBASE_HOME=/opt/hbaseexport PATH=$PATH:$HBASE_HOM...

dolphinscheduler单机部署

dolphinscheduler单机部署

官网链接:https://dolphinscheduler.apache.org本次测试版本为:https://dolphinscheduler.apache.org/zh-cn/download/3...

MySQL运维实战(4.4) SQL_MODE之STRICT_TRANS_TABLES和STRICT_ALL_TABLES

如果设置STRICT模式,则如果数据写入时,如果数据不符合字段定义(字符串超出长度、数值类型数据超出范围、违反not null约束等),SQL会报错。如果不设置STRICT模式,会对异常数据进行截断处...

Kubernetes网络模型与CNI网络插件

Kubernetes网络模型与CNI网络插件

在 Flannel 的网络插件中,容器跨主机网络的两种实现方法:UDP 和 VXLAN。它们有一个共性,就是用户的容器都连接在 docker0 网桥上。而网络插件则在宿主机上创建了一个特殊的设备(UD...

kubebuilder 开发operator初探

1、使用kubebuilder初始化$ mkdir project$ cd project$ kubebuilder init --domain tutorial.kubebuilder.io --r...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。