基于MySQL5.7版本,5.7版本在恢复过程做了优化,本文描述不考虑之前版本。
1 初始化崩溃恢复
数据库关闭只有2种情况,正常关闭,非正常关闭(包括数据库实例crash及服务器crash)。
正常关闭情况,所有buffer pool里边的脏页都会都会刷新一遍到磁盘,同时记录最新LSN到ibdata文件的第一个page中。而非正常关闭来不及做这些操作,也就是没及时把脏数据flush到磁盘,也没有记录最新LSN到ibdata file。
当我们重启数据库实例的时候,数据库做2个阶段性操作:redo log处理,undo log及binlog 处理。
1.1 redo log处理
打开系统表空间ibdata,读取第一个page中的LSN,若第一个页损坏,则依次往后面的page读,知道有个完整的page能够提供LSN,这个LSN当作上次shutdown时的checkpoint点,后续恢复,从这个LSN点开始恢复
进入redo log文件,读取第一个redo log文件头的checkpoint LSN, 并根据该LSN定位到re