一分钟理解Redo Undo

开发 开发工具
数据库中有一种特殊的“日志文件”叫Redo(重做) Undo(撤销),Reod/Undo文件是数据库的一部分,主要用于数据恢复,保证数据的一致性和完整性。

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

Redo 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 文件发现提交事务,什么也不做。

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

【本文是51CTO专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2018-06-26 05:23:19

线程安全函数代码

2017-02-21 13:00:27

LoadAverage负载Load

2018-12-12 22:51:24

Java包装语言

2017-03-30 19:28:26

HBase分布式数据

2018-06-28 14:00:01

分布式集群架构

2018-06-26 10:52:45

2020-05-21 19:46:19

区块链数字货币比特币

2022-07-18 06:16:07

单点登录系统

2017-07-06 08:12:02

索引查询SQL

2011-02-21 17:48:35

vsFTPd

2020-07-09 07:37:06

数据库Redis工具

2020-07-17 07:44:25

云计算边缘计算IT

2016-09-12 17:28:45

云存储应用软件存储设备

2018-07-31 15:05:51

Java公平锁线程

2013-11-15 07:24:50

4G LTE图解

2020-06-11 08:04:12

WDMDWDMMWDM

2016-12-16 11:05:00

分布式互斥线程

2018-03-27 09:28:33

缓存策略系统

2015-11-12 10:32:40

GitHub控制系统分布式

2021-08-06 08:50:45

加密货币比特币区块链
点赞
收藏

51CTO技术栈公众号