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 
  • 相关阅读:
    js格式化文件大小,单位:Bytes、KB、MB、GB
    Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据
    ExtJs定时消息提示框,类似于QQ右下角提示,ExtJs如何定时向后台发出两个请求并刷新数据实例
    Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
    Java 防SQL注入过滤器(拦截器)代码
    mysql8源码安装和MGR
    linux基础
    ThreadLocal
    redis缓存雪崩、穿透、击穿概念及解决办法
    ThreadLocal可能引起的内存泄露
  • 原文地址:https://www.cnblogs.com/ios9/p/7660879.html
Copyright © 2011-2022 走看看