WAL 的全称是 Write-Ahead Logging,它的关键点是,先写日志,再写磁盘。
WAL的机制在redo log的使用场景,充分展现。
具体说来,当执行一条sql时,过程如下:
- Innodb引擎会把数据先插入redo log(也是写入磁盘,顺序写入,比较快)当中,并更新内存(db buffer),这个时候更新就算完成了。
- 此时,内存(db buffer)中的数据和磁盘数据(data file)对应的数据不同,我们认为内存中的数据是脏数据(即:脏页)
- db buffer再选择合适的时机将数据持久化到data file中。
- 这种顺序可以保证在需要故障恢复时恢复最后的修改操作
- 先持久化日志的策略叫做Write Ahead Log,即预写日志。
-
Redo log 的示意图如下
redo log示意图
- write pos 是当前记录的位置
- checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件
- 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
参考文献:
网友评论