博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle ____Undo
阅读量:6214 次
发布时间:2019-06-21

本文共 3056 字,大约阅读时间需要 10 分钟。

什么是回滚和撤销

1  emp  sal=4000  empno=7788

语句执行过程

  • 1 检查empno=7788记录是否在buffer cache ,如果不存在,则读取到buffer cache
  • 2 在回滚段表空间的相应回滚事务表上分配事务槽,这个操作需要记录redo log 信息
  • 3 从回滚段读入或者在buffer cache中创建sal=3000的前镜像,这需要产生redo log 信息并记入redo log buffer
  • 4 修改sal=4000,这就是update数据变更,需要记录redo log buffer
  • 5 单用户提交commit 时,会在redo log buffer 记录提交信息,并在回滚段标记该事务未非激活inactive

      在事务开始时,首先要在回滚表空间分配一个事务槽,分配空间,然后创建前镜像,此后事务修改才能进行,oracle 必须以此来保证事务是可回滚的。

       如果用户提交了事务,oracle 会在日志文件记录提交,并写出日志,同时会在回滚段中把该事务标记为已提交,提交事务在回滚段事务的状态为inactive ,然后该事务所使用的回滚空间被重用,回滚段空间是循环使用。如果用户回滚事务,则oracle从回滚段中把前镜像读取出来,修改数据缓冲区,完成回滚,这个过程也会产生redo,回退这个操作时很昂贵的

    在oracle 性能优化中,有一个性能指标为平均事务回滚率rollback per transaction

回滚段存储的内容

对于insert 操作,回滚只需要记录插入记录的rowid ,指需要将该记录根据rowid删除即可。
对于update操作,回滚段只需要记录被更新字段的旧值即可(前镜像)回顾时通过旧值覆盖新值即可完成回滚
对于delete 操作,oracle 则必须记录整行的数据,在回滚时,oracle 通过一个方向操作恢复删除的数据

insert 产生最少undo

update 其次
delete 最多

并发控制和读一致性

oracle内部使用SCN作为数据库时钟,SCN进行读一致性判断
假定查询时间为T1,则在查询获取块中,如果数据块提交SCN小于T1,则oracle接收数据,如果提交SCN大于T1或者数据被锁定修改尚未记录commit scn,则oracle需要通过回滚段构造前镜像来返回结果。这就是读一致性原理。

oracle 9i开始,oracle引入了自动管理undo表空间。

undo_retention表示在自动管理模式下,当回滚段变得非活动inactive之后,回滚段中的数据在被覆盖前保留的时间,该单位秒

查看回滚段的信息

1  *  v$rollname ;

在系统繁忙的时候,可以从数据库的警告日志文件中查看回滚段动态创建和释放的过程。动态创建和释放是undo表空间优势之一

undo_retention =0  oracle启动自动调整以满足最长运行查询需要。在警告日志中可以看到autotune of undo retention is turned on

1  tablespace undotbs1 retention guarantee |noguarantee

测试

1   2  --将undo空间自动扩展取消  3  undo tablespace undotbs2 datafile '/u01/undotbs2.dbf'  5m ;  4   5   datafile  '/u01/undotbs2.dbf' autoextend   6   7  system  undo_tablespace=undotbs2;  8   9 -有一张大表 10 conn scott/oracle 11    e   *  emp ; 12    e  *  e; 13 --一-直执行会报错 14 ERROR  line 1: 15  ORA-30036: unable  extend segment  8  undo tablespace 'UNDOTBS2' 16  17 --修改表空间属性 18  19  20  (*)  e ; 21   22   i  1 .. 1000 loop 23    e  rownum <=1001; 24  ; 25   loop; 26   ; 27  / 28  29 --报错ora-30036 30  31 ---修改undo表空间属性 32  tablespace undotbs1 retention noguarantee 33 --删除成功 34  --这就是guarantee 和noguarantee的区别 35

UNDO表空间大小评估参考:

1  --要确定Oracle需要的UNDO 表空间的大小,需要以下三条信息:   2 --A、UR :以秒为单位的UNDO_RETENTION  3  > show parameter undo_retention;  4   5 --B、UPS:计算业务高峰期每秒产生undo数据块的个数  6 >  (undoblks / ((end_time - begin_time)*24*3600))  v$undostat;  7   8 ---C、DBS:得到数据块大小  9 > show parameter db_block_size; 10  11 --参考计算公式: 12 --UndoSpace = UR * UPS * DBS + DBS * 24 13  14 --参考计算UNDO表空间大小语句: 15  (UR * UPS * DBS + DBS * 24) / 1024 / 1024  "undo size(M)" 16   (   UR  v$parameter  name = 'undo_retention'), 17       ( (undoblks / ((end_time - begin_time) * 24 * 3600))  UPS  v$undostat), 18       (   DBS  v$parameter  name = 'db_block_size'); 19  20 --如果现在UNDO表空间的大小小于计算出来的大小,建议将其增大至计算出来的推荐值值以上。 21  22  23  --另外一种计算undo所需大小的方法: 24     --计算undo表空间所需的大小 25         >  ( 26                ( (undoblks)/600 * (maxquerylen)  v$undostat) * 27                  (   v$parameter  name = 'db_block_size'))/1024/1024  Need_Size 28               dual; 29  30  31 --查看当前undo表空间的大小 32  33 >  t.name,d.name,d.bytes/1024/1024  TotalSize,t.flashback_on,d.status 34       v$tablespace t 35       v$datafile d 36       (ts#) 37       t.name  'UNDO%'; 38

转载地址:http://zosja.baihongyu.com/

你可能感兴趣的文章
机器学习是什么--周志华
查看>>
猜你喜欢-----推荐系统原理介绍
查看>>
一个适用于层级目录结构的makefile模版
查看>>
【leetcode】Candy(python)
查看>>
循环调用修正sic86
查看>>
unity3d 血液
查看>>
学习英语每日一 On the house. 赠品
查看>>
用户终端配置方法
查看>>
二维码的生成细节和原理
查看>>
创建 Web 前端开发环境
查看>>
[转]NopCommerce MVC 插件机制分析
查看>>
【转】linux 中fork()函数详解
查看>>
Qt 4.8.5 jsoncpp lib
查看>>
【转】质量管理的思考
查看>>
BZOJ1077 : [SCOI2008]天平
查看>>
error MIDL2311 : statements outside library block are illegal in mktyplib compatability mode
查看>>
【转】spin_lock & mutex_lock的区别? .
查看>>
Kubernetes集群搭建过程中遇到的问题
查看>>
java通过文件头来判断文件类型
查看>>
Servlet作业1-实现注册登录
查看>>