目录
5、 redo log buffer中缓冲日志,什么时候可以写入磁盘?
1、redo log含义
redo log里本质上记录的就是在对某个表空间的某个数据页的某个偏移量的地方修改了几个字节的值,具体修改的值是什么,他里面需要记录的就是表空间号+数据页号+偏移量+修改几个字节的值+具体的值。
2、redo log类型
所以根据你修改了数据页里的几个字节的值,redo log就划分为了不同的类型。
- MLOG_1BYTE类型的日志指的就是修改了1个字节的值;
- MLOG_2BYTE类型的日志指的就是修改了2个字节的值,以此类推;
- MLOG_4BYTE类型的日志指的就是修改了4个字节的值的日志类型;
- MLOG_8BYTE类型的日志指的就是修改了8个字节的值的日志类型;
- MLOG_WRITE_STRING,就是代表你一下子在那个数据页的某个偏移量的位置插入或者修改了一大串的值。
3、redo log格式
其实一条redo log看起来大致的结构如下所示:
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,具体修改的数据
- 类型是什么,类型就告诉了你他这次增删改操作修改了多少字节的数据;
- 在哪个表空间里操作的,这个就是跟你SQL在哪个表里执行的是对应的;
- 在这个表空间的哪个数据页里执行的
- 在数据页的哪个偏移量开始执行的
- 具体更新的数据是哪些呢
注意:如果是MLOG_WRITE_STRING类型的日志,因为不知道具体修改了多少字节的数据,所以其实会多一个修改数 据长度,就告诉你他这次修改了多少字节的数据,如下所示他的格式:
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,修改数据长度,具体修改的数据
4、redo log写磁盘过程
4.1、redo log里记录了:
表空间号+数据页号+数据页内偏移量+修改了几个字节的数据+实际修改数据
4.2、redo log block
- 4个字节的block no,就是块唯一编号;
- 2个字节的data length,就是block里写入了多少字节数据;
- 2个字节的first record group。是说每个事务都会有多个redo log,是一个redo log group,即一组redo log。那么在这个block里的第一组redo log的偏移量,就是这2个字节存储的;
- 4个字节的checkpoint on。

其实每一个redo log都是写入到文件里的一个redo log block里去的,一个block最多放496字节的日志。然后redo log block放到redo log中,一个redo log文件包含多个redo log block。
写文件的时候,可以按照字节,一个字节一个字节的写入的,文件里存放的东西就是很多很多字节,依次排开,然后其中可能512个字节组合起来,就固定代表了一个redo log block。
如果依次在磁盘文件里的末尾追加不停的写字节数据,就是磁盘顺序写;但是假设现在磁盘文件里已经有很多很多的redo log block了,此时要在磁盘里某个随机位置找到一个redo log block去修改他里面几个字节的数据,这就是磁盘随机写。
总结:平时我们执行完增删改之后,要写入磁盘的redo log,其实应该是先进入到redo log block这个内存数据结构里去的,然后再进入到磁盘文件里。
4.3、redo log buffer
redo log buffer其实就是MySQL在启动的时候,就跟操作系统申请的一块连续内存空间,大概可以认为相当于是buffer pool吧。那个buffer pool是申请之后划分了N多个空的缓存页和一些链表结构,让你把磁盘上的数据页加载到内存里来的。
redo log buffer也是类似的,他是申请出来的一片连续内存,然后里面划分出了N多个空的redo log block。
4.4、写磁盘过程

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

5、 redo log buffer中缓冲日志,什么时候可以写入磁盘?
- (1)如果写入redo log buffffer的日志已经占据了redo log buffffer总容量的一半了,也就是超过了8MB 的redo log在缓冲里了,此时就会把他们刷入到磁盘文件里去。
- (2)一个事务提交的时候,必须把他的那些redo log所在的redo log block都刷入到磁盘文件里去,只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log里有重做日志,随时可以恢复事 务做的修改。
- (3)后台线程定时刷新,有一个后台线程每隔1秒就会把redo log buffffer里的redo log block刷到磁盘 文件里去
- (4)MySQL关闭的时候,redo log block都会刷入到磁盘里去。