管理还原数据

UNDO表空间管理1、对于DML语句来说,只要修改了数据块,Oracle数据库就会将修改前的数据块保留下来,保存在undosegment里面,而undosegment则保存在undo表空间中

undo 表空间管理

1、对于DML语句来说,只要修改了数据块,Oracle数据库就会将修改前的数据块保留下来,保存在undo segment里面,而undo segment则保存在undo表空间中

2、undo的管理

自动undo管理(Oracle9i开始)AUM

手工undo管理MUM

9i以后,就建议使用AUM,因此就不再讨论MUM

一条DML语句的执行流程update t set coll=‘A’ where coll=‘B’

1、在shared pool里面进行解析,从而生成执行计划

2、根据执行计划,得出coll=‘B’的记录存放在10号数据文件的54号数据块里面

3、服务器进程首先在buffer cache寻找一个可用的undo数据块(如果一个事物已经提交,那么这个事务曾经使用过的undo数据块就可以被使用),如果没有发现,则到undo表空间里找到一个可用的undo数据块,并调入到buffer cache。假设获得的undo数据块号为24号,位于11号undo数据文件里

4、将改变前的值,也就是B放入24号undo数据块(buffer cache中)

5、由于undo数据块发生了变化(只要是数据块发生变化,那么就产生重做记录),于是产生重做记录,假设重做记录号是120

6、在buffer cache里面找到54号数据块,如果没有,则从10号数据文件调入

7、将改变后的值,也就是A放入54号数据块

8、由于数据块发生了变化,于是产生重做记录,假设重做记录号是121

9、控制权返回给用户,如果使用SQLPLUS,那么表现为光标返回

10、用户发出commit命令,触发LGWR,将120、121这两个重做记录写入联机重做日志文件中,将54号、24号两个数据块头部所记录的事务状态标记设置为已提交,控制权返回给用户,如果使用SQLPLUS,那么表现为光标返回

11、这个时侯,54号和24号数据块并不一定被DBWr写入数据文件,只有在脏数据块的数量达到一定程度的时候才会被写入

事务提交以后,该事务所使用的undo数据块就可以被覆盖,上面的例子中,第10步用户提交以后,24号undo数据块就可以被覆盖

Undo的作用

1、提供读一执性

2、回滚事务

3、实例恢复

读一致性

一个场景描述

读一致性是相对脏读而言的,表T中有10000条记录,获取所有的记录需要15分钟的时间,当前时间为9点整,香港服务器,用户发出一条select * from T命令,该语句在9:15完成。当用户执行该语句到9:10分的时候,另外一个用户发出了一条删除命令,将最后一条记录删除,并且进行了提交。

到9点15分的时候,用户返回了多少条记录。

如果是9999条,那么就是脏读、如果是10000条,那么就是读一致性。

Oracle不会出现脏读,提供读一致性,而且没有阻塞DML操作

Oracle如何实现读一致性呢?

1、用户在9点发出select语句的时候,服务器进程会记录9点那个时刻的SCN号(SCN号是以时间(timestamp)作为参数的一个函数返回值,调用函数(默认以timestamp为参数)随时可以返回这个时刻的SCN号,可以使用函数在SCN和timestamp之间进行转换),假设该SCN号是SCN9:00,那么SCN9:00一定大于等于记录在所有数据块头部的ITL槽中的SCN号(如果有多个ITL槽,SCN最大的那个)

2、服务器进程扫描T表的时候,会把扫描的数据块头部的ITL槽中的SCN号与SCN9:00进行比较,哪个更大。如果数据块头部的SCN小于SCN9:00,那么说明这个数据块在9:00以后没有更改过,可以直接读取,如果数据块头部的SCN号大于SCN9:00,则说明该数据块在9:00以后更改过,已经不是9:00那个时刻的数据了于是要借助undo块

