Mysql InnoDB Redo log( 六 )


在mysql进行崩溃恢复的时候 , 只需要从checkpoint_lsn在日志文件组中对应的偏移量开始 , 扫描到第一个log_block_hdr_data_len值不为512的block为止
3.如何进行崩溃恢复现在确定了需要恢复的redo log , 那么如何进行恢复昵 , 每一个redo log格式如下

Mysql InnoDB Redo log

文章插图
3.1化随机io为顺序io其space id记录了表空间号 , page number记录了页号 , 也许这一堆redo log整体上表空间号 , 页号是不具备顺序的 , 如果直接遍历每一个redo log然后对表空间中的页进行恢复 , 是会带来很多随机io的 , 所以innodb使用hash表进行优化 , 将相同表空间号和页号作为key , 这样相同表空间和页的日志就会在同一个hash桶中形成链表中 , 然后遍历每一个hash表的操作 , 一次性将一个页进行恢复 , 化随机io为顺序io
3.2跳过不需要刷新页首先小于最近一次checkpoint_lsn的redo log肯定是不需要进行恢复 , 但是大于的也不一定需要恢复 , 因为可能在做崩溃前的checkpoint的时候 , 后台线程也许将LRU链表和flush链表中的一些脏页刷新到磁盘了 , 那么恢复的时候这些脏页也不需要进行恢复 。那么怎么判断这些不需要恢复的脏页昵?——每一个页面具备file header , 其中有一个属性为file_page_lsn的属性 , 记录了最近一次修改页面时对应的lsn值(即脏页在buffer pool控制块中的newest_modification)如果执行某次checkpoint发现页中的lsn大于最近一次checkpoint的checkpoint_lsn的时候 , 那么说明此页不需要进行更新 。
【Mysql InnoDB Redo log】

经验总结扩展阅读