当前位置: 首页 > news >正文

【答疑解惑】图文深入详解undo和redo的区别及其底层逻辑

题记:最近有些人问我,undo和redo到底是什么关系,他们中不乏已经入行3-4年的同学,今天咱们就来深入探讨下到底什么是undo和redo,他们分别做什么,底层逻辑原理是什么等等。

1. undo

1.1 undo的存储结构

  1. Undo段(Undo Segment):
    –Undo信息存储在数据库的undo段中,这些段是特殊的数据库对象,用于记录事务的回滚信息。
    –每个undo段都包含一个或多个undo块,用于存储具体的回滚数据。
  2. ITL(Interest Transaction List):
    –数据块的头部包含一个ITL列表,用于记录与该数据块相关的事务信息。
    –每个ITL条目都包含事务ID(XID)、回滚指针(指向undo段中该事务的回滚信息)等信息。
  3. Undo表空间:
    –Undo表空间是用于存储undo段的特殊表空间。
    –当创建数据库实例时,Oracle会自动创建一个默认的undo表空间(如UNDOTBS1)。
    –管理员也可以创建额外的undo表空间来满足特定的性能和容量需求。

1.2 undo的作用机制

  1. 回滚事务:
    –当事务执行失败或用户执行rollback操作时,Oracle会利用undo信息将数据库恢复到事务开始前的状态。
    –通过遍历ITL列表和undo段中的回滚信息,Oracle可以找到并撤销事务所做的所有更改。
  2. 提供一致性读:
    –一致性读是Oracle数据库的一种重要特性,它允许用户在查询时看到数据库在某个时间点上的快照。
    –当用户发出查询请求时,Oracle会记录当时的SCN(System Change Number)号。
    –如果查询过程中发现数据块被其他事务修改(SCN号发生变化),Oracle会利用undo信息构造一个CR(Consistent Read)块,以提供一致性读视图。
  3. 实例恢复:
    –在数据库实例崩溃后,Oracle会使用redo日志和undo信息来恢复数据库的状态。
    –首先,SMON(System Monitor)进程会利用redo日志将已提交的事务重新应用到数据文件中。
    –然后,Oracle会使用undo信息来回滚未提交的事务,以确保数据库的一致性。

1.3 undo与Redo的交互

  1. 事务提交时的交互:
    –当事务提交时,Oracle会生成相应的redo信息,并将其写入重做日志文件中。
    –同时,Oracle也会更新undo段中的信息,以标记该事务已提交。
    –在某些情况下(如IMU模式下),undo信息可能会延迟写入undo块中,但redo信息仍然会实时写入重做日志中。
  2. 实例恢复时的交互:
    –在实例恢复过程中,Oracle会首先利用redo日志将已提交的事务重新应用到数据文件中。
    –然后,Oracle会使用undo信息来回滚未提交的事务。
    –这两个过程是相互独立的,但共同协作以确保数据库在崩溃后能够恢复到一致的状态。

1.4 Undo的管理

  1. UNDO_MANAGEMENT参数:
    –通过设置UNDO_MANAGEMENT参数来选择undo的管理方式。
    –当设置为AUTO时,Oracle会使用undo表空间来自动管理undo段;当设置为MANUAL时,则使用rollback segment方式存储undo信息。
  2. UNDO_RETENTION参数:
    –UNDO_RETENTION参数用于指定undo信息在undo表空间中保存的最长时间。
    –可以根据实际需求动态调整该参数的值。该参数并不是指undo数据在undo表空间中一定要保存指定的时间长度;当新的事务需要空间时,已提交事务的undo数据可能会被覆盖。

2. Redo

2.1 redo的组成与结构

  1. Redo Log Buffer:
    –位于SGA(System Global Area)中,是一块循环使用的内存区域。
    –保存数据库变更的相关信息,这些信息以重做条目(Redo Entries)的形式存储,也称为Redo Records。
    –Redo Entries包含重构、重做数据库变更的重要信息,如INSERT、UPDATE、DELETE、CREATE、ALTER或DROP等操作。
  2. Redo Log File:
    –在线重做日志文件,物理文件,默认与数据文件存储在同一位置。
    –循环使用,Oracle允许使用至少两个日志组,数据库创建时默认会建立三个日志组。
    –当一个日志文件写满后,会切换到另一个日志文件,这个过程称为Log Switch,会触发一个检查点,促使DBWR(Database Writer)进程将写满的日志文件保护的变更数据写回数据库。
  3. Redo Header与Redo Record:
    –Redo Header记录Redo的基本概要信息,如数据库名称、控制文件序列号及日志Thread号等。
    –Redo Record记录数据库的详细更改,由Redo Record Header和更改矢量(Change Vector)组成。Change Vector详细描述了数据库块级的更改信息。

