了解ORACLE UNDO及其真实使用率

首先了解什么是UNDO,可以说UNDO是ORACLE中一个非常实用的功能

UNDO数据也称为回滚(ROLLBACK)数据,它用于确保数据的一致性.当执行DML操作时,事务操作前的数据被称为UNDO记录.UNDO段用于保存事务所修改数据的旧值,其中存储着被修改数据块的位置以及修改前数据

UNDO数据的作用:

1.回退事务

当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变化.假定用户A执行了语句UPDATE emp SET sal=1000 WHERE empno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中.

2.读一致性

用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保数据的一致性.例如,当用户A执行语句UPDATE emp SET sal=1000 WHERE empno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的.

3.事务恢复

事务恢复是例程恢复的一部分,它是由oracle server自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracle server时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务.

4.倒叙查询(FlashBack Query)

倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改并提交了事务(雇员原工资为3000),为了取得10:00之前的雇员工资,用户可以使用倒叙查询特征.

使用UNDO参数

1.UNDO_MANAGEMENT

该初始化参数用于指定UNDO数据的管理方式.如果要使用自动管理模式,必须设置该参数为AUTO,如果使用手工管理模式,必须设置该参数为MANUAL,使用自动管理模式时,oracle会使用undo表空间管理undo管理,使用手工管理模式时,oracle会使用回滚段管理undo数据,需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告.

2.UNDO_TABLESPACE

该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间.

在RAC(Real Application Cluster)结构中,因为一个UNDO表空间不能由多个例程同时使用,所有必须为每个例程配置一个独立的UNDO表空间.

3.UNDO_RETENTION

该初始化参数用于控制UNDO数据的最大保留时间,其默认值为900秒,从9i开始,通过配置该初始化参数,可以指定undo数据的保留时间,从而确定倒叙查询特征(Flashback Query)可以查看到的最早时间点.

UNDO的真实使用

之前看有人说是用dba_free_space来看UNDO剩余空间,其实是有些出入的,真实的UNDO使用情况使用的是DBA_UNDO_EXTENTS视图

那么分享一个查看表空间剩余空间的脚本

select tablespace_name, sum(free_mb) + sum(expired_mb) free_mb
from (select tablespace_name,
round(sum(nvl(bytes, 0)) / 1024 / 1024, 2) free_mb,
0 expired_mb
from dba_free_space
group by tablespace_name
union all
select tablespace_name,
0 free_mb,
round(sum(nvl(bytes, 0)) / 1024 / 1024, 2) expired_mb
from dba_undo_extents d
where tablespace_name =
(select value from v$parameter where name = ‘undo_tablespace‘)
and status = ‘EXPIRED‘
group by tablespace_name)
group by tablespace_name;
时间: 2024-08-18 22:33:02

了解ORACLE UNDO及其真实使用率的相关文章

Oracle 11gR2 Database UNDO表空间使用率居高不下-转载

客户的数据库是Oracle Database 11.2.0.3.0 for AIX 6.1 64bit的单机数据库.客户查询DBA_FREE_SPACE发现UNDO表空间的使用率高达98%以上.客户的UNDO表空间已经手动扩展到了25GB,且一直在增加,为了UNDO表空间能及时的被释放,UNDO表空间对应的所有数据文件自动扩展都被关闭.查询DBA_UNDO_EXTENTS发现在UNDO表空间中当前没有ACTIVE的EXTENT存在,UNEXPIRED的占到总空间的60%,有30%是EXPIRED

监控和管理Oracle UNDO表空间的使用

监控和管理Oracle UNDO表空间的使用 对Oracle数据库UNDO表空间的监控和管理是我们日常最重要的工作之一,UNDO表空间通常都是Oracle自动化管理(通过undo_management初始化参数确定):UNDO表空间是用于存储DML操作的前镜像数据,它是实例恢复,数据回滚,一致性查询功能的重要组件:我们常常会忽略对它的监控,这会导致UNDO表空间可能出现以下问题: 1).空间使用率100%,导致DML操作无法进行. 2).告警日志中出现大量的ORA-01555告警错误. 3).实

第15章 oracle undo表空间管理

2015-10-23 目录 参考资料 [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013 [2] Oracle undo 表空间管理 [3] undo表空间概述 [4] Oracle UNDO表空间的管理 [5] Oracle的UNDO表空间管理总结 [6] UNDO表空间的管理 [7] UNDO表空间的管理 [8] 监控和管理Oracle UNDO表空间的使用 [9] 谈谈undo表空间

Oracle Undo tablespace恢复(无备份)

Oracle Undo tablespace恢复 系统环境:   操作系统:RedHat EL55   Oracle:  Oracle 11gR2   Oracle 9i后,采用了undo tablespace管理undo数据,实现undo的自动管理,本案例演示了undo表空间被破坏后如何恢复:如果有备份,通过备份恢复非常容易,但在没有备份的情况下,就需要采用非常规手段来恢复了,呵呵. 1.案例应用环境 undo表空间undo segments: 14:34:44 [email protecte

Oracle UNDO 监控

Oracle 10g及后续版本较以前版本有一新特性即自动调整undo retention时间,大大简便了管理,对于自动扩展(autoextend on)的undo表空间,参数undo_retention设置成为Oracle自动调节undo retention的最低阀值.对于非自动扩展(autoextend off),非guarantee 的undo 表空间,Oracle会根据undo表空间大小和v$undostat的历史信息(是否统计undo信息是由隐含参数 _collect_undo_stat

Oracle Undo Redo(转)

转贴: http://www.cuug.com/xueyuanzhuanqu/jishuwenzhang/201108/jishuwenzhang-245.html http://paul0407.blogspot.tw/2008/01/oracle-redoundorollback-segment.html http://blog.csdn.net/robinson_0612/article/details/5731158 Oracle Undo Redo Redo redo 记录 trans

Oracle Undo 查询表中历史数据

Undo 表空间用于存放Undo 数据.当执行DML操作时,Oracle会将这些操作的旧数据写入Undo 段.用于对数据库 一致读,事务回滚 之类的操作. 换而言之,在特殊情况下,我们可以用它来找回被错误操作的数据.例如: SELECT t.fid   FROM ct_bas_province AS OF TIMESTAMP to_date('2014-11-21 22:01', 'yyyy-mm-dd HH24:mi') t  WHERE t.fnumber = '海南省'; 即在要查询的表名

oracle undo回滚段详解

1.Undo是干嘛用的?   在介绍undo之前先说一下另外一个东西 transaction ,翻译成交易或事务.我们在进行一个事务的过程中需要申请许多资源,一个复杂的事务也需要很多步来完成.那么一个复杂的事务是只有两个结果,要么成功,要么失败(相当于从来没发生过). 一个很典型的列子,银行转账,其实其需要两步操作,第一步先将你账户上的钱减去,第二步把被转账户的钱加上,(先减后加,出了问题银行不吃亏.呵呵!)这样就是一个完整的事务.如果执行了一半,你的钱减了,被转账户的钱没加上,这个时候事务就要

Oracle undo 表空间不可用

由于某次不小心操作,在切换表空间时没有成功,但是由于把parameter undo的undo_management值改为了MANUAL所以在启动数据库时没有报任何错误,但是给表插入数据时报错了,回滚段不可用的错误.然后查询了错误原因. 1 首先看数据库中undo信息 SQL> show parameter undo; NAME TYPE VALUE------------------------------------ ----------- --------------------------