什么是回滚和撤销

  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

Oracle ____Undo的更多相关文章

  1. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  2. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  3. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  4. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  5. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  6. 基于Oracle安装Zabbix

    软件版本 Oracle Enterprise Linux 7.1 64bit Oracle Enterprise Edition 12.1.0.2 64bit Zabbix 3.2.1 准备工作 上传 ...

  7. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  8. 使用Oracle官方巡检工具ORAchk巡检数据库

    ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...

  9. 利用Oracle RUEI+EM12c进行应用的“端到端”性能诊断

    概述 我们知道,影响一个B/S应用性能的因素,粗略地说,有以下几个大的环节: 1. 客户端环节 2. 网络环节(可能包括WAN和LAN) 3. 应用及中间层环节 4. 数据库层环节 能够对各个环节的问 ...

随机推荐

  1. java代码示例(6-1)

     创建Administrator.java /** * 需求分析:定义用户名,密码 * @author chenyanlong * 日期:2017/10/15 */ package com.hp.te ...

  2. vue2.0 之标签属性

    标签属性v-bind <template> <div> <ul> <li v-for="item in list"> {{ item ...

  3. Window配置环境变量

    拿Java为例,讲一下怎么配置环境变量使得javac可以在全局被调用: 1.添加环境变量 例如我们的Java下载在了:D:\Java\v1.8 我们就到环境变量那添加一个例如叫“Java_path”的 ...

  4. 因缺失log4j.properties 配置文件导致flume无法正常启动。

    因缺失log4j.properties 配置文件导致flume无法正常启动 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.报错:log4j:WARN No appenders ...

  5. POJ 2127 Greatest Common Increasing Subsequence

    You are given two sequences of integer numbers. Write a program to determine their common increasing ...

  6. PHP 将amr音频文件转换为mp3格式

    说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3.在网页端使用HTML5的audio标签来 ...

  7. 三、内存管理单元---MMU

    3.1 MMU介绍 3.1.1 MMU 特性 内存管理单元(Memory Management Unit)简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.现在的多用户多进 ...

  8. 找第二大的数SQL-Second Highest Salary

    1: 找小于最大的最大的 select max(Salary) from Employee where Salary<(select MAX(Salary) from Employee); 2. ...

  9. JavaScript之数值计算

    //两等长数组对应元素之间做减法运算[可拓展:基本运算(+/-*//)] function array_dif(length,arrayA,arrayB){ var array = new Array ...

  10. luogu P1268 树的重量

    一开始把这题想复杂了,,, 这里记\(di[i][j]\)表示\(i\)到\(j\)的距离 首先如果\(n=2\),答案显然为\(di[1][2]\) 如果\(n=3\) 懒得画图了盗图过来 那么3号 ...