首页 > 数据库DBA > mysql >

MYSQL的redo log buffer

作者: 初见博客 分类: mysql 发布时间: 2021-07-13 17:44

执行完增删改之后,要写入磁盘的redo log,其实应该是先进入到redo log block这个数据结构里去的,然后再进入到磁盘文件里,如下图所示:

20201216144528946

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

redo log buffer也是类似的,它是申请出来的一片连续内存,然后里面划分出了N多个空的redo log block,如下图所示:

20201216144742262

通过设置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开始写入,如下图:

2020121614514097

写满了一个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日志文件里去就可以了。如下图所示:

20201216145527675

平时执行一个事务的过程中,每个事务会有多个增删改操作,那么就会有多个redo log,这多个redo log就是一组redo log,其实每次一组redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log给写入到redo log buffer的block里去的。如果一组redo log实在是太多了,那么就可能会存放在两个redo log block中,如下图所示:

20201216145840472

如果说一个redo log group比较小,那么也可能多个redo log group是在一个redo log block里的,如下图所示:

20201216145953641

————————————————
版权声明:本文为CSDN博主「Mr’Sui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37286668/article/details/111273956

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注