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来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
随机推荐
- 给破坏性的Rake任务加把锁 | Rails
抄自这里 直接贴代码 # lib/tasks/skip_prod.rake desc 'Raises exception if used in production' task skip_prod: ...
- double精度问题
一个Double值由2个Double相加,比如明明是91.2 + 2.4,结果应为93.6,为什么结果是93.6000000000001 为什么会无端地在小数点后面加很多个0,最后还是一个1 ? 计算 ...
- bootstrapvalidator校验、校验清除重置
//保存 function saveAdmin(){ //开启验证 $('#saveadmin_form').data('bootstrapValidator').validate(); if(!$( ...
- java.lang.ClassCastException: com.bjsxt.registration.model.User_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
1.懒加载 因为此时用的load懒加载机制,到jsp页面在发送sql语句的时候session已经关闭了.所以会报以上错.可以添加过滤器,使session在请求响应完成后再关闭. 过滤器要配置在stru ...
- 家里蹲大学数学杂志 Charleton University Mathematics Journal 官方目录[共七卷493期,6055页]
家里蹲大学数学杂志[官方网站]从由赣南师范大学张祖锦老师于2010年创刊;每年一卷, 自己有空则出版, 没空则搁置, 所以一卷有多期.本杂志至2016年12月31日共7卷493期, 6055页.既然做 ...
- 使用Lamda生成函数
#include <functional> int main() { std::function<]; ; i < ;i++ ) fn[i] = [=]() {return i ...
- 用c++写一个简单的计算器程序
// 050305.cpp : 定义控制台应用程序的入口点.// // 050304.cpp : 定义控制台应用程序的入口点.////四则运算#include "stdafx.h" ...
- 解决java文件编码和windows7系统(中文版)默认编码冲突所导致的乱码情况
开篇从一个比较简单但是也比较蛋疼的问题开始吧. 背景介绍:我是新手小白,初学java. 问题介绍:在使用UTF-8编码格式写java文件时,编译出现问题. 原因分析:1.java文件的编码格式是UTF ...
- Arch Linux LibreOffice 中文输入法不能切换
From: http://blog.csdn.net/shallowgrave/article/details/8501629 卸载libreoffice-kde4 # pacman -R libre ...
- R语言向量
R语言基础:向量 心无咎 2012-04-02 13:37:00 向量(vector)1.seq():产生有规律的数列,间距省略时默认值为1. 例1:seq(10, 20, 0.5) ...