数据库中有一种特殊的“日志文件”叫 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的更多相关文章

  1. 如何理解redo和undo的作用

    目录 如何理解redo和undo的作用 redo undo UNDO和REDO的区别 如何理解redo和undo的作用 redo 重做日志(redo)包含所有数据产生的历史改变记录,是oracle在线 ...

  2. Oracle redo undo

    通常对undo有一个误解,认为undo用于数据库物理地恢复到执行语句或事务之前的样子,但实际上并非如此.数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库块本身在回滚后可 ...

  3. [Oracle] Redo&Undo梳理

    Oracle Redo&undo Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要 ...

  4. 一分钟理解 HTTPS 到底解决了什么问题

    本文原作者“虞大胆的叽叽喳喳”,原文链接:jianshu.com/p/8861da5734ba,感谢原作者. 1.引言 很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了: 但对于 ...

  5. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

  6. (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...

  7. BINLOG和REDO/UNDO LOG的区别

    BINLOG和REDO/UNDO LOG的区别1.处理层次不同,REDO/UNDO LOG由Innodb存储引擎处理,而BINLOG由MySQL 服务层处理.2.记录内容不同,REDO/UNDO LO ...

  8. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  9. Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言

    Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言 现在我们使用的操作系统(Windows.Mac OS.Android.iOS 等)都是带图形界面的,简单直观,容易上 ...

随机推荐

  1. 团队作业3:需求改进&系统设计(歪瑞古德小队)

    目录 一.需求&原型改进 1.1 用户需求调查 1.2 选题需求改进 1.3 功能分析的四个象限 1.4 完善需求规格说明书 1.5 任务分解WBS调整 1.6 项目进度计划调整 二.后端架构 ...

  2. 前端系列-CS与BS的区别

    现在的系统架构有B/S与C/S之分. C/S,即Client/Server(客户端/服务器).我们一般使用的软件架构都是C/S架构,比如各个系统版本中的软件如qq管家.腾讯qq.office等.C/S ...

  3. py_选择排序

    # 选择排序 # 一趟排序记录最小值,放到第一个位置 #再一趟排序记录记录列表无序区最小的数,放到第二个位置 #.... # 关键点:有序区.无序区.无序区最小值 #方法一 def select_So ...

  4. smtplib文字邮件的发送

    今天跟大家讲解一下接口测试框架的知识准备阶段,首先是发送纯文字的电子邮件,会的同学可以忽略,不会的就多敲几遍,直到自己能敲出来为止~~ # coding: utf-8import smtplibfro ...

  5. Framework项目持续集成(jenkins)及集合SonarQube

    目录 Framework项目持续集成及集合SonarQube - 前言 CI/CD是什么 -- jenkins 什么是sonarqube?什么是CodeReview? 什么是sonarqube? 什么 ...

  6. Unimrcp通过Vendor传递随路数据

    摘要 项目中需要在MRCPV2的识别消息中,传递一些随路数据.

  7. laravel核心Ioc容器

    laravel容器和依赖注入 啥是Ioc容器,方便我们实现依赖注入的一种实现,也就是说依赖注入不一定需要控制反转容器,只不过使用容器可能会方便些. laravel通过向容器中绑定接口的具体实现,可实现 ...

  8. 【pytest】teardown里的yield和addfinalizer

    在之前介绍pytest中的fixture用法的文章中https://zhuanlan.zhihu.com/p/87775743,提到了teardown的实现. 最近在翻pytest官方文档的时候,又发 ...

  9. Myabtis动态SQL,你真的会了吗?

    目录 前言 什么是动态SQL? 常用的标签 if choose.when.otherwise where foreach set sql include 总结 拓展一下 Mybatis中如何避免魔数? ...

  10. 会话技术之 Session

    会话技术之 Session 不多废话,先来一个 HelloWorld. Session 有 get 肯定要先有 set . @Override protected void service(HttpS ...