InnoDB如果发生意外宕机了,数据会丢么?
对于这个问题,稍微了解一点MySQL知识的人,都会斩钉截铁的回答:不会!
为什么?
他们也会毫不犹豫地说:因为有重做日志(redo log),数据可以通过redo log进行恢复。
回答得很好,那么InnoDB怎样通过redo log进行数据恢复的,具体的流程是怎样的?
估计能说清楚这个问题的人所剩不多了,更深入一点:除了redo log,InnoDB在恢复过程中,还需要其他信息么?比如是否需要binlog参与?undo日志在恢复过程中又会起到什么作用?
到这里,可能很多人会变得疑惑起来:数据恢复跟undo有半毛钱的关系?
其实,InnoDB的数据恢复是一个很复杂的过程,这个恢复过程需要redo log、binlog、undo log等参与。这里把InnoDB的恢复过程主要划分为两个阶段:
第一阶段主要依赖于redo log的恢复;
而第二阶段,恰恰需要binlog和undo log的共同参与。
接下来,我们来具体了解下整个恢复的过程:
一、依赖redo log进行恢复
第一阶段,数据库启动后,InnoDB会通过redo log找到最近一次checkpoint的位置,然后根据checkpoint相对应的LSN开始,获取需要重做的日志,接着解析获取的日志并且保存到一个哈希表中,最后通过遍历哈希表中的redo log信息,读取相关页进行恢复。
InnoDB的checkpoint信息保存在日志文件中,即ib_logfile0的开始2048个字节中,checkpoint有两个,交替更新,checkpoint与日志文件的关系如下图:
(checkpoint位置)
checkpoint信息分别保存在ib_logfile0的512字节和1536字节处,每个checkpoint默认大小为512字节,InnoDB的checkpoint主要由3部分信息组成:
checkpoint no:主要保存的是checkpoint号,因为InnoDB有两个checkpoint,通过checkpoint号来判断哪个checkpoint更新。
check