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

news2024/10/9 10:38:33

题记:最近有些人问我,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基本知识和排障案例及经验、性能调优等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信工程学习:什么是RFID射频识别

RFID:射频识别 RFID射频识别(Radio Frequency Identification),又称为无线射频识别,是一种非接触式的自动识别技术。它通过无线电信号来识别特定目标并读写相关数据,而无需在识别系统与特定目标之间建立机械…

亳州自闭症寄宿制学校,关注孩子的学习和生活

在特殊教育领域,自闭症儿童的教育与成长一直是社会各界关注的焦点。近年来,随着对自闭症认识的加深,越来越多的寄宿制学校应运而生,致力于为这些特殊的孩子提供全面、个性化的教育服务。在安徽亳州,这样的学校正努力为…

大数据毕业设计选题推荐-国产电影数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

各省常住人口及人口密度面板数据(2000-2022年)

常住人口指在某地区居住超过一定时间(通常为半年以上)的人口,而人口密度则指每平方千米或每公顷内的常住人口数。数据集的主要指标包括: 省份年份常住人口(万人)人口密度(人/平方公里&#xff…

荣誉|奇点云入选“2024年成长型浙江数商”名单

近期,浙江省经济和信息化厅根据《关于推进浙江数商高质量发展的实施意见》(浙制高办〔2024〕21号),在全省范围内遴选在全国具有影响力的10家“领军型浙江数商”企业,以及50家在细分领域有影响力的“成长型浙江数商”企…

GBC律所老牌代理Tory Burch 汤丽柏琦再次维权

案件基本情况起诉时间:2024-9-17案件号:24-cv-08553品牌:Tory Burch原告:River Light v, L.P.原告律所:GBC起诉地:伊利诺伊州北部法院品牌介绍Tory Burch汤丽柏琦是美国奢华时尚生活方式品牌,以…

26.删除有序数组中的重复项

题目::26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思路:只要不和前面的数一样就可以移动指针&#xff0c;进行赋值 代码: class Solution { public:int removeDuplicates(vector<int>& nums) {int slow 0 ;for(int fast 1; fast < …

SPI通信——FPGA学习笔记14

一、简介 SPI(Serial Periphera Interface&#xff0c;串行外围设备接口)通讯协议&#xff0c;是 Motorola 公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据传输&#xff0c;广泛用于 EEPROM、F…

【GESP】C++一级练习BCQM3033,略微复杂的计算,国庆七天乐

应该算第一道对小学生来说&#xff0c;计算逻辑稍微复杂一点的题目。多定义几个变量可能对解题过程更有帮助。 题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3033/ 【GESP】C一级练习BCQM3033&#xff0c;略微复杂的计算&#xff0c;国庆七天乐 | OneCoder应该算第…

(11)(2.1.4) DroneCAN ESCs

文章目录 前言 1 DroneCAN ESC列表 2 连接到飞行控制器 3 自动驾驶仪设置 4 记录和报告 5 附加资料 前言 Copter、Plane 和 Rover 支持 DroneCAN 电子速度控制器&#xff08;ESC&#xff09;&#xff0c;该控制器允许与自动驾驶仪进行双向通信&#xff0c;从而可能更容易…

Python中的数据可视化艺术:用Matplotlib和Seaborn讲故事

Python中的数据可视化艺术&#xff1a;用Matplotlib和Seaborn讲故事 数据可视化不仅仅是图表的绘制&#xff0c;更是通过视觉形式传达复杂信息的一种艺术。使用Python中的两个强大的库——Matplotlib和Seaborn&#xff0c;可以将数据转化为清晰、优美的图表&#xff0c;帮助我…

理解计算机系统_程序的机器级表示(二):寄存器,操作数,数据传送,程序栈

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 本书第三章&#xff1a;程序的机器级表示内容的理解,这一章内容以汇…

智能电子价签:助力零售效率升级的关键

在竞争日益激烈的零售市场&#xff0c;如何优化运营、提升效率&#xff0c;是每个零售商都在关注的问题。电子价签作为一项创新技术&#xff0c;提供了蒿效的解决方案。今天&#xff0c;我们就来聊聊电子价签如何帮助零售商轻松管理信息、减少人工误差&#xff0c;并展示它在门…

【AI绘画】Midjourney进阶:对称构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对称构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 通常来学习AI绘画的人可以分为…

遥感影像-语义分割数据集:多源多模态地物多要素数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该数据集由WHU-OPT-SAR数据集整理而来&#xff0c;覆盖面积51448.56公里&#xff0c;分辨率为5米。据我们所知&#xff0c;WHU-OPT-SAR是第一个也是最大的土地利用分类数据集&#xff0c;它融合了高分辨率光学和SAR图像&#xff0c;并进行了充…

非酒精性脂肪性肝炎NASH临床赛道的百米冲刺,谁将成为胜者?

前 言 非酒精性脂肪性肝炎&#xff08;NASH&#xff09;是一种与肥胖、血脂异常、2型糖尿病和代谢综合征密切相关的疾病&#xff0c;可能会发展为肝硬化、终末期肝病甚至肝癌。据美国肝脏基金会统计数据显示&#xff0c;截至2023年8月&#xff0c;美国成年人中有5%的NASH患者…

使用 YOLOv 11 模型实现实时手语检测 可同时识别多个手语手势

项目&#xff1a;Yolo11 - Roboflow - OpenCV 手语是聋哑人之间以及他们与外界沟通的重要工具&#xff0c;然而&#xff0c;许多不会手语的人无法与他们有效交流。这个项目的目标是通过自动检测手语手势&#xff0c;构建一个可以帮助聋哑人和普通人之间沟通的桥梁&#xff0c;…

立体扬声器棒球帽专利TRO维权,速查避免踩坑

案件基本情况起诉时间&#xff1a;2024-9-18案件号&#xff1a;24-cv-08626原告&#xff1a;Audiowear Technology Corporation原告律所&#xff1a;Loza & Loza, LLP起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Audiowear Technology Corporation&#xff0c;一家位于特…

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具&#xff08;网络和串口调试助手&#xff09; 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中&#xff0c;并解压给权限 cd /home/${USER}/Ne…

(23)DBPSK信号在Rayleigh衰落信道条件下的传输性能仿真

文章目录 前言一、MATLAB仿真代码二、仿真结果画图 前言 此示例创建了一个【频率平坦的瑞利衰落信道】对象&#xff0c;并使用该对象来对DBPSK信号进行衰落处理&#xff0c;衰落之后增加了不同信噪比的AWGN&#xff0c;计算出不同的信噪比值计算误码率&#xff0c;并和理论误码…