8.0 新特性-Redo 配置的变化

文若2年前技术文章1268

说明

本篇文章将介绍 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;


相关文章

Kubernetes 网络插件

Kubernetes 自身并不提供网络解决方案,允许托管使用第三方的网络解决方案。flannelcalicocanelkube-router......各种 CNI 插件的解决方案: 虚拟网桥(bri...

CDH实操--配置Kerberos服务高可用(一)

CDH实操--配置Kerberos服务高可用(一)

前置条件1.主Kerberos已安装并与CDH集成2.备节点安装Kerberos服务yum -y install krb5-server krb5-libs krb5-auth-dialog krb5...

ES基础知识介绍

ES 核心概念ES 是使用 Java 编写的一种开源搜索引擎,它在内部使用 Lucene 做索引与搜索,通过对 Lucene 的封装,隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RE...

MySQL 8.0 新特性深度解析,成为数据库高手的必备!

MySQL 8.0 新特性深度解析,成为数据库高手的必备!

前言MySQL 5.7 在 2023 年 10 月 31 日起,就已经终止软件生命周期了,意味着 MySQL 官方将不再提供对 MySQL 5.7 版本的技术支持和更新。8.0 版本成为官方长期支持版...

Helm 控制语句

Helm 控制结构(在模板语言中称为 "actions")提供给你和模板作者控制模板迭代流的能力。 Helm 的模板语言提供了以下控制结构:if/else,用来创建条件语句with,用来指定范围ran...

SQL Server优化入门系列(二)—— 等待事件

SQL Server优化入门系列(二)—— 等待事件

在上一篇文章中(SQL Server优化入门系列(一)——快速定位阻塞SQL),我们介绍了如何快速定位SQL Server中当前正在执行的SQL,以及被阻塞的SQL。这里,我们将介绍如何通过等待事件来...

发表评论    

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