揭秘redo log buffer

执行完增删改之后,要写入磁盘的redo log,其实应该是先进入到redo log block这个数据结构里去的,然后再进入到磁盘文件里,如下图所示:在这里插入图片描述
redo log到底是如何通过内存缓冲之后,再进入磁盘文件里去的,这就涉及到了一个新的组件,redo log buffer,它就是MySQL专门设计了用来缓冲redo log写入的。redo log buffer其实就是MySQL在启动的时候,就跟操作系统申请的一块连续内存空间,大概可以认为相当于是buffer pool吧。那个buffer pool是申请之后划分了N多个空的缓存页和一些链表结构,把磁盘上的数据页加载到内存里来的。

redo log buffer也是类似的,它是申请出来的一片连续内存,然后里面划分出了N多个空的redo log block,如下图所示:
在这里插入图片描述
通过设置mysql的innodb_log_buffer_size可以指定这个redo log buffer的大小,默认的值就是16MB,其实已经够大了,毕竟一个redo log block才512字节而已,每一条redo log其实也就几个字节到几十个字节罢了。redo log都是先写入内存里的redo log block数据结构里去的,然后完事儿了才会把redo log block写入到磁盘文件里去的。

要写一条redo log的时候,就会先从第一个redo log block开始写入,如下图:
在这里插入图片描述
写满了一个redo log block,就会继续写下一个redo log block,以此类推,直到所有的redo log block都写满。万一要是redo log buffer里所有的redo log block都写满了,会强制把redo log block刷入到磁盘中去的!

redo log block刷入磁盘文件中的示意,其实就是把512字节的redo log block追加到redo log日志文件里去就可以了。如下图所示:
在这里插入图片描述
平时执行一个事务的过程中,每个事务会有多个增删改操作,那么就会有多个redo log,这多个redo log就是一组redo log,其实每次一组redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log给写入到redo log buffer的block里去的。如果一组redo log实在是太多了,那么就可能会存放在两个redo log block中,如下图所示:
在这里插入图片描述
如果说一个redo log group比较小,那么也可能多个redo log group是在一个redo log block里的,如下图所示:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值