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来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
随机推荐
- 阿里云的9折推荐码 8DIER4
推荐码: 8DIER4 我有一个阿里云9折推荐码:8DIER4,分享给你,第一次购买云服务器或云数据库可享受原价9折优惠,还可多人使用,拿走不谢. 阿里云地址:http://www.aliyun.co ...
- linux---mysql远程访问
1.远程连接上Linux系统,确保Linux系统已经安装上了MySQL数据库. 登陆数据库.mysql -uroot -p(密码). 2.创建用户用来远程连接 GRANT ALL PRIVILEGES ...
- 解决在VS2015下用C++开发的DLL在WIN7上无法加载运行
首先用Dependency Walker检查该DLL依赖的库,如下图所示: 依赖的动态库除了KERNEL32.DLL.USER32.DLL外,还包括了MSVCP120D.DLL以及MSVCR120D. ...
- 各公司年资金归集汇总sql
select bd_accid.accidcode, bd_accid.accidname, -- fts_voucher_b.interestdate, -- fts_voucher_b.summa ...
- C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...
- vue.js 2.0开发(4)
使用vue-cli,首先安装: npm install -g vue-cli 安装完了执行vue命令,会出现 vue init <template-name> <project-na ...
- 彻底弄懂响应式设计中的em和rem
前一阵子在响应式开发中遇到了em和rem的问题,也上网搜过一些文章,篇幅很长,也没有仔细看,今天来总结一下. rem是指:根元素(root element,html)的字体大小, em是指:父元素的字 ...
- 13 年的 Bug 调试经验总结
在<Learning From Your Bugs>一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug.最近,我回顾了我所有的194个条目(从13岁开始),看看有什么经验教训是我可 ...
- android 代码生成selector drawable
public static StateListDrawable makeSelector(Context context, int idNormal, int idPressed, int idFoc ...
- background-position值为像素时的使用方法
以前一直都知道这个属性,但是每次使用的时候都是试来试去,感觉很麻烦,所以花了一点小时间研究了一下,很简单,跟大家分享一下. 此属性需要在background属性中使用,有关background属性的值 ...