专栏首页DBA随笔​redo log的被动刷盘机制

​redo log的被动刷盘机制

在MySQL事务执行的过程中,innodb引擎会产生redo log,我们知道,MySQL的事务提交是两阶段提交的,画图如下:

通常来讲,redo log刷盘的时机是在事务提交的commit阶段采取刷盘的,在此之前,redo log都存在于redo log buffer这块指定的内存区域中。

这里我们首先要明确两个概念和两个参数:

write:刷盘

fsync:持久化到磁盘

write(刷盘)指的是MySQL从buffer pool中将内容写到系统的page cache中,并没有持久化到系统磁盘上。这个速度其实是很快的。

fsync指的是从系统的cache中将数据持久化到系统磁盘上。这个速度可以认为比较慢,而且也是IOPS升高的真正原因。

参数:

innodb_flush_logs_at_trx_commit(该参数针对redo log)

取值0:每次提交事务都只把redo log留在redo log buffer中

取值1:每次提交事务都将redo log 持久化到磁盘上,也就是write+fsync

取值2:每次都把redo log写到系统的page cache中,也就是只write,不fsync

sync_binlog(改参数针对binlog)

取值0:每次提交都将binlog 从binlog cache中 write到磁盘上,而不fsync到磁盘

取值1:每次提交事务都将binlog fsync到磁盘上

取值N:每次提交事务都将binlog write到磁盘上,累计N个事务之后,执行fsync

但是,在某些特定场景下,redo log会在commit这个动作到来之前进行刷盘操作,例如下面的两种情况会让没有提交的事务的redo log写入磁盘:

1、redo log buffer占用的空间即将达到buffer pool的一般的时候,后台线程会主动刷盘,这个时候,由于事务没有提交,所以仅仅是将redo log buffer中的内容通过write的方法写入到系统的cache中,没有进行fsync的持久化动作。

2、并行提交事务的时候,会顺带将上一个事务的部分redo log从redo log buffer中fsync到磁盘上,例如下面的例子:

假设redo log buffer中的内容如下(假设每个事务的redo log有4部分):

redo log B1

redo log A1

redo log B2

redo log B3

redo log B4

此时,事务B发生了commit操作,而设置的innodb_flush_logs_at_trx_commit的值是1,那么会触发事务B的redo log持久化到磁盘。此时事务A的一部分redo log,也就是redo log A1会被顺带着持久化fsync到磁盘中。

这里还需要说明一点,因为MySQL的innodb存储引擎时需要支持崩溃恢复的,依赖prepare阶段的redo log ,所以,如果innodb_flush_logs_at_trx_commit的值是1,MySQL会在redo log的prepare阶段就进行一次持久化redo log的fsync操作。这个fsync的存在,再加上每秒一次的后台刷盘操作,innodb会认为redo log在commit的时候,就不需要fsync了,只write到文件系统的page cache就够了。

所以,真正的两阶段提交,应该是下面这个样子:

之所以redo log的write和fsync没有连接在一起,其实是考虑到了组提交的功能,分开来进行这两个步骤,在并发的场景下,可以让这一组一次性提交的redo log更多一点,从而一次性fsync更多的组员。

最后,回答一个问题,我们知道innodb采用了WAL技术(先写log,再写磁盘)来减少磁盘写。但是我们上面的分析过程不难看出,在事务提交的过程中,redo log prepare阶段会进行一次fsync磁盘,binlog 阶段也会fsync一次磁盘,这似乎并没有减少与磁盘的交互,MySQL这样设计的意义是什么?

其实这样的目的有两个:

其一:redo log和binlog都是顺序写,顺序写比数据页的随机写节约时间,性能更高