3、9点10分,用户更改了T表的最后一条记录并提交(无论是否提交,只要是更改了T表,用户就会去读undo数据块),假设被更改的是N号数据块,那么N号数据块头部的ITL槽中记录的SCN被修改为SCN9:10,当服务器进程扫描到这个数据块的时候,发现ITL槽中的SCN9:10大于SCN9:00,说明该数据块在9:00以后被更新了,于是服务器进程到N号块的头部,找到SCN9:10所在ITL槽,由于ITL槽记录了对应的undo块的地址,于是服务器进程找到undo数据块,结合undo数据块给用户提供读一致性。

进一步复杂化问题

1、9点10分,更新了数据并且进行了提交,9点11分又对该数据块进行了更新并且提交(假设数据块只有一个ITL槽)

2、那么该ITL槽记录的就是SCN9:11

3、这种情况如何处理,秘密在于undo数据块中,除了记录改变前的数据以外,因为数据块的ITL槽也发生了变化,因此也进行了记录,而ITL槽中记录了undo块的地址。9:00的时候数据块的ITL槽中记录了数据块的SCN是8:50和对应的undo块,9:10分的时候数据库的ITL槽中记录了数据块的SCN是9:10和对应的undo(undo1),9:11分的时候数据库的ITL槽中记录了数据块的SCN是9:11和对应的undo(undo2),Undo2中记录了9:10的数据,以及9:10数据的undo地址undo1,undo1中记录了9点以前的数据以及9点以前的undo数据

当用户进行查询的时候,服务器进程扫描到N号数据块,发现SCN9:11,大于SCN9:00,从ITL槽中找到undo块的地址(undo2),undo2中记录了改变前的数据和改变前的数据库的ITL槽,发现undo2对应的SCN是9:10还是大于9:00,根据undo里面记录的ITL槽的改变前信息,继续向前找,找到undo1,发现SCN是8:50,小于9:00,使用这个undo的数据

如果在向前寻找的时候,没有找到SCN小于9:00的数据(因为时间比较长,而且事务已经提交,所以回滚段可能被覆盖),数据库就会出现一个经典的错误ORA-01555(snapshoot too old),但是不会出现脏读的情况。

clip_image003

最核心的就是:数据块的数据发生改变,ITL槽也发生改变。这两条信息都会存储到undo中。因此如果一个undo足够的大,那么一个数据块的所有的undo数据块是可以串联起来的。可以从最近一直找到非常远的过去。从数据块开始往前找,一直找到很久以前的SCN。这个数据块所有的变化都能够找到。

ITL槽中记录着这个数据块的undo数据块的地址。

一个数据块中存储很多条数据,update、insert、delete等DML操作,都会影响数据块的SCN号。数据块的SCN号反映了数据块的变化过程。

回滚事务:错误或者rollback命令都会产生回滚

根据ITL槽中记录的undo数据块的地址,找到undo数据块,恢复数据。

实例恢复

乾坤圈新媒体矩阵管家 乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

乾坤圈新媒体矩阵管家 17 查看详情 乾坤圈新媒体矩阵管家

回滚段的头部记录了事务表,每一个事务是否提交等信息都存储在里面。

根据事务表的信息进行实例恢复。

配置AUM

Oracle9i开始,我们不再使用手工的管理方式,因此“MANUAL”不再使用,使用“AUTO”

使用AUM需要配置两个参数

clip_image004

指定这两个参数以后,剩余的工作让Oracle来处理,例如undo segment的创建、扩展、收缩、删除等。

如果指定了undo_management,但是在指定undo_tablespace的时候,指定了一个错误的回滚表空间,实例启动的时候,会报错。

如果没有指定回滚段表空间,系统查找第一个可用的回滚段表空间,如果没有找到,那么就使用system表空间中的回滚段,这不是我们希望看到的,因为对性能影响很大。

因此两个参数都要很好的规划

事务、undo segment

发生DML操作的时候,服务器进程会选择一个undo segment,具体算法如下:

1、首先尝试将每一个undo segment绑定一个事务,也就是每个undo segment上只有一个事务使用

2、如果不能发现完全空闲的undo segment,所有的undo segment都与事务绑定

3、系统尝试将脱机的undo segment联机

