UNDO内存结构剖析
UNDO内存结构剖析
一、场景
Oracle的 C事物从早上9:00开始读取A表全部10w行数据,这个而读取需要经历5分钟。在9:01的时候,B事物将A表删除100条记录,那么,当9:05的时候,事物C读取完成,能读取到多少条记录?
其实,按照一致性原则,需要读取10w行记录,而不是9900行。这个,oracle将如何实现呢?
二、Undo的内存结构原理
只要oracle undo空间足够大,undo能保存所有数据库的更改,能使表数据闪回到任意时刻。如何做到这一点,需要从oracle的undo空间结构说起。

数据块S中,保存了上一次事物的XID。能够找到UNDO表空间中的事务表和回滚块。而此时,B事物对数据块S进行修改,然后提交,此次过程中,UNDO表空间结构变成了什么样呢?这个过程中,因为原先事物已经提交,B事物会覆盖数据行的事物信息XID,UNDO空间会为B事物分配新的事物表B和新的回滚块B,undo表空间的链接结构就变成如下图:在上述示例中,假设数据块S是C事物需要读取的数据块。在9:00时,它在UNDO表空间结构,如下:

从图中,可以得知,当B事物覆盖了以前的事物槽信息,重新构建了UNDO结构之后,只要事物表A和回滚段A没有被其他事物覆盖,都能在UNDO空间中被找到。而事物表A和回滚段A是否被覆盖,取决于UNDO空间的大小。
三、ORACLE实现准确读的原理
1、9:00,开始读取时,数据库的SCN假设为scn900。
2、9:01,B事物对数据块S进行修改,并提交,数据表A被删除了100条记录,此时,数据块的SCN被更改为scn901.
3、C事物开始读取数据块S,发现SCN为901,说明数据块在C事物开始读之后,被别的事物修改了,此时数据块需要读取它之前的数据,也就是scn号小于scn900的数据。
4、构造cr块。按照上图中,根据数据行,能找到当前的事务表,以及当前的回滚块。而在当前回滚块中,又记录了前一个事物对应的事务表,根据前一个事物表对应的回滚块,oracle能找到小于scn900的数据块,并构造成cr块,读取出来。
由以上的逻辑,可以看出,在undo表空间中,只要表空间够大,可以由当前事物,找到任何之前的事物所做的修改,并且能还原到这个修改之前的数据状态。这就是为什么能通过as of timestamp sysdate-1/24找到1天之前的数据的原因了。
四、ORA-01555(snap too old)
继续分析以上场景。如果查询时间很长,在查询的过程中,数据块S被修改了10次,而如果undo空间很小,10次中的前两次,在undo空间中的事务表和回滚块都被覆盖了。而按照oracle的规则,查询需要查询到这10次修改之前的数据块,此时,oracle已经无法构造出来了,就出现了经典的ora-01555错误。
这个错误有两个形成原因:(1)查询时间过长。(2)undo表空间过小。
如果频繁出现ora-01555的错误,就需要观察UNDO的大小是否合适了。
UNDO内存结构剖析的更多相关文章
- 【转】Redis学习---哈希结构内存模型剖析
[原文]https://www.toutiao.com/i6594624365906625032/ 概述 在前文<Redis字符串类型内部编码剖析>之中已经剖析过 Redis最基本的 St ...
- [转]oracle学习入门系列之五内存结构、数据库结构、进程
原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...
- spark 源码分析之十五 -- Spark内存管理剖析
本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...
- (1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
目录 1.学习笔记之mysql体系结构(C/S架构) 2.mysql整体架构 3.存储引擎 4.sql语句处理--SQL层(内存层) 5.服务器内存结构 6.mysql如何使用磁盘空间 7.mysql ...
- jvm系列(二):JVM内存结构
JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...
- JVM之内存结构
JVM是按照运行时数据的存储结构来划分内存结构的.JVM在运行Java程序时,将他们划分成不同格式的数据,分别存储在不同的区域,这些数据就是运行时数据.运行时数据区域包括堆,方法区,运行时常量池,程序 ...
- Delphi XE7中各种字符串与字符类型的内存结构
1. ShortString 类型 定义:type ShortString = string[255]; 内存结构与大小:ShortString 是每个字符为单字节的字符串.ShortString 的 ...
- Oracle之内存结构(SGA、PGA)
一.内存结构 SGA(System Global Area):由所有服务进程和后台进程共享: PGA(Program Global Area):由每个服务进程.后台进程专有:每个进程都有一个PGA. ...
- 浅析JVM内存结构和6大区域(转)举例非常好
内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
随机推荐
- [综] PCA降维
http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction 設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mx ...
- 处理ios webview 更新缓存本地css、js后webview缓存无法更新的问题
项目中需要使用app本地css.js,并且可以根据服务下发自动更新本地css.js.测试发现只要更新后的css或者js和更新前路径一致,webview加载的还是更新前的css.js.怀疑是webvie ...
- php中的gethostbyname函数有问题
在根据域名获取ip的批量执行中,gethostbyname有些域名得到的ip是不正确的,不知道是不是版本的bug. 解决办法是,使用执行命令的方式获取 echo exec("host dom ...
- 【与软件无关】2013赤峰地区C1科目三考试攻略【绝对原创】
期待很久的科目三,终于在开考了.传说中的全部电子评判,让习惯给考官送礼的赤峰人民无所是从.据说前几天曾经有一个驾校,考了一整天,八十多个人一个没过的. 我这个攻略是今天通过考试后的一点心得,希望能有用 ...
- hive与hbase整合过程
实现目标 Hive可以实时查询Hbase中的数据. hive中的表插入数据会同步更新到hbase对应的表中. 可以将hbase中不同的表中的列通过 left 或 inner join 方式映射到hiv ...
- jquery “做页面滚动到某屏时改变状态标题” 所用知识点记录
浏览器滚动条滚动时触发事件 //浏览器滚动条滚动时触发事件 $(window).scroll(function(){}); 浏览器窗口大小改变时触发事件 //浏览器窗口大小改变时触发事件 $(wind ...
- AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
python2导入StringIO模块,直接: from StringIO import StringIO 对于python3,StringIO和cStringIO模块已经没了,如果要使用的话,需要导 ...
- 常用SQL Server日期格式化
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 Select CONVERT(varchar(100), GETDATE(), 24): 10 ...
- sql2008r 收缩数据库日志log文件;删除errorlog文件的方法
1.清空log文件,以减少数据库文件log所占的空间 USE dbname1 ; GO ALTER DATABASE dbname1 SET RECOVERY SIMPLE;--设置简单恢复模式 GO ...
- PD脚本导出到数据库后没有注释问题
昨天PD里建了几张表,建表的时候我在NAME栏位写了中文说明,但是脚本在数据库里生成表以后,发现中文说明没有了,需要自己在“注释”栏位添加才行,如下图: 我想要达到的效果如下图: 解决方法: 1. ...