谈谈传说中的redo log是什么?有啥用?
白日梦感觉作为研发同学的你可能真的没必要了解摸清楚关于redo log的这些机制。专注于写SQL完全能hold住日常的工作。
但是呢,感觉最好还是要了解一下,因为一般面试官都知道redo log是咋回事,其次是大家茶前饭后唠嗑时也能多少能插几句嘴。
文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽活动
一、引出 redo log 的作用
继续我们的MySQL专题。首先回顾一下前面白日梦同你分享过的知识点。
前面我们一起学习了MySQL undo log相关的知识点,看下面这张脑图:

磁盘上的数据文件叫表空间文件,表空间有挺多的,比如系统表空间、undo log 表空间、你也可以让create出来的每张table都有自己单独的表空间。总之MySQL会将表空间数据页通过磁盘IO加载进缓存页中。
SQL执行器会执行你发送给MySQL的SQL语句,MySQL为了提高的性能,对于增、删、改这种操作都是在内存中完成的,所谓的内存就是上图中BufferPool。比如上图中的SQL执行器执行了一条update xxx where id = 1语句,然后这个id = 1数据行所在的数据页就会被你修改成脏数据页。
此外MySQL还有专门的后台线程等其他机制负责将脏数据页刷新同步回磁盘。
二、思考一个问题:
你可以结合上图然后想一下:万一脏页还没来得及刷新到磁盘中,MySQL就挂了,怎么办呢?
对于业务代码来说,方才执行的事务是OK的,甚至前端都接受到了请求成功的响应。那结果修改的数据没同步回磁盘,MySQL宕机了会不会导致真实数据和逻辑上的数据不一致呢?
其实不会的!
MySQL使用redo log解决了这个问题,redo故名思义:重做。
当发生事务(增、删、改)时会导致缓存页变成脏页,于此同时MySQL会将事务涉及到的:对 XXX表空间中的XXX数据页XXX偏移量的地方做了XXX更新。
所以MySQL意外宕机重启也没关系。只要在重启时解析redo log中的事务然后重放一遍。将Buffer Pool中的缓存页重做成脏页。后续再在合适的时机将该脏页刷入磁盘即可。
于是对于业务方来说,everything is ok!
redo log侧重于重做!redo log中记录的是物理层面的数据页、偏移量。应对的问题是:MySQL异常宕机后,如何将没来得及提交的事物数据重做出来。
而后面文章中和大家分享的bin log中记录了你对XXX表条件为XXX处的数据作了什么修改,这是些都是逻辑上的概念。
三、redo log block
首先你得知道,redo并不是一条条直接写入磁盘中去的!
在MySQL的设定中,redolog是按块,一块一块的写入到磁盘中去的。
你可以类比一下数据是按页为单位来组织的,就更容易理解为啥redo log 要按照block来组织redo。
本质上就是两个字:优化
log block长成下面这这样:分成Header、Body、Trailer三部分 总共512字节。而且是覆盖写入。

我粗略解读一下这幅脑图。
首先既然MySQL会写redo log,说明你的sql会对缓存页造成修改,也就意味着会走MySQL设定的事物那一套机制。既然是MySQL事物,大概率就是一组增、删、改。如果每个增、删、改都会有一个对应的redo log的话,那也就是说你的事物会产生好多redolog。这些redo会先被持续不断的写入到log block中,同一个事物产生的redo log会被标记为一个redo log group。
四、redo log buffer
了解redo log block之后,白日梦还要跟你介绍一下 redo log buffer。
这个redo log buffer 中会划分出多个rodo log block。redo log buffer 占用一块连续的内存空间,默认大小16MB。且MySQL允许我们通过参数innodb_log_buffer_size动态的调整它。增大它的大小可以让MySQL处理大事物是不必写入磁盘。进而提升写IO性能。
引入rodo log buffer之后,就可以勾勒出这样一副脑图。