4、如果没有可用的undo segment进行联机,则会尝试创建一个新的undo segment

5、如果上面的步骤都没有成功(例如没有可用空间了,不能创建undo segment),算法会尝试寻找最早使用的undo segment,这种情况下,不同的多个事务会在同一个相同的undo segment里同时进行

6、每隔12个小时会收缩一次,删除那些idle状态的extent

7、DML操作需要undo时,发现空间不够,则会唤醒SMON进行一次收缩,将undo segment里面暂时没有使用的extent拿过来使用

Oracle 在提供一致性读的过程中,具体的步骤如下

1、确认读时刻的SCN

2、搜寻所有的数据块的SCN要求小于读时刻的SCN

3、如果搜寻的SCN小于读时刻的SCN,直接读取

4、如果搜寻的SCN大于读时刻的SCN,根据数据块里面的ITL槽里面记录的undo信息,找到改变前的数据、如果SCN还是大,顺着ITL槽信息串联起来的undo块继续向前找

5、如果没有找到小于读时刻的SCN的数据块,那么就报错ORA-01555

事务提交以后,undo回滚段就可以被覆盖,而且我们在寻找undo数据块的时候,这个被寻找的undo数据块很可能已经被提交,因此出现ORA-01555错误不可避免。Oracle是如何来解决这个问题的呢?

Oracle定义了一个参数undo_retention

这个参数以秒为单位,表示当事务提交或者回滚以后,该事务所使用的undo 块里的数据需要保留多长时间。

当保留的时间超过undo_retention所指定的时间以后,该undo块才能够被其他事务覆盖。

当我们使用AUM的时候,并且设置了undo_retention以后,undo块的状态就存在4种

Active:表示正在使用该数据块的事务还没有提交或者回滚

Inactive:该数据块上没有活动的事务,该状态的undo可以被其他事务覆盖

Expired:该数据块持续inactive的时间超过undo_retention所指定的时间

Freed:该数据块是空的,从来没有被使用过

在AUM模式中,事务可以在不同的undo segment之间动态交换undo空间,也就是在不同的undo segment里交换extents。

我们来看一下,一个事务需要更多的undo空间的时候,是如何进行处理的?

1、获取undo表空间里可用的、空的extents(segment的最小分配单元是extent)

2、获取其他undo segment里的expired状态的extents

3、如果undo表空间里的数据文件启用了自动扩展,则数据文件进行自动扩展

4、如果undo表空间里的数据文件没有启用自动扩展,则获取undo segment里的inactive状态的extents

5、如果还是没有获得可用空间,报空间不足的错误

clip_image006

1、undo表空间中一共存在5个undo segment

2、每个undo segment包括7个extents

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/529492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
牵手阿里后 苹果仍在继续与百度合作:为国行iPhone落地AI
上一篇 2025年11月9日 09:48:09
原神5.5版本前瞻节目兑换码及内容汇总-原神5.5版本有哪些值得关注的内容与兑换码?
下一篇 2025年11月9日 09:48:09

