在前面的文章里面也大致讲过redolog
,小伙伴们可以先回顾下
-
MySQL执行过程 -
InnoDB的buffer pool缓冲池
一、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整体刷入磁盘。
它具体进行入盘的时机有这么几个
-
当缓存内容大于全部空间一半的时候(默认大小16MB,一半就是MB) -
后台有个线程定时每秒刷入磁盘 -
每个事物提交的时候 -
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):MySQL日志之redo log详解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/41342.html