2.2 redo的作用机制

  1. 数据修改与缓存:
    –用户数据通常在Buffer Cache中修改,Oracle通过高速缓存来提高数据操作的性能。
    –在提交时并不强制将数据变更立即写出到数据文件上,以减少磁盘I/O操作的压力。
  2. Redo Log Buffer的写入:
    –Oracle通过一个后台进程LGWR(Log Writer)不断把Redo Log Buffer的内容写出到Redo Log File中。
    –LGWR的写入触发条件包括用户提交、重做日志缓冲区未满但达到一定量(如1/3或大于1M)等。
  3. 检查点与恢复:
    –检查点是一个数据库事件,用于减少恢复时间。
    –当检查点发生时,Oracle会通知DBWR进程将修改过的数据(即此检查点之前的脏数据)从Buffer Cache写入磁盘。
    –在检查点完成后,此检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相应重做记录对于崩溃/实例恢复不再有用。
  4. 实例恢复:
    –在数据库实例崩溃后,Oracle会使用redo日志来恢复数据库的状态。
    –首先,SMON(System Monitor)进程会利用redo日志将已提交的事务重新应用到数据文件中。
    –这个过程确保了即使数据库实例崩溃,已提交的事务也不会丢失。

2.3 redo与undo的交互

  1. 事务提交:
    –当事务提交时,Oracle会生成相应的redo信息,并将其写入重做日志文件中。
    –同时,Oracle也会更新undo段中的信息,以标记该事务已提交。
  2. 数据恢复:
    –在实例恢复过程中,Oracle会首先利用redo日志将已提交的事务重新应用到数据文件中。
    –如果需要回滚未提交的事务,Oracle会使用undo信息来实现。
  3. IMU(In Memory Undo)机制:
    –从Oracle 10g开始引入的IMU机制对redo的内部原理进行了改动。
    –IMU减少了redo recorder的数量,通过优化流程来提高性能。
    –在IMU下,很多工作延迟到了提交时完成,如将undo信息暂时存放在共享池的IMU区,可以改造redo数据的流程,将多条redo recorder合成一条。

2.4 redo的管理

  1. 日志组与成员的管理:
    –可以配置多个日志组和成员来提高重做日志的可用性和性能。
    –在配置时需要考虑日志组的大小、数量以及磁盘I/O性能等因素。
  2. 归档模式:
    –在归档模式下,重做日志文件在重用之前会被写出到归档日志文件中。
    –归档日志在介质恢复时可以用来恢复数据库故障。

3. undo和redo的区别与联系

3.1 区别:参考下图

在这里插入图片描述
1.功能与作用:
undo(撤销信息):用于取消或回滚事务。当用户对数据库执行修改操作(如DML操作:增、删、改)时,数据库会生成undo信息。如果事务或语句由于某些原因失败,或者用户执行rollback操作请求回滚时,数据库可以利用这些undo信息将数据返回到修改前的状态。undo信息存储在数据库内部一组特殊的段中,称为undo段(或回滚段)。
redo(重做信息):用于在失败时重放(或重做)事务。redo信息记录在Oracle的在线(或归档)重做日志文件中。如果数据库实例失效或介质失败(如硬盘故障),Oracle可以使用这些重做日志文件来恢复数据,将数据库恢复到故障发生前的状态。
2. 存储位置:
undo信息存储在数据库的undo段中。
redo信息则记录在在线重做日志文件和归档重做日志文件中。
3. 恢复机制:
undo通过逻辑恢复的方式,将数据库恢复到事务开始前的状态。
redo则通过物理恢复的方式,利用重做日志文件重放事务,以恢复数据库的状态。

3.2. undo和redo的联系:

在这里插入图片描述

  1. 事务管理:undo和redo共同协作,确保数据库事务的完整性和一致性。undo用于回滚未提交的事务,而redo用于在故障后恢复已提交的事务。
  2. 数据恢复:在数据库恢复过程中,undo和redo都起着重要作用。undo用于撤销未提交的事务,以防止数据不一致;而redo则用于重放已提交的事务,以恢复数据库到故障前的状态。
  3. 相互依赖:尽管undo信息存储在undo表空间或undo段中,但它也会受到redo的保护。对undo的修改会生成一些redo信息,这些redo信息会被记入重做日志中。这样,即使undo信息在内存中丢失,也可以通过重做日志进行恢复。

4. Undo和Redo的底层逻辑

