https://www.bilibili.com/video/BV11Z4y1X7Kg


在前面的文章里面也大致讲过redolog,小伙伴们可以先回顾下


一、redolog的概念

1-1、redolog的作用

MySQL在innodb引擎下,所做的增删改查都是先去buffer pool缓冲池(内存区域)里面操作,再通过种种情况去进行入盘(数据存入磁盘),因为增删改都是在内存操作,这样就存在系统异常导致数据丢失的情况,redolog就是为了解决系统异常导致内存修改丢失的问题


1-2、redolog如何保证数据不丢失

所有的操作都是以事物为单位的,在事物未执行完毕的时候数据库异常导致数据丢失是正常的,因为事物未提交成功。

在事物提交的时候,我们把redolog从内存刷入到磁盘中去,从而保证修改不丢失,如果入盘失败,那事物也将提交失败


1-3、既然总是要落盘?为什么不直接把修改更新到磁盘?

可能很多小伙伴和最初的我有一样的疑问,在提交事物的时候为什么不直接把我们的修改刷入磁盘,而是先去把redolog刷入磁盘呢?

之所以innodb在操作的时候要先去操作内存,而不是直接操作磁盘目的只有一个提高性能、提升速度

虽然redolog落盘的时候也是入磁盘,但它是顺序写入,而直接对磁盘上数据修改是随机写入,顺序写的速度要远远快于随机写。

看过之前文章的朋友应该知道,把数据从磁盘读入到内存它不是一条条数据读取,而是一页页(每页16k)的读取。一般一个事物操作的数据远远要小于这个16k。


1-4、redolog数据是如何存储的呢?

所有的入盘操作最后都会转成二进制,这个并不重要,你可以把redolog磁盘空间理解成下面这个图,带颜色的区域就是存储数据区域

在这里插入图片描述
如你所见,redolog存储空间就像一个圆,从头开始存储,存储满了就开始覆盖之前的数据。

当然实际上它不是一个圆,也是一块磁盘空间,当存储满了的时候就会覆盖之前的,所以用圆来形容它很贴切。


其实我觉得只需要了解上面这些就差不多的,但为了文章的完整性,下面对于redolog的存储进一步讲解。

一个事物里面大概率是有多个操作的,看过之前文章的小伙伴也知道,只有当事物提交的时候才会对redolog入盘操作,那在事物提交之前数据如何存储呢?

毫无疑问在这之前数据也是存储在内存中的,这块内存叫做 redolog buffer,可以通过 innodb_log_buffer_size 来进行配置。

innodb_log_buffer_size 的默认大小是16MB
在这里插入图片描述

分配的内存区域并不是一块大的区域,我们不停的去写入,然后刷入磁盘,而是把这块区域划分成了N个小的区域每个小区域512KB大小,取名为 redo log block,每个redo log block 里面还有一些细节,这里就不去讨论了。

之前我们讲buffer pool的时候,说到数据存在磁盘的时候是以16KB大小为一个单位叫数据页,存储到缓存的时候也是以这个大小,叫做缓存页。这个redo log block也是一样的,进行数据入盘的时候就把这个512KB整体刷入磁盘。

它具体进行入盘的时机有这么几个

  1. 当缓存内容大于全部空间一半的时候(默认大小16MB,一半就是MB)
  2. 后台有个线程定时每秒刷入磁盘
  3. 每个事物提交的时候
  4. MySQL关闭的时候

1-5、redolog和binlog的区别

  • redolog是属于innodb引擎,binlog属于mysql
  • redolog会覆盖之前的数据,而binlog会一直增长(可以设置过期时间)
  • redolog是用来防止mysql异常导致修改数据丢失,binlog是用来数据备份和主从节点数据同步的。
  • redolog是物理日志,记录的是“在某个数据页上做了什么修改”(数据页上某个偏移量的值);binlog是逻辑日志,记录的是这个语句的原始逻辑(sql、数据行)

二、redolog配置

2-1、缓存大小

innodb_log_buffer_size

默认大小 16MB


2-2、刷盘策略

innodb_flush_log_at_trx_commit

提交事物写入磁盘中,会根据这个配置的策略进行同步。

  • 0 提交事物的时候不会把redo log buffer 里的数据刷入磁盘
  • 1 提交事物的时候,必须把日志刷入磁盘中,可以严格保证数据不丢失 (默认且推荐策略)
  • 2 提交事物的时候,先把日志刷入磁盘文件对应的 os cache 缓存里,隔一段时间再把数据刷入磁盘

2-3、磁盘目录

 innodb_log_group_home_dir

这个就是配置redolog在磁盘存放位置,如果没有配置,默认在 datadir 配置下(这个datadir也是配置)
在这里插入图片描述

这里有个不知道是不是坑的坑,我在修改了innodb_log_group_home_dir之后,MySQL就启动失败了,找了半天,看日志发现下面的提示

在这里插入图片描述

2-4、文件个数

innodb_log_files_in_group

默认是2,命名规则 ib_logfilex

在这里插入图片描述



如果对你有帮助的话,可以关注我的微信公众号: 小道仙97

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