zoukankan      html  css  js  c++  java
  • Oracle ____Undo

    什么是回滚和撤销

      1 update emp set sal=4000 where 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 select * from v$rollname ;


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

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

      1 alter tablespace undotbs1 retention guarantee |noguarantee

    测试

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



    UNDO表空间大小评估参考:

      1  --要确定Oracle需要的UNDO 表空间的大小,需要以下三条信息: 
      2 --A、UR :以秒为单位的UNDO_RETENTION
      3  SQL> show parameter undo_retention;
      4 
      5 --B、UPS:计算业务高峰期每秒产生undo数据块的个数
      6 SQL> select max(undoblks / ((end_time - begin_time)*24*3600)) from v$undostat;
      7 
      8 ---C、DBS:得到数据块大小
      9 SQL> show parameter db_block_size;
     10 
     11 --参考计算公式:
     12 --UndoSpace = UR * UPS * DBS + DBS * 24
     13 
     14 --参考计算UNDO表空间大小语句:
     15 SELECT (UR * UPS * DBS + DBS * 24) / 1024 / 1024 AS "undo size(M)"
     16  FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),
     17       (SELECT max(undoblks / ((end_time - begin_time) * 24 * 3600)) AS UPS FROM v$undostat),
     18       (SELECT value AS DBS FROM v$parameter WHERE name = 'db_block_size');
     19 
     20 --如果现在UNDO表空间的大小小于计算出来的大小,建议将其增大至计算出来的推荐值值以上。
     21 
     22 
     23  --另外一种计算undo所需大小的方法:
     24     --计算undo表空间所需的大小
     25         SQL> SELECT (
     26                (SELECT MAX(undoblks)/600 * MAX(maxquerylen) FROM v$undostat) *
     27                  (SELECT value FROM v$parameter WHERE name = 'db_block_size'))/1024/1024 as Need_Size
     28              FROM dual;
     29 
     30 
     31 --查看当前undo表空间的大小
     32 
     33 SQL> SELECT t.name,d.name,d.bytes/1024/1024 as TotalSize,t.flashback_on,d.status
     34      FROM v$tablespace t
     35      JOIN v$datafile d
     36      USING (ts#)
     37      WHERE t.name LIKE 'UNDO%';
     38 
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/ios9/p/7660879.html
Copyright © 2011-2022 走看看