MySQL Redo Log
1.Redo Log类型
redo log的本质是保证事务提交之后数据不会丢失
redo log本质上记录的是对某个表空间的某个数据页的某个偏移量的地方修改了几个字节的值,具体修改的值是什么,他需要记录就是表空间号+数据页号+偏移量+修改几个字节的值+具体的值
根据修改了数据页里的几个字节的值,redo log就划分为了不同的类型,MLOG_1BYTE类型的日志指的就是修改了1个字节的值,MLOG_2BYTE类型的日志指的就是修改了2个字节的值,以此类推
当然,如果你要是一下子修改了一大串的值,类型就是MLOG_WRITE_STRING,就是代表你一下子在那个数据页的某个偏移量的位置插入或者修改了一大串的值
redo log看起来大致的结构如下所示:
日志类型 | 表空间ID | 数据页号 | 数据页中的偏移量 | 具体修改的数据 |
---|
MLOG_WRITE_STRING类型的日志,因为不知道具体修改了多少字节的数据,所以其实会多一个修改数据长度:
日志类型 | 表空间ID | 数据页号 | 数据页中的偏移量 | 修改数据长度 | 具体修改的数据 |
---|
2.Redo Log Block
redo log block是用来存放单行日志的
一个redo log block是512个字节,分为三部分,一部分是12个字节的header块头,一个是496字节的body块体,一个是4字节的trailer块尾
在这里,12字节的header头又分为4个部分:
(1) block no,块唯一编号,4个字节
(2)data length,block里写了多少字节数据,2个字节
(3)first record group,一个事务会有多个redo log,即一组redo log,block中第一组redo log的偏移量,2个字节
(4)checkpoint on,4个字节
每一个redo log都会写入到redo log block中,一个block最多放496自己的redo log日志,等redo log block的512个字节都满了,再一次性把这个redo log block写入磁盘文件
3.Redo Log Buffer
redo log buffer在MySQL启动的时候会跟操作系统申请一块连续的内存空间,然后在里面划分出多个redo log block
通过设置MySQL的innodb_log_buffer_size可以指定这个redo log buffer的大小,默认值是16MB
写入redo log的时候,会从第一个redo log block开始写入,写满了就往下一个写,直到所以的redo log block都写满,此时会强制把redo log block刷入到磁盘中去
一个事务有多个增删改操作,那么就会有多个redo log,这是一组redo log,其实每次一组redo log都是先在别的地方暂存,然后都执行完了,再把一组redo log写入到redo log buffer的block里去的
redo log buffer中的block刷入磁盘时机:
- 如果写入redo log buffer的日志已经占据了redo log buffer总容量的一半,此时就会把他们刷入磁盘文件里去
- 一个事务提交的时候,必须把他的那些redo log block都刷入到磁盘文件里去
- 后台线程定时刷新,有一个后台线程每个1秒就会把redo log buffer里的redo log block刷到磁盘文件里去
- MySQL关闭的时候,redo log block都会刷入到磁盘里去