MySQL 意外宕机怎么办,数据会丢么?数据怎么恢复吗?

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

你可能感兴趣的:(MySQL 意外宕机怎么办,数据会丢么?数据怎么恢复吗?)