在这里插入图片描述
如上图所示:
–日志在内存里也是有缓存的,即log buffer,磁盘上的日志文件称为log file。log file一般是追加内容,可以认为是顺序写,顺序写的磁盘IO开销要小于随机写。
–Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;
–Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。
–当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。
–redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,一般内存中的数据是脏数据),db buffer再选择合适的时机将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write Ahead Log,即预写日志。
–在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中,即Undo段。
–在db buffer中的内容写入磁盘数据库文件之前,应当把log buffer的内容写入磁盘日志文件。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。

相关文章:

【答疑解惑】图文深入详解undo和redo的区别及其底层逻辑

题记:最近有些人问我,undo和redo到底是什么关系,他们中不乏已经入行3-4年的同学,今天咱们就来深入探讨下到底什么是undo和redo,他们分别做什么,底层逻辑原理是什么等等。 1. undo 1.1 undo的存储结构 Un…...

低通滤波、反相放大器电路

1 简介 这种可调低通滤波、反相放大器电路可将信号电平放大 26dB 或 20V/V。R2 和 C1 会为此电路设置截止频率。此电路的频率响应与无源 RC 滤波器的相同,除非输出按放大器的通带增益进行放大。低通滤波器通常用于音频信号链,此滤波器有时也称为低音增强…...

SpringBoot助力服装生产流程优化

1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高…...

【机器学习】线性回归算法简介 及 数学实现方法

线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式: ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 ​ 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…...

设计模式的学习

OO:Object-Oriented 面向对象 --- 《Head First设计模式》 这本书是用java写的,我是写C的,用C来写相关的代码 --- p2(第二页) #ifndef DUCK_H #define DUCK_H/*** brief The Duck class 鸭子类*/ class Duck { public:D…...

wordpress发邮件SMTP服务器配置步骤指南?

wordpress发邮件功能如何优化?怎么用wordpress发信? 由于WordPress默认的邮件发送功能可能不够稳定,配置SMTP服务器成为了许多网站管理员的选择。AokSend将详细介绍如何在WordPress中配置SMTP服务器,以确保邮件能够顺利发送。 w…...

胤娲科技:机械臂「叛逃」记——自由游走,再悄然合体

夜深人静,你正沉浸在梦乡的前奏,突然意识到房间的灯还亮着。此刻的你,是否幻想过有一只无形的手,轻盈地飘过,帮你熄灭那盏碍眼的灯? 又或者,你正窝在沙发上,享受电视剧的紧张刺激&am…...

分布式事务讲解 - 2PC、3PC、TCC

