mysql宕机恢复_MySQL:数据库宕机以后恢复的过程?如何保证事务的ACID特性?

首先介绍几个概念:

REDO 为了重做对数据页(page)更改保存的信息,用于恢复

UNDO 为了撤销对数据记录(tuple)更改保存的信息,用于回滚事务

LSN(Log Sequence NO) 日志号,一个递增的64位整数,一个LSN表示一个(redo)Log结构。

CHECKPOINT表示一个时间点,在CHECKPOINT LSN之前的更改都已经保存到了持久存储。恢复时只需从最后一个CHECKPOINT LSN开始。

下面从update, commit, recovery三个方面简单说明:

update(Insert与之类似)

1.计算更新后tuple到原tuple的delta信息,把这个delta复制到rollback segment中的undo

2.写redo log,记录对rollback segment的更改

3.把buffer pool中的对应tuple更新成新值,把新值的rollback pointer写入undo log

4.写redo log,记入对页(page)的更改

5.将页状态改成dirty

commit

force log, flush当前事务的redo log

recovery

1.启动开始时检测是否发生崩溃

2.定位到最近的一个checkpoint

3.定位在这个checkpoint时flush到磁盘的数据页,检查checksum。如果不正确,说明这个页在上次写入是不完整的,从doublewrite buffer里把正确的页读出来,更新到buffer中的页

4.分析redo log,标识出未提交事务

5.顺序执行redo

6.rollback未提交的事务

以上是我个人的一些简单总结,具体细节的可以参考:

Jeremy Cole的InnoDB: A journey to the core

你可能感兴趣的:(mysql宕机恢复)