在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主要流程。
本文代码分析基于 MySQL 5.7.7-RC 版本,函数入口为 innobase_start_or_create_for_mysql
,这是一个非常冗长的函数,本文只涉及和崩溃恢复相关的代码。
在阅读本文前,强烈建议翻阅我们之前的两期月报:
1. MySQL · 引擎特性 · InnoDB undo log 漫游
2. MySQL · 引擎特性 · InnoDB redo log漫游
初始化崩溃恢复
首先初始化崩溃恢复所需要的内存对象:
recv_sys_create();
recv_sys_init(buf_pool_get_curr_size());
当InnoDB正常shutdown,在flush redo log 和脏页后,会做一次完全同步的checkpoint,并将checkpoint的LSN写到ibdata的第一个page中(fil_write_flushed_lsn
)。
在重启实例时,会打开系统表空间ibdata,并读取存储在其中的LSN:
err