相关推荐

  • MySQL数据库不支持中文的解决办法

    接上一篇文章,在解决了mysql+flask环境配置问题之后,往数据库存中文字符串会报1366错误,提示不正确的字符。继而发现默认的mysql采用了latin1字符集,这种编码是不支持中文的。 如果想支持中文的话,需要设置一下mysql字符集。 众所周知utf-8是可以的,gbk也没问题,为了可扩展…

    用户投稿 2026年5月10日
    000
  • php实现哪些功能

    PHP是一种通用脚本语言,可用来实现广泛的功能,包括:动态Web开发:生成响应用户请求的动态 веб页面。内容管理系统(CMS):构建允许用户管理网站内容的CMS。电子商务:开发具有购物车、订单处理和支付网关集成的电子商务网站。服务器端编程:编写命令行脚本和工具。文件操作:创建、读取、写入和删除文件…

    2026年5月10日
    000
  • SQL查询:精确判断事件过期,结合日期与时间列

    本文旨在解决数据库中事件过期判断不精确的问题,特别是当事件的过期日期和时间分别存储在不同列时。我们将探讨两种主流的sql查询策略:一种是利用逻辑运算符`or`和`and`进行分情况判断,另一种是通过合并日期和时间列为单一时间戳进行直接比较。文章将详细阐述每种方法的实现方式、适用场景及相关注意事项,确…

    2026年5月10日
    100
  • HTML表单如何实现白名单功能?怎样只允许授权用户?

    要实现%ignore_a_1%的白名单功能并确保只有授权用户操作,核心答案是必须依赖后端服务器进行严格的身份认证、会话管理、授权检查和数据验证,前端仅能提供用户体验层面的初步提示而不能保障安全;具体而言,首先通过用户身份认证(如用户名/密码或oauth)确认用户身份,服务器创建会话并返回标识符,后续…

    2026年5月10日
    800
  • 如何用C#实现数据库的跨平台迁移?使用EF Core工具?

    使用EF Core实现跨平台数据库迁移,需定义实体与DbContext,通过动态配置不同数据库提供程序,利用EF Core CLI生成并应用迁移,结合Fluent API处理数据库差异,确保结构与数据兼容。 要实现数据库的跨平台迁移,C# 中最常用且高效的方式是使用 Entity Framework…

    2026年5月10日
    000
  • Python连接MySQL 5.1:克服旧版认证与字符集兼容性挑战

    本教程详细阐述了如何使用Python 3和mysql.connector库成功连接到老旧的MySQL 5.1数据库。文章重点介绍了解决旧版认证协议和字符集兼容性问题的关键配置,特别是use_pure=True和charset=’utf8’的重要性,并提供了可运行的代码示例。同…

    2026年5月10日
    000
  • 想提升IT技能?哪些含金量高的认证值得考?

    it职业发展:高含金量认证助您成功 想在IT领域提升竞争力?选择合适的认证至关重要。本文推荐几项国内外认可度高的IT认证,助您在职业道路上更进一步。 热门认证推荐: 1. 高级软件设计师(软考高级): 国内IT领域含金量最高的认证之一。涵盖软件工程、项目管理及计算机基础知识。证明您在软件设计和开发方…

    2026年5月10日
    000
  • 什么是资产代币化(Asset Tokenization)?它如何将现实世界资产带入区块链?

    资产代币化是通过区块链将房产、股票等实体资产权益转化为可分割的数字代币。首先选择目标资产并由合规机构确权估值,随后在链上发行对应代币并通过智能合约绑定权益比例,实现自动化分红与转让。为确保真实性,引入第三方审计和去中心化预言机同步链下数据,资金流由托管账户与链上地址联动记录,提升透明度。代币化降低投…

    2026年5月10日
    000
  • MySQL、PostgreSQL、SQL Server和Oracle中空字符串、数字0和NULL占用空间有何区别

    不同数据库系统中空字符串、数字0和NULL的存储空间差异 本文比较了MySQL InnoDB、PostgreSQL、SQL Server和Oracle数据库中,空字符串(”)、数字0和NULL值在磁盘上所占用的空间大小。 MySQL InnoDB存储引擎: 整型字段: NULL: 不占用…

    2026年5月10日
    000
  • html文档中含有java怎么运行_html含java运行方法【教程】

    现代浏览器不支持Java Applet,推荐通过JavaScript调用Java后端服务或使用WebAssembly运行Java代码。 如果您在HTML文档中嵌入了Java代码,但发现无法正常运行,这通常是因为现代浏览器不再支持Java小程序(Applet)或相关插件。以下是几种实现HTML中Jav…

    2026年5月10日
    000
  • php主要运用哪些东西

    PHP 是一种通用脚本语言,主要用于 Web 开发,包括创建动态网页、网站框架和内容管理系统。此外,它还支持 Web 服务(RESTful 和 SOAP)、数据库操作、命令行脚本、桌面应用程序和图像处理。 PHP 语言的主要应用 PHP(超文本预处理器)是一种广泛应用的通用脚本语言,主要用于 Web…

    2026年5月10日
    100
  • java怎么编译运行.html_java编译运行.html方法【教程】

    Java程序的编译运行与HTML无关,需使用JDK。1. 编写HelloWorld.java文件;2. 命令行执行javac HelloWorld.java生成.class文件;3. 执行java HelloWorld运行程序。注意:HTML是网页标记语言,不能直接运行Java代码,勿将二者混淆。确…

    2025年12月23日
    000
  • 怎么运行html的applet小程序_运行html applet小程序步骤【指南】

    现代浏览器已不再默认支持Java Applet,需通过安装JRE、启用插件、使用支持NPAPI的旧版浏览器(如Firefox 52.9 ESR)、调整Java安全级别至中,并将网站添加到例外站点列表方可运行。 如果您在尝试运行HTML中的Applet小程序时遇到问题,可能是因为现代浏览器已不再默认支…

    2025年12月23日
    000
  • 使用BeautifulSoup和JSON有效抓取动态加载的网页表格数据

    本教程旨在解决使用BeautifulSoup抓取网页表格时,因数据动态加载导致部分内容缺失的问题。通过分析网页背后的API请求,直接获取并解析JSON数据源,再结合BeautifulSoup提取的HTML结构信息,最终实现完整且准确的数据抓取。文章将提供详细的代码示例和实现步骤。 理解网页动态内容与…

    2025年12月23日
    400
  • 解决BeautifulSoup爬取网页表格中动态内容缺失问题

    本文旨在解决使用BeautifulSoup爬取网页表格时,因部分数据通过JavaScript动态加载导致内容缺失的问题。通过详细分析Oracle云定价页面的案例,教程将指导读者如何识别并获取隐藏在JSON API中的动态数据,并将其与BeautifulSoup解析的静态HTML内容有效整合,最终构建…

    2025年12月23日
    500
  • HTML数据如何存储到数据库 HTML数据存储的技术方案比较

    直接存储原始HTML字符串最常见,适用于富文本编辑器输出等内容,实现简单、读取快,但需防范XSS和SQL注入;结构化JSON存储适合需程序化处理的场景,支持条件查询但渲染开销大;专用格式如Delta适用于协同编辑;分离存储则提升大型系统的查询性能与管理灵活性。 将HTML数据存储到数据库时,核心目标…

    2025年12月23日
    000
  • Java GUI在Web部署中的挑战与现代解决方案

    本文旨在澄清Java Web Start(JWS)在Web页面内运行GUI的常见误解,指出JWS用于本地应用启动而非嵌入式Web GUI。文章将探讨JWS的局限性及其被Oracle弃用的原因,介绍OpenWebStart作为其开源替代方案,并重点推荐Vaadin Flow作为使用纯Java构建真正W…

    2025年12月22日
    500
  • Java GUI Web部署策略与现代替代方案

    本文旨在澄清Java GUI应用在Web页面中直接运行的常见误区,特别是关于Java Web Start (JWS) 的作用与局限性。我们将探讨JWS的实际工作机制、其被Oracle废弃的原因,并介绍OpenWebStart作为现有JWS应用的替代方案。此外,文章将重点推荐Vaadin Flow等现…

    2025年12月22日
    700
  • 表单中的ERP怎么连接?如何对接企业资源计划系统?

    将表单数据连接到erp系统的核心是打通数据流,确保信息能从前端无缝流入企业核心系统,主要通过api接口集成、中间件/ipaas、文件导入导出和rpa四种方式实现;其中api集成因其实时性高、安全性好、可扩展性强,成为现代系统的首选方案,尤其适用于支持开放api的erp系统;当业务涉及多系统复杂集成时…

    2025年12月22日
    100
  • HTML如何实现文本加密?怎么隐藏敏感内容?

    纯前端技术无法真正加密或安全隐藏敏感内容,因为html、css和javascript均在客户端运行,源代码和数据可被用户通过开发者工具轻易查看;2. 所谓“隐藏”如display: none、hidden属性或javascript移除dom,仅是视觉上的屏蔽,数据仍存在于页面中;3. 真正的安全必须…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信