什么是回滚和撤销

  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. django中的数据库外键操作

    以MYSQL为例: (1)在model中定义两个数据表,食物信息和食物类别信息 class foodInfo(models.Model):     food_id = models.AutoField ...

  2. Web Scraping with Python

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  3. Spark进阶之路-Spark HA配置

    Spark进阶之路-Spark HA配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 集群部署完了,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借 ...

  4. free命令常用参数详解

    free命令常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在运维期间我们会经常去查看服务器硬件信息,比如说内存,大家可能知道看内存用“[root@yinzhengji ...

  5. java中常量文件的配置与读取

    java中常量文件的配置与读取: package com.floor.shop.user.util; import java.io.InputStream; import java.io.InputS ...

  6. 机器学习:python使用BP神经网络示例

    1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够) 1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调 ...

  7. WebStrom设置默认浏览器

  8. Swift下使用Xib设计界面

    虽然Swift可以纯代码设计界面,不过不利用现有的可视化工具有时候有点效率低.下面是使用xib设计方法,部分代码来自网上. (1)新建View 2.新建View class 3.DemoView.sw ...

  9. shell反弹总结

    NC反弹 常用的命令: -l   监听模式 -n 指定数字的IP地址 -p   port(本地端口) -s addr 本地源地址 -v 详细输出 -i secs 延时的间隔 -e  filename  ...

  10. Elastic Job入门(2) - 使用

    运维平台 elastic-job-lite-console-${version}.tar.gz可通过mvn install编译获取,下载源码,进入console目录,执行: mvn clean ins ...