Mysql InnoDB Redo log( 二 )

MLOG_MULTI_REC_END类型的日志 。
四丶redo log日志写入过程1.redo log block

Mysql InnoDB Redo log

文章插图
innodb 将通过MTR生成的redo log放在大小为512字节的block中 , 其中存储redo log的部分只有log block body其余的两部分存储一些统计信息
  • log block header
    • log_block_hdr_no:每一个block 具备一个大于0的唯一编号,此属性便是记录编号值
    • log_block_hdr_data_len:记录当前lock block使用了多少字节(从12开始,因为lock block header占用了12字节),随着越来越多的日志写入block最后最大为512字节
    • log_block_first_rec_group:一个MTR包含多个日志,这个字段记录该block中第一个MTR生成redo log日志记录组的偏移量 。
    • log_block_checkpoint_no:表示checkpoint的序号
  • log block trailer
    • log_block_check_sum:表示block检验和,用于正确性校验
2.redo log buffer为了解决磁盘写入过慢的问题 , innodb采用了redo log buffer , 写入redo log不会直接写入磁盘 , 而是在服务启动的时候申请一片连续的内存空间,用作缓冲redo log的写入
Mysql InnoDB Redo log

文章插图
innodb_log_buffer_size可以指定其大?。?6mb
3.redo log写入log bufferinnodb保存了一个buf_free的全局变量用于记录log buffer中空闲位置的偏移量,让后续redo log的写入从buf_free的位置开始写 。
不同的事务是可以并发运行的,并发的写入redo log buffer中 , 每当一个MTR执行完成时,伴随着该MTR生成的redo log被写入到log buffer中,多个不同事务的MTR可能时交替写如到log buffer中的
五丶redo log持久化1.redo log buffer中的内容何时持久化到磁盘MTR运行过程中产生的一组redo log会在MTR结束的时候被复制到log buffer中,但是何时落盘昵?
  • log buffer 空间不足
    如果写入log buffer的redo log日志量已经占满log buffer的一半时,会进行刷盘
  • 事务提交时
    之所以使用redo log,是由于其占用内存小 , 可以顺序IO写回磁盘 , 为了保证事务的持久性,需要把修改页面对应的redo log刷新到磁盘,这样系统崩溃时也可以将已提交的事务使用redo log进行恢复
  • 将某个脏页刷新到磁盘前
    将buffer pool中的脏页刷盘的时候,会保证将其之前产生的redo log刷盘
  • 后台线程,每秒一次的频率将redo log buffer中刷盘
  • 正常关闭mysql服务器时
  • 做checkpoint时
2.redo log 日志文件组mysql的数据目录下默认有两个redo log日志文件,默认名称为ib_logfile0ib_logfile1,log buffer中的内容便是刷新到着两个文件中 。可以通过以下系统变量进行设置
  • innodb_log_group_home_dir:指定redo log日志文件所在目录
  • innodb_log_file_size:指定每一个redo log日志文件大小
  • innodb_log_file_in_group:指定redo log日志文件的个数
日志文件不知一个,而是以一个日志文件组的形式出现的 , 都是ib_logfile数字格式的名称,在持久化redo log的时候,首先从ib_logfile0开始写,然后写ib_logfile1直到写到最后一个文件,这时候需要做checkpoint,后继续从ib_logfile0写 , 从头开始写,写到末尾就又回到开头循环写 , 如下图
Mysql InnoDB Redo log

文章插图
3.redo log日志文件格式
Mysql InnoDB Redo log

文章插图
每一个redo log文件前2048个字节(四个redo log block大?。┯美创娲⒐芾硇畔ⅲ?后续的位置存储log buffer中redo log block镜像
Mysql InnoDB Redo log

文章插图
【Mysql InnoDB Redo log】前2048字节分为四个block , 如上图