如图,产生的redo log 先写入redo log block。然后redo log block其实就在redo log buffer 中。
看到这里不知道你有没有想到这样一个问题:redo log buffer再怎么神奇毕竟也是仅仅在内存中,此时万一MySQL宕机了怎么办?redolog-buffer中的数据丢失了怎么办?毕竟没有写到磁盘上,MySQL重启后100%没办法将其恢复出来。
其实你并不用担心这种情况!
因为在MySQL的设定中,当你要Commit事务时,redolog才会持久化进磁盘,既然你没有commit,碰巧MySQL又宕机了。那让MySQL正常重启就好了啊,反正你没有commit,MySQL也也没有必要帮你恢复什么。
那 redo log buffer 何时写入磁盘呢?
- 事物提交时把它对应的那些redo log写入到磁盘中去(这个动作可由相关参数控制,下文会说)
- 当redo log buffer 使用量达到了参数
innndb_log_buffer_size的一半时,会触发落盘。 - 会有一个后台线程,每隔1秒就会将redo log block刷新到磁盘文件中去。
- MySQL关闭时也会将其落盘。
五、redo log的刷盘时机
承接上面描述的场景:事务提交时,率先将redo log持久化进磁盘。
那你如何控制MySQL,让MySQL在Commit事务时率先将redo log持久化呢?
MySQL提供了参数innodb_flush_log_at_trx_commit
该参数有几个选项:0、1、2
想要保证ACID四大特性推荐设置为1:表示当你commit时,MySQL必须将rodolog-buffer中的数据刷新进磁盘中。确保只要commit是成功的,磁盘上就得有对应的rodolog日志。这也是最安全的情况。
设置为0:每秒写一次日志并将其刷新到磁盘。
设置为2:表示当你commit时,将redolog-buffer中的数据刷新进OS Cache中,然后依托于操作系统每秒刷新一次的机制将数据同步到磁盘中,也存在丢失的风险。
六、推荐参数
始终设置 innodb_flush_log_at_trx_commit=1
如果启用了二进制日志记录,请设置
sync_binlog=1。
这也是大家常说的双1设置。前者保证redolog的不丢失、后者保证了binlog的不丢失。
关于sync_binlog参数,计划在第X、X、篇文章中分享binlog知识点的时候会再提及,欢迎关注!
七、redo log group
redo log group说的是:由N个大小相同的redo log组成一个redo log group。N的值默认为2。
你可以像下面这样查看你的MySQL的redo log group情况。
默认单个redo log文件的大小是48MB。你也可以通过上图中的innndb_log_files_size修改它。
日志文件的总大小(innodb_log_file_size* innodb_log_files_in_group)不能超过略小于512GB的最大值。
例如,一对255 GB的日志文件已达到限制,但没有超过该限制。

同样你可以像下面这样查看磁盘上的 redo log 文件。它们的大小和上图中的innodb_log_file_size相同。

innodb将log buffer中的redo log block刷新到上图中的logfile中时,以追加的方式循环写入。也就是首先在ib_logfile0的尾部追加,写满后再写ib_logfile1。当ib_logfile1写满时,情况一部分ib_logfile0接着追加写。
redo log file的大小对innodb性能影响非常大。通常来说要设置的足够大,大到可以让MySQL支持1小时线上高峰流量的接入而不切换。但是设置的过大,数据恢复的时间比较长。设置过小导致循环切换redo log file。
能聊聊:日志刷盘规则之 check point 和 LSN机制吗?
参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html
https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-unexpected-replica-halt.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit
https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
推荐阅读
- 大家常说的基数是什么?(已发布)
- 讲讲什么是慢查!如何监控?如何排查?(已发布)
- 对NotNull字段插入Null值有啥现象?(已发布)
- 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
- 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
- 你知道数据库缓冲池中的LRU-List吗?(已发布)
- 谈谈数据库缓冲池中的Free-List?(已发布)
- 谈谈数据库缓冲池中的Flush-List?(已发布)
- 了解脏页刷回磁盘的时机吗?(已发布)
- 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
- 听说过表空间没?什么是表空间?什么是数据表?(已发布)
- 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
- 谈谈MySQL的行记录是什么?长啥样?(已发布)
- 了解MySQL的行溢出机制吗?(已发布)
- 说说fsync这个系统调用吧! (已发布)
- 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
- 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽活动

