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:数据库宕机以后恢复的过程怎样保证事务的ACID特性】 主要使用回退段进行恢复,每次提交事务的时候,日志里会记录一条,同时回退段内会记录事务前和事务后的数据变化。当宕机后,数据库开始回退事务,数据从回退段取,保证数据的一致性


    推荐阅读