coding是一种爱好,知识需要系统学习

看到小咪呢,就会很快乐

  博客园  :: 首页  ::  ::  ::  :: 管理

数据库中有一种特殊的“日志文件”叫 Redo(重做) Undo(撤销),传统意义上的日志文件是记录系统运行状态的,主要用于系统工程师或者程序员排错。而 Reod/Undo 文件是数据库的一部分,主要用于数据恢复,保证数据的一致性和完整性。

用途

当执行 Insert、Update、Delete 动作时数据库不会真的去数据文件中执行 I/O 操作,而是分了两部分:

  • 修改内存中的数据(数据库称为 Buffer)

  • 记录 Redo Undo 日志

只有当 Buffer 达到刷新条件(比如脏数据达到一定比例)才会对数据文件进行操作。数据库这么设计是出于性能考虑,因为读写数据文件是一次随机 I/O 会降低系统性能;虽然 Redo Undo 也会写文件,但它是顺序写入,性能比较高。

这种顺序写入一般采用 LSM (Log Structured Merge Trees)算法,比如 Kafka,HBase、LevelDB 都采用这种结构。

因为数据并没有真正的写入数据文件,所以当数据库系统崩溃后(比如断电、系统重启、介质错误),数据库系统会利用Redo、Undo 恢复数据。

如何恢复

两个原则

  • 从前向后读取 Redo,重做所有已提交的事务

  • 从后往前读取 Undo,回滚未提交的事务

以上面操作为例,假设故障点发生在第一个 Write 之后。数据库启动后读取 Redo 文件没有发现已经提交的事务,什么也不做;读取 Undo 文件发现未提交的事务,恢复 X=0(假设 X 历史值为 0)。

假设故障点发生在第二个 Write 之后数据库启动后读取 Redo 文件发现没有已经提交的事务,什么也不做;读取 Undo 文件发现未提交的事务,恢复 X=1,继续回滚X=0。

假设故障点发生在 Commit 之后数据库启动后读取 Redo 文件发生已经提交的事务,执行 X=1,然后 X=2;读取 Undo 文件发现提交事务,什么也不做。

多个事务也是如此,读者可以自行尝试枚举

posted on 2018-12-17 13:57  fhwup  阅读(318)  评论(0编辑  收藏  举报