redo log里本质上记录的就是在对某个表空间的某个数据页的某个偏移量的地方修改了
几个字节的值,具体修改的值是什么,他里面需要记录的就是表空间号+数据页号+偏移量+修改几个字节的值具体的值
作用
事务提交的时候保证你做的修改以日志形式写入redo log日志,那么哪怕你此时突然宕机了、也没关系
事务提交的时候把修改过的缓存页都刷入磁盘,跟你事务提交的时候把你做的修改的redo log都
写入日志文件,他们不都是写磁盘么?差别在哪里
**
1.缓存页一个就是16kb,数据比较大,刷入磁盘比较耗时,而且你可能就修改了缓存页里的几个字节的数据,难道也把完整的缓存页刷入磁盘吗?
2.缓存页刷入磁盘是随机写磁盘,性能是很差的
3.一行redo log可能就占据几十个字节,就包含表空间好、数据页号、磁盘文件偏移量、更新值,这个写入磁盘速度很快
4.redo log写日志,是顺序写入磁盘文件,每次都是追加到磁盘文件末尾去,速度也是很快的
一条redo log看起来大致的结构如下所示:
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,具体修改的数据
redo log block
存放多个单行日志的
一个redo log block是512字节,这个redo log block的512字节分为3个部分,
一个是12字节的header块头,一个是496字节的body块体,一个是4字节的trailer块尾
12字节的header头又分为了4个部分。
1. 包括4个字节的block no,就是块唯一编号;
2. 2个字节的data length,就是block里写入了多少字节数据;
3. 2个字节的first record group。这个是说每个事务都会有多个redo log,是一个redo log group,即一组redo
log。那么在这个block里的第一组redo log的偏移量,就是这2个字节存储的;
4. 4个字节的checkpoint on
redo log buffer
他就是MySQL专门设计了用来缓冲redo log写入的
这个redo log buffer其实就是MySQL在启动的时候,就跟操作系统申请的一块连续内存空间,大概可以认为相当于是buffer pool吧。那个buffer pool是申请之后划分了N多个空的缓存页和一些链表结构,让你把磁盘上的数据页加载到内存里来的
通过设置mysql的innodb_log_buffer_size可以指定这个redo log buffer的大小,默认的值就是16MB
redo log block是哪些时候会刷入到磁盘文件里去
(1)如果写入redo log buffer的日志已经占据了redo log buffer总容量的一半了,也就是超过了8MB的redo log在缓冲里了,此时就会把他们刷入到磁盘文件里去
(2)一个事务提交的时候,必须把他的那些redo log所在的redo log block都刷入到磁盘文件里去,只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log里有重做日志,随时可以恢复事务做的修改
(3)后台线程定时刷新,有一个后台线程每隔1秒就会把redo log buffer里的redo log block刷到磁盘文件里去
(4)MySQL关闭的时候,redo log block都会刷入到磁盘里去
redo log磁盘日志文件写满了怎么办
redo log是有多个的,写满了一个就会写下一个redo log,而且可以限制redo log文件的数量,
通过innodb_log_file_size可以指定每个redo log文件的大小,默认是48MB,
通过innodb_log_files_in_group可以指定日志文件的数量,默认就2个.
