UNDO自我理解总结
【场景】
当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据。
【基本概念】
在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从UNDO中拿到原本的数据了。
UNDO是在Oracle 11g被提出的,由UNDO tablespace进行管理,常用“撤销段”说明,用于进行撤销操作
ROLLBACK是在Oracle 9i出现的,存在于system表空间,常用“回滚段”说明,用于进行回滚操作
【区分】
-- 相同点:
撤销段与回滚段都是用于恢复旧数据的,
-- 不同点:
-| 撤销段是位于undo表空间下的,并且性能较优,数据块较大
当使用的是undo表空间时,那么undo_segment是auto的状态
-| 回滚段是位于system表空间下的,性能较弱,数据块也比较小
当使用的是system表空间下的rollback时,那么rollback_segment是auto状态,undo_segment是manual
【机制】
UNDO表空间是以一个数据文件(类似于undotbs.dbf)的格式存放在磁盘中的,但是它有一段undo segment是存放在了内存中
查看undo数据文件存放的位置:
select * from dba_data_files where tablespace_name like 'UNDO%
当执行update语句的时候:
1)首先,会在buffer cache里找到undo segment相应的数据块(如不存在,则创建数据块),进行修改
2)然后,这个修改的操作,会记录到redo log里
3)当在写磁盘的时候,会先把redo log /undo segment的文件写进去
4)当用户COMMIT后,DBWR会将修改的数据块写入undo的数据文件里
【update语句的详细过程】
例如,执行以下的update语句:
当在执行一条更新语句的时候,例如:
--假设sal=3000,需要更新数据
update emp set sal = 4000 where empno = 02
1) 会先检查empno=02是否在存在buffer cache里,不存在则创建
==> 这一步是查看之前empno是否被修改过,已经存在了缓存中
2)在回滚段的事务表分配事务槽 ==> 这个操作会被记录到redo log里
3)从回滚段里读sal的数据或在buffer cache里创建数据 sal = 3000 ==> 这个操作会被记录到redo log里
4)修改sal = 4000,数据变更,将此数据以及操作记入redo log里
5)如果用户操作提交(commit),会在redo log buffer里记录提交信息,并在回滚段标记该事务为inactive
由以上的流程可以看出,在update操作时,就会用到undo的资源,并且也用到了redo的资源。
【DML操作的undo使用资源比较】
DML操作会使数据产生变化,这就需要用到undo来保证数据的一致性,但是每一个DML操作,undo的使用都会不同。
-- insert 操作
undo 要记录到插入数据的rowid即可
-- update操作
undo要记录被更新字段的旧值即可
-- delete操作(资源使用最高,如果删除的量很大,会造成堵塞。){建议分批删除,分次提交}
undo要记录一整行完整的数据
-----TO BE CONTINUE ------
【扩展知识】
-- buffer cache的概念:
当有请求数据,CPU就要去读取数据,如果直接从磁盘读取(并且数据量很大),那么会导致IO过高,速度过慢。
为了解决这个问题,就产生了“中间站” -- buffer cache(数据高速缓存区){位于内存中}
所有请求的数据都会先写入到“中间站”,再定时将数据更新到磁盘中,这样就避免了点对点的压力过大
-- 拆分开了的buffer 、 cache的概念:
buffer: 是还没有被写入disk里的数据
cache:已经被disk读,并且保存至之后使用
-- undo块的状态: (undo_retention)
Active(活动的):未提交事务的undo数据,这些undo数据永远不能覆盖,用于回滚rollback事务。
Inactive:表示该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。
Expired(过期的):表示该undo持续inactive的时间超过undo_retention所指定的时间。
已提交事务的undo数据,这些undo数据可以覆盖。
Inexpired(未过期的): 事务已提交,但事务提交前,有些查询正在进行,它要读取的是提交前的数据,这部分数据就是未过期数据。
如果这部分undo数据被覆盖了,就会发生ora-01555错误。
Freed:表示该undo块内容是空的,从来没有被使用过。
UNDO自我理解总结的更多相关文章
- Thread线程join方法自我理解
Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...
- Redo与Undo的理解
本文概要本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写.但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节 ...
- 关于C#的委托(delegate)的自我理解
首先描述一个事情,一个老师饿了,他要去买东西填饱肚子,然后他发现他的学生“小李”在玩,没学习,于是就委托“小李”去帮他买吃的. 根据这件事我们来分析: 首先得有个老师(老师饿了是他的方法,老师买东西也 ...
- android 的生命周期自我理解
android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...
- Java内部类的自我理解
本文借鉴网络上多位大牛的博客和文章.感谢各位不知名人士的分享. 一.什么事内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的成员,而且依附于外部类而存在的.内部类能够为静态,可用p ...
- 关于 String 自我理解
String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...
- Oracle redo/undo 原理理解
一. 什么是redo(用于重做数据) redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文 ...
- AC自动机自我理解和模板
给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...
- AngularJs-$parsers自我理解-解析
$parsers 首先先了解下它具体的作用,当用户与控制器进行交互的时候.ngModelController中的$setViewValue()方法就会被调用,$parsers的数组中函数就会以流水线的 ...
随机推荐
- Qt——数据的隐式共享
一.隐式共享类 在Qt中有很多隐式共享类( Implicitly Shared Classes ),什么是隐式共享呢,请参考官方文档的说明. 好吧,翻译一下—— 许多C++类隐式地共享数据,使得资源使 ...
- 我的bootstrap学习
前端开发框架bootstrap Bootstrap 安装 <link ref="stylesheet" href="bs/css/bootstrap.css ...
- BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)
容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新.然而这显然是有后效性的,正常的dp没法做. 虽然spfa已经死了,但确实还是挺有意思的.只需要用spfa来更新dp值就可以了.dij ...
- 题解 P1200 【[USACO1.1]你的飞碟在这儿Your Ride Is He…】
cin其中有很多小众的函数与其他重叠 不妨拿来用用(作死不止) 划重点!!! 1.cin.get(),相当于c里面的getchar(),可以往里面输入字符 2.cin.getline(),相当于str ...
- CPP 替代 PIL 图片处理(缩略图生成)
python中使用PIL(Pyhton Image Library)进行图片处理,好处就是编写简单方便,但是不能很好利用机器多核的特点,于是在项目中决定使用cpp来实现图片处理. 项目中的图片处理主要 ...
- QoS专题-第2期-QoS实现工具之MQC
QoS实现工具之MQC QoS技术可以对网络中报文进行分类处理,根据优先级提供不同的差分服务,如何实现这种差分服务呢?我们有一种强大的配置方法-模块化QoS命令行MQC(Modular QoS Com ...
- Cycle Sort (交换次数最少的排序)
该算法的效率并不高.但是却提供了一个很好的思路.如何让一个序列在最小交换次数下实现有序. Cycle Sort 翻译成中文是 圈排序. 这个圈在于需要交换的数据形成圈. 具体一点: 如: Array ...
- ZJOI2018 D1
归途的车上满是悲伤的气息 虽然早就预言到D1会滚粗,但一切都结束之后还是特别难过. 延时15min 50min T1 30pts 1.5h T2 10pts 2.5h T1 50pts 4.5h T3 ...
- Spark集群基础概念 与 spark架构原理
一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...
- [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 32MB Input 第一行是一个正整数n(n< ...