谈谈传说中的redo log是什么?有啥用?的更多相关文章
- [转]undo log与redo log原理分析
数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,这里主要是原子性和持久性,即事务相关的操作,要么全做,要么不做,并且修改的数据能得 ...
- Oracle Redo Log 机制 小结(转载)
Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...
- 关于MySQL redo log,挖些坑,慢慢填
1. 为什么可以设置为多个redo log ? (innodb_log_files_in_group,默认值和推荐值都是2,我们线上设的统一为4): 2. 什么条件下会触发刷脏?除了master_th ...
- Oracle Dataguard Standby Redo Log的两个实验
在Data Guard环境中,Standby Redo Log是一个比较特殊的日志类型.从最新的DG安装指导中,都推荐在Primary和Standby端,都配置Standby Redo Log. 简单 ...
- [置顶] How to dump redo log entry?
1.转储针对特定数据块(4号文件的第10-20号数据块)修改的 redo entry select file#,name,blocks from v$datafile; FILE# NAME ...
- redo log write和flush
http://bbs.chinaunix.net/thread-1753130-1-1.html 在事务提交时innobase会调用ha_innodb.cc 中的innobase_commit,而in ...
- 14.7.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量和大小
14.7.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量和大小 改变 InnoDB ...
- 14.4.4 Redo Log Buffer
14.4.4 Redo Log Buffer redo log buffer 是内存区域持有数据被写入到redo log. Redo log buffer size 是通过 innodb_log_bu ...
- mysql redo log
mysql> show variables like '%innodb_log_file_size%'; +----------------------+-----------+ | Varia ...
随机推荐
- VMware虚拟机 - 如何让鼠标从虚拟机中返回到个人计算机中
最简单的方式 按快捷键:ctrl+alt即可 彻底解决问题的方法:安装VMware Tools 前提条件 开启虚拟机 确认客户机操作系统正在运行 因为 VMware Tools 安装程序是使用 Per ...
- Docker UnicodeEncodeError: 'ascii' codec can't encode characters in position
在容器里查询nova服务的时候字符集报错问题留档及处理方法: 1.在容器里执行nova list --all 提示 [root@stack1 region_01]# nova list --all E ...
- 有名管道FIFO进程间数据传输实例
紧接着上面一个博客的简单介绍,下面进行一个没有血缘关系的进程间通信的实例,实现文件拷贝传输. 有两个进程,一个主要是fifow进程:读文件Makefile内容,写入管道;另一个进程fifor:读管道内 ...
- tomcat设置好环境变量,依然无法通过cmd startup命令启动
Windows环境下JDK安装与环境变量配置详细的图文教程 https://www.cnblogs.com/liuhongfeng/p/4177568.html Windows环境下maven 环 ...
- CSS 背景常用属性
CSS 背景常用属性 background-color 这个属性过于简单, 以下写法均可 background-color:red; background-color:rgb(0,0,255); ba ...
- 如何用思维导图软件MindManager制作项目管理图表
项目管理的官方解释为:运用各种相关技能.方法与工具,为满足或超越项目有关各方对项目的要求与期望,所开展的各种计划.组织.领导.控制等方面的活动. 其实使用MindManager思维导图软件来创建项目管 ...
- MathType中怎么编辑韩文字符
用MathType编辑公式,所涉及到符号与字母一般都是英文字母与数字,或者使用希腊字母,当然还有很多使用中文的情况.但是不仅如此,我们在使用MathType时,除了这些字符之外,还可以输入韩文或者日文 ...
- 简单实用的Boom 3D进阶使用教程分享
对于初学者来说,简单体验Boom 3D的3D环绕音效,就可以通过普通耳机享受到高品质耳机的动人音效.而对于进阶者来说,Boom 3D灵活的预设功能,能让其享受到自由调整均衡器.低音的乐趣. 图1:Bo ...
- 什么是NTFS文件格式
说到磁盘格式,想必大家对于NTFS格式并不陌生.我们使用的u盘等硬盘设备很多都应用了此格式.NTFS文件格式究竟是什么?它都有哪些特点?今天,小编将利用这篇文章为大家进行介绍. 一.什么是NTFS文件 ...
- 下载器Folx的创建种子功能怎么使用
当我们想要分享一些自己制作的资源时,可以使用Folx的创建种子功能,在网络上分享种子,供他人下载,这个过程也被称为做种.作为种子创建者,需要在一定时间内保持做种进程,以便维持种子的生命期限,方便他人下 ...