8.0 新特性-Redo 配置的变化

文若2年前技术文章1428

说明

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


相关文章

Nginx实现数据库端口转发

一、需求客户想要将IDC服务器的数据库端口暴漏在公网上,然后其他业务来调数据库接口。为了保证安全,只开放指定的公网ip访问。二、逻辑设计由于客户的IDC服务器与云ECS服务器通过专线打通,所以只需要在...

oracle adg容灾切换需要注意的参数

1.DG角色在线转换1.1 角色(主备)和DG有关的角色:primary database 主库,在线服务应用physical standby database 备库,物理备库,在线备份主库数据与主库...

prometheus黑盒监控

prometheus黑盒监控

黑盒监控即以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP探针、TCP探针、Dns、Icmp等用于检测站点、服务的可访问性、服务的连通性,以及访问效率等。prometheus提供了bla...

greenplum安装配置

一、配置服务器安装环境1、修改服务器内核参数(所有节点)编辑sysctl.conf,需要设置共享内存Greenplum数据库使用共享内存在属于同一postgres实例的postgres进程之间进行通信...

Kubernetes日志收集

Kubernetes日志收集

关于容器日志Docker的日志分为两类,一类是Docker引擎日志;另一类是容器日志。引擎日志一般都交给了系统日志,不同的操作系统会放在不同的位置。本文主要介绍容器日志,容器日志可以理解是运行在容器内...

域名购买及备案

域名购买及备案

购买域名域名控制台 -- 域名列表 -- 注册域名注意域名购买时候域名系统中填写的持有者单位名称需与提交审核证件中的单位名称严格完全一致的模板认证中企业/组织相关材料及填写要求可参考此文档https:...

发表评论    

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