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特性】 主要使用回退段进行恢复,每次提交事务的时候,日志里会记录一条,同时回退段内会记录事务前和事务后的数据变化。当宕机后,数据库开始回退事务,数据从回退段取,保证数据的一致性
推荐阅读
- 考研数据库方向
- 哪个数据库,可以直接做数据透视图(navicat类的也可以)
- 某些公司招聘要求中的精通mysql是啥程度
- 哪里能获取美股月度成交金额的数据,找了好几个数据库都只有成交量
- mysql myisam引擎,插入unique数据用不满cpu等硬件是啥原因
- 为啥大多数人反对“女性穿得少被人侵犯都是活该”,却强调“数据库必须做防注入和防XSS攻击”
- 怎样查各银行高管收入数据有没有这样的数据库可以方便查到
- access数据库的密码为啥这么容易破解
- 去香港读博士的情况科普推荐系统、市场方向
- 数据库怎样统计多维度数据