分布式事务讲解 - 2PC、3PC、TCC 前置知识 BASE理论: BASE是Basically Availbale(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个词语的缩写。BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性来获得可用性,当…...

前端基础面试题·第四篇——Vue(其二)

1.Vue中路由传参 1.params传参 params 传参是通过URL路径来传递参数,这种方式传递的参数是必选的。这种传参方式需要在路由配置时在路由路径位置提前指定参数。 路由配置 const router new VueRouter({routes: [{path: /user/:id, // 这里的:id就是参数name: u…...

PHP反射

文章目录 介绍基本用法基本的反射示例1. 反射类2. 反射方法3. 反射属性4.反射全局函数5.反射函数的参数 优势和注意事项优势:注意事项: 介绍 PHP反射是一种强大的机制,允许在运行时检查类、接口、方法、属性等的结构和元数据。它可以用于许多…...

Gated Transformer Networks for Multivariate Time Series Classification

博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类,Transformer,门控 摘要 用于时间序列分类的深度学习模型(主要是卷积网…...

这一次,AI真的能帮你实现职场跃迁

你有没有想过: AI不仅能帮你实现工作提效 还能帮你实现职场跃迁! 根据行业报告,近年来**AIGC(AI Generated Content)**领域岗位数量井喷式增长,AI大模型产品经理作为连接技术与市场的桥梁,正扮…...

Python绘制--绘制心形曲线

今天,我们将通过Python代码来绘制一个心形曲线,这是一个经典的数学表达。 一、心形曲线的数学原理 心形曲线,也被称为心脏曲线,是一个代数曲线,可以通过参数方程定义。其数学表达式如下: x16sin⁡3(t)x16…...

初识Linux · 自主Shell编写

目录 前言: 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言: 本文介绍是自主Shell编写,对于shell,即外壳解释程序,我们目前接触到的命令行解释器&am…...

海报设计模板免费的好用吗?活动海报排版技巧轻松get

虽然今年所有的法定节假日已经过完了,但对于电商打工族来说,需要制作活动海报的节日,还有很多吧...... 刚听到小道消息,说是今年的双十一,从十月十四号就开始预热了! 怎么样,大家的预热活动海…...

【Linux基础】03 Linux环境基础开发工具使用

1. yum ——软件包管理器 yum 是我们 Linux 预装的一个指令,搜索、下载、、安装对应的软件 yum 相当于 Linux 的应用商店! 安装与卸载 yum list | grep command 通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我…...

【CSS】flex: 1; 的意思

在 Flexbox 布局中,flex: 1; 是一个简写属性,它表示弹性容器中的子元素如何分配可用空间。flex: 1 意味着该元素可以根据剩余的空间进行扩展,占据相应的比例。具体来说,flex: 1; 是 flex-grow、flex-shrink 和 flex-basis 这三个属…...

C++ 3D冒险游戏开发案例

3D冒险游戏的C开发案例,包括游戏设计、实现细节、图形渲染、音效处理等内容。 3D冒险游戏开发案例 一、游戏设计 游戏概述 游戏名称:“探索者的传奇”类型:3D冒险游戏目标:玩家控制角色在一个开放的世界中探索、解谜、战斗并完成…...

【AIGC】Exa AI 要做 AI 领域的 Google

又一个AI搜索引擎诞生:Exa AI。 与其他旨在取代谷歌的AI驱动搜索引擎不同,Exa的目标是创建一个专门为AI设计的搜索工具。 Exa的使命: 互联网包含人类的集体知识,但目前的搜索体验更像在垃圾场中导航,而非在知识图书馆中漫游。核…...

YOLOv8 基于MGD的知识蒸馏

YOLOv8 基于MGD的知识蒸馏 接着上一篇我们介绍了YOLOv8的剪枝方案和代码,本篇文章将剪枝后的模型作为学生模型,剪枝前的模型作为教师模型对剪枝模型进行蒸馏,从而进一步提到轻量模型的性能。 Channel-wise Distillation (CWD) 问题和方法 …...

全国消防知识竞赛活动方案哪家强

关键词:消防安全、预防火灾、消防意识、消防员、防火安全 适合行业:所有行业 推荐功能:答题、投票、H5 宣传角度 1.从日常生活场景出发,指导大家如何检查家庭中的火灾隐患。例如检查电线是否老化、插座是否过载、是否在楼梯间…...

JavaEE学习一条龙服务————概述

鉴于之前的笔记较乱,没有逻辑关系,,博主决定从JacaEE整个学习的阶段出发,整理一系列博客,供大家学习交流,提升自己。 此文章已绑定一篇我为大家梳理的JavaEE一条龙学习知识点的文档,大家可下载…...

分支预测器BPU

分支预测器BPU 0 Intro0.1 CPU执行过程0.2 分支预测0.2.1 TAGE预测器0.2.2 跳转地址 分支预测器BPU是深入研究一个高性能处理器的一个很好的开始项目; 0 Intro 条件分支是指后续具有两路可执行的分支。可以分为跳转分支(taken branch)和不跳转分支(not-taken branc…...

Go 系列教程 —— 数组和切片

数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型…...

适配器模式【对象适配器模式和类适配器模式,以及具体使用场景】

2.1-适配器模式 ​ 类的适配器模式是把适配者类的API转换成为目标类的API,适配器模式使得原来由于接口不兼容而不能一起工作的那些类可以一起工作,其实在具体的开发中,对于自己系统一开始的设计不会优先考虑适配器模式,通常会将接…...

【EXCEL数据处理】保姆级教程 000016案例 EXCEL的vlookup函数。

【EXCEL数据处理】000016案例 vlookup函数。 前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】保姆级教…...

【软件推荐】通过Rufus制作信创操作系统U盘安装盘 _ 统信 _ 麒麟 _ 方德

原文链接:【软件推荐】通过Rufus制作信创操作系统U盘安装盘 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天给大家带来一篇关于如何使用Rufus制作信创操作系统(如统信UOS、麒麟KOS、中科方德等)的U盘启动安装盘的文章。Ruf…...

MySql 多表设计

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本分为:一对多,多对多&a…...

wpf实现新用户页面引导

第一步 第二部 部分代码: private void show(int xh, FrameworkElement fe, string con, Visibility vis Visibility.Visible) {Point point fe.TransformToAncestor(Window.GetWindow(fe)).Transform(new Point(0, 0));//获取控件坐标点RectangleGeometry rg new Rectangl…...

【小白向】机器人入门之ROS系统的学习(Ubuntu24.04+ROS2)

目录 一.复杂的机器人系统 二.ROS机器人系统 1.简介 1.节点 2.话题 2.安装 3.测试 4.可视化 RQT: RVIZ: 显示属性: 显示状态: 一.复杂的机器人系统 依照我们现在的技术来看,机器人系统仍是极其复杂的,往…...