热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

管理还原数据

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

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数据块,恢复数据。

实例恢复

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

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

配置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

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
author-avatar
手机用户2602921437_525
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有