1.概念介绍
UNDO是Oracle中的一个很重要的机制,在对数据库进行修改的时候,Oracle会将数据块上修改之前的数据(称为前映像,before image)保存在回滚段中,这样当我们需要进行回滚(rollback)的时候就很容易能从回滚段中将之前的数据取出来将数据块上面的数据还原回来。
2.主要用途
数据回滚(rollback)
数据库恢复(data recovery) :实例恢复,即在数据库意外宕机之后需要使用UNDO数据进行回滚操作。
一致性读(read consistency)
闪回功能(Flashback):Flashback Query, Flashback Drop等(flash database除外)。
3.UNDO引起常见问题:
(1).空间使用率100%,导致DML操作无法进行。
(2).告警日志中出现大量的ORA-01555告警错误。
(3).实例恢复失败,数据库无法正常打开。
4.目前UNDO管理方法有手工管理和自动管理两种方式,主要演进过程如下:
Oracle 9i之前的版本:手工UNDO管理,DBA要手工创建UNDO段提供给UNDO使用,比较麻烦。
Oracle 9i :引入自动UNDO管理,Oracle可以利用现有的UNDO表空间自动进行UNDO信息和空间的管理,然后通过指定UNDO RETENTION来决定非活动但未过期UNDO信息的保留期限。
Oracle 10g:引入自动RETENTION优化,可以根据UNDO表空间的大小以及自动增长的情况自动的优化UNDO RETENTION,最大限度的利用UNDO空间来避免ORA-1555之类的错误产生。
Oracle 11g:使用DBCA创建数据库时候默认使用自动UNDO管理。
5.自动UNDO管理
自动UNDO管理(Automatic UNDO Management, AUM)是Oracle从9i开始推出的新UNDO管理方式,之前的UNDO管理都是靠手工创建UNDO段来完成的。有了AUM之后,Oracle可以在UNDO表空间当中自动的管理UNDO信息和UNDO所占用的空间,在无需人工参与空间分配等活。
与AUM相关的两个最基本的参数就是UNDO_MANAGEMENT和UNDO_TABLESPACE。
UNDO_MANAGEMENT
决定了使用自动(AUTO)还是手动(MANUAL)的UNDO管理方式,从11g开始在初始化参数中如果没有指定UNDO_MANAGEMENT参数,默认情况下是使用自动UNDO管理,Oracle自身也是推荐使用AUM。11g之前的版本则默认使用手动。
UNDO_TABLESPACE
指定了Oracle该在那个UNDO表空间中创建自动管理的UNDO段。UNDO_TABLESPACE的选择方法如下:
如果系统中不存在UNDO表空间,则数据库打开时自动选用使用SYSTEM表空间。
如果系统中存在多个UNDO表空间,默认情况下数据库打开时使用第一个可用的UNDO表空间。
在系统运行中如果不设置UNDO_TABLESPACE,则事务将无法执行。
6.UNDO产生级别
UNDO是由事务产生的,或者说UNDO的产生级别是事务。
在自动UNDO管理的模式下,当开启一个事务修改数据时,Oracle会给这个开启的事务分配回滚段用于存储被修改数据的前映像,在事务回滚或者是提交之前,这些分配的回滚区(一个回滚段可以分配给多个事务,因此回滚数据的状态定义在区(extent)而非段(segment)上)的状态称为活动状态(ACTIVE),处于活动状态的的回滚区对数据的回滚有着至关重要的作用,因此是不能够被覆盖或者是离线(offline)的。如果存在处于活动状态的回滚段丢失(通常是UNDO表空间损坏),这时的未完成事务将因为无法回滚而造成数据的不一致。当这个事务提交或者是回滚之后,所对应的回滚区则标记为非活动(Inactive)状态,处于非活动状态的回滚区不再为数据回滚或是数据库恢复等功能所用,但是UNDO的其它诸如一致性读和闪回等功能却还是有可能用到这些回滚段。因此处于Inactive的回滚区也并不意味着就可以马上丢弃,这个需要取决于UNDO的RETENTION的设置。
7.自动UNDO管理的RETENTION
UNDO管理的区有四种状态:活动、非活动未过期、非活动已过期和未使用。
活动:事务还未提交或回滚的数据。
非活动未过期:事务已经提交,但还未超过UNDO RETENTION的数据
非活动已过期:事务已经提交,并且已经超过UNDO RETENTION的数据
未使用:UNDO表空间中未分配给事务的区空间。
当UNDO表空间设置为不可自动扩展时若未声明RETENTION GUARANTEE,则UNDO RETENTION 只是一个期望值,当一个大事务将UNDO表空间中未使用和已过期状态的区都已经分配使用,则会开始覆盖未过期状态的区。
当然,从10g开始,Oracle提供了UNDO自动优化功能,所谓的UNDO自动优化就是在UNDO表空间非自动增长的情况下,Oracle会根据UNDO表空间的大小来调整UNDO RETENTION的大小,自动调整RETENTION就是最大限度的利用当前UNDO表空间的可用空间,尽可能的保留最多的UNDO数据,以最大化的减少类似ORA-1555之类的错误发生。在这种情况下的UNDORETENTION设置只是一个摆设,属于基本无用的了。
经过自动优化后的UNDO RETENTION可以在动态视图V$UNDOSTAT.TUNED_UNDORETENTION中看到。默认情况下,Oracle会每10分钟往V$UNDOSTAT中插入一条当前UNDO表空间使用情况的数据,其中就包含了当时自动优化后的UNDO RETENTION数值。
相反,若声明了RETENTION GUARANTEE,则会保证未过期的数据不会被覆盖,但这很可能会导致事务失败,没有百分之百的理由支持下,建议不要这样做。
当UNDO表空间设置为自动扩展,当未使用和过期的数据都已经分配完,数据库会保证UNDO RETENTION,而去自动拓展空间,不会选择覆盖未过期数据。
默认情况下,retention guarantee 是禁用的。可通过语句打开:
SQL> Alter tablespace undotbs1 retention guarantee;
注意:在企业中,一般将UNDO表空间设置为固定大小,然后利用oracle的UNDO自动优化功能,查看优化后的undo_retention,如果该值不够大,可以将UNDO表空间固定大小设置更大一些,这样经过oracle优化后的undo_retention肯定也会变大。重复操作,直至undo_retention满足系统业务需求即可。
文章整理自:
http://blog.itpub.net/23135684/viewspace-1065601/