Mysql InnoDB Redo log( 三 )


  • 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

文章插图
前2048字节分为四个block , 如上图
  • log file header 描述该日志的一些整体属性
  • checkpoint1 & checkpoint2 , 格式相同
    • log_checkpoint_no:服务器执行checkpoint的编号 , 每执行一次checkpoint该值加1
    • log_checkpoint_lsn:服务器在结束checkpoint时对应的lsn值 , 系统崩溃时从该值开始
    • log_checkpoint_offset:log_checkpoint_lsn属性值 , 在redo日志文件组中的偏移量
    • log_checkpoint_log_buf_size:服务器在执行checkpoint操作时对应的log buffer大小
    • log_checkpoint_checksum:本block校验值 , 无需关心
4.LSN——log squence number记录当总共写入的redo 日志量innodb的一个全局变量 , 用于记录当总共写入的redo 日志量 , 初始值为8704(未产生一条redo日志也是8704) 。并不是记录刷到磁盘的redo log日志总量 , 而是写入到log buffer中的redo log日志量
Mysql InnoDB Redo log

文章插图
每一组MTR生成的redo log都有唯一一个lsn值与之对应 , 其中lsn越小表示对应的redo log产生越早
5.flushed_to_disk_lsn记录刷新到磁盘中的redo日志量redo log总是先写入到redo log buffer然后才会被刷新磁盘中的 , 所有需要有一个变量记录下一次从log buffer中刷盘的起始位置——buf_next_to_write
Mysql InnoDB Redo log

文章插图

经验总结扩展阅读