一分钟理解Redo Undo
数据库中有一种特殊的“日志文件”叫 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 文件发现提交事务,什么也不做。
多个事务也是如此,读者可以自行尝试枚举
一分钟理解Redo Undo的更多相关文章
- 如何理解redo和undo的作用
目录 如何理解redo和undo的作用 redo undo UNDO和REDO的区别 如何理解redo和undo的作用 redo 重做日志(redo)包含所有数据产生的历史改变记录,是oracle在线 ...
- Oracle redo undo
通常对undo有一个误解,认为undo用于数据库物理地恢复到执行语句或事务之前的样子,但实际上并非如此.数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库块本身在回滚后可 ...
- [Oracle] Redo&Undo梳理
Oracle Redo&undo Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要 ...
- 一分钟理解 HTTPS 到底解决了什么问题
本文原作者“虞大胆的叽叽喳喳”,原文链接:jianshu.com/p/8861da5734ba,感谢原作者. 1.引言 很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了: 但对于 ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
- (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...
- BINLOG和REDO/UNDO LOG的区别
BINLOG和REDO/UNDO LOG的区别1.处理层次不同,REDO/UNDO LOG由Innodb存储引擎处理,而BINLOG由MySQL 服务层处理.2.记录内容不同,REDO/UNDO LO ...
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言
Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言 现在我们使用的操作系统(Windows.Mac OS.Android.iOS 等)都是带图形界面的,简单直观,容易上 ...
随机推荐
- springMVC入门(八)------拦截器
简介 springMVC拦截器针对处理器映射器进行拦截配置 如果在某个处理器映射器中配置拦截,经过该处理器映射器映射成功的Handler最终使用该拦截器 由于springMVC支持配置多个处理器映射器 ...
- 02.RDB持久化配置与工作流程
一.如何配置RDB持久化机制 配置文件redis.conf save 60 1000 表示每隔60s,检查如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redi ...
- Qt setMouseTracking使用
Qt setMouseTracking使用(转载) bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效. 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标 ...
- 深入理解C++中的new/delete和malloc/free动态内存管理
malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...
- WebRTC的VAD 过程解读
摘要: 在上一篇的文档中,分析unimrcp中vad算法的诸多弊端,但是有没有一种更好的算法来取代呢.目前有两种方式 1. GMM 2. DNN. 其中鼎鼎大名的WebRTC VAD就是采用了GM ...
- 记一次Layui分页
<link rel="stylesheet" href="/layui/css/layui.css"> <div class="ro ...
- 【Android】Scrollview返回顶部,快速返回顶部的功能实现,详解代码。
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...
- Android开发之封装log打印日志的工具类,实用logutils详细代码
public final class LogUtil { /** all Log print on-off */ private final static boolean all = true; /* ...
- MockMvc编写单测
目录 MockMvc 注意点 code 待测试的controller 测试类 github MockMvc 注意点 1.通过spring上下文获取mockmvc对象 @BeforeEach publi ...
- SQL SERVER管理维护计划错误,备份错误,1053/3041/错误18204,严重性16,状态1
在sqlserv2008/2012里设置了管理-维护计划-备份计划,前些天遇到报错-1053/3041/错误18204,严重性16,状态1等:分享下解决方法. 1.在服务器执行任务报错 2.解决办法 ...