其二:组提交机制使得我们不用每个事务都进行写磁盘操作,而是将多个写操作放在一个组里面,这样可以大幅度降低磁盘的IOPS

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:DBA随笔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试官的灵魂一击:你懂 MySQL 事务日志吗?

    大家都清楚,日志是 MySQL 数据库的重要组成部分,记录着数据库运行期间各种状态信息。MySQL 日志主要包括「错误日志」、「查询日志」、「慢查询日志」、「二...

    用户6543014
  • mysql三大日志-binlog、redo log和undo log

    日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开...

    AlbertZhang
  • 关于MySQL,这篇都没人赞,太没天理了!

    mysqldump的产出物是一个包含了建表,插入数据的SQL语句集合,类似于这样:

    架构师之路
  • 一文聊透binlog、redo log、undo log

    日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。

    用户8639654
  • 必须了解的mysql三大日志-binlog、redo log和undo log

    来自:https://juejin.im/post/6860252224930070536

    用户6543014
  • MySQL日志15连问

    大家好,我是田螺哥。金九银十已经来了,整理了15道经典MySQL日志面试题,希望对大家有帮助。

    捡田螺的小男孩
  • MySQL InnoDB Update和Crash Recovery流程

    1、首先介绍了Redo,Undo,Log Sequence Number (LSN),Checkpoint,Rollback Pointer (ROLL_PTR...

    沃趣科技
  • MySQL不会丢失数据的秘密,就藏在它的 7种日志里

    记住! 记住! 记住! 上边这张图,她是MySQL更新数据的基础流程,其中包括redo log、bin log、undo log三种日志间的大致关系,好了闲话少...

    程序员内点事
  • MySQL不会丢失数据的秘密,就藏在它的 7种日志里

    记住! 记住! 记住! 上边这张图,她是MySQL更新数据的基础流程,其中包括redo log、bin log、undo log三种日志间的大致关系,好了闲话少...

    程序员内点事
  • MySQL不会丢失数据的秘密,就藏在它的 7种日志里

    记住! 记住! 记住! 上边这张图,她是MySQL更新数据的基础流程,其中包括redo log、bin log、undo log三种日志间的大致关系,好了闲话少...

    Java宝典
  • 一文搞懂回滚和持久化

    这里面有几个关键的点:redo log是什么?为什么需要redo log?prepare状态的redo log是什么?redo log和binlog是否可以只选...

    用户8851537
  • 【图文详解】MySQL系列之redo log、undo log和binlog详解

    这篇文章主要介绍了MySQL系列之redo log、undo log和binlog详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    一个会写诗的程序员
  • 详细分析 MySQL 事务日志(redo log 和 undo log)

    InnoDB 事务日志包括redo log和undo log,其中redo log是重做日志,提供前滚操作;undo log是回滚日志,提供回滚操作。undo ...

    CG国斌
  • 初探Mysql架构和InnoDB存储引擎

    4.更新操作为什么不直接更新磁盘反而设计这样⼀个复杂的InnoDB存储引擎来完成?

    HUC思梦
  • 深入学习MySQL 02 日志系统:bin log,redo log,undo log

    上一篇文章中,我们了解了一条查询语句的执行过程,按理说这篇应该讲一条更新语句的执行过程,但这个过程比较复杂,涉及到了好几个日志与事物,所以先梳理一下3个重要的日...

    KEN DO EVERTHING
  • [图解MySQL]MySQL组提交(group commit)

    Redo log的刷盘操作将会是最终影响MySQL TPS的瓶颈所在。为了缓解这一问题,MySQL使用了组提交,将多个刷盘操作合并成一个,如果说10个事务依次排...

    田帅萌
  • 图解MySQL | [原理解析] MySQL组提交(group commit)

    本文是由爱可生研发团队出品的「图解MySQL」系列文章,不定期更新,但篇篇精品。欢迎大家持续关注~

    用户1278550
  • MySQL是如何保证不丢数据的(一)

    数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进。

    MySQL数据库技术栈
  • MySQL 日志(redo log 和 undo log) 都是什么鬼?

    innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。

    Java技术栈

扫码关注云+社区

领取腾讯云代金券