UNDO管理之二:UNDO基础

来源:互联网 发布:零基础想学美工 编辑:程序博客网 时间:2024/06/05 06:02
UNDO管理方法的演化9i之前的版本    手工UNDO管理,DBA要手工创建UNDO段提供给UNDO使用,比较麻烦。9i    引入自动UNDO管理,Oracle可以利用现有的UNDO表空间自动进行UNDO信息和空间的管理,然后通过指定UNDO RETENTION来决定非活动UNDO信息的保留期限。10g    引入自动RETENTION优化,可以根据UNDO表空间的大小以及自动增长的情况自动的优化UNDO RETENTION,最大限度的利用UNDO空间来避免ORA-1555之类的错误产生。11g    数据库在创建的时候默认使用自动UNDO管理。自动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管理,Oracle自身也是推荐使用AUM。UNDO_TABLESPACE    指定了Oracle该在那个UNDO表空间中创建自动管理的UNDO段。UNDO_TABLESPACE的选择方法如下: 1.如果系统中不存在UNDO表空间,则数据库打开时自动选用使用SYSTEM表空间。2.如果系统中存在多个UNDO表空间,默认情况下数据库打开时使用第一个可用的UNDO表空间。3.在系统运行中如果不设置UNDO_TABLESPACE,则事务将无法执行。自动UNDO管理的RETENTION    前面说过,在使用AUM的时候,在一个事务提交或者是回滚之后,该事务所对应的UNDO数据将不再为事务或者是数据库恢复所需要,但是考虑到读数据一致性和Flashback特性的需要,我们还需要将这些UNDO数据保留一段时间,这段时间被称为UNDO RETENTION。现在我们可以再继续介绍回滚区的状态了,同样上面说到回滚或者是提交之后的回滚区将是非活动状态,然而这种非活动状态还是可以继续细分的。那些还处于UNDO RETENTION之内的回滚区的状态为未过期(UNEXPIRED),而处于UNDO RETENTION之外的回滚区则称为已过期(EXPIRED),未过期的回滚区不会轻易的被覆盖,稍后会说到未过期的回滚区的使用原则;而已过期的回滚区则随时有可能为新的事务所重复利用。    特别要注意的一点就是一般情况下所说的UNDO RETENTION都是一个期望(Expected),而非保证(Guaranteed)。现在假设一个情形:数据库所使用的UNDO表空间的数据文件设置为非自动扩展,现在UNDO表空间中同时存在有活动、未过期、已过期、未使用等4种回滚区。当进行一个大的事务的时候,该事务会优先使用已过期回滚区和未使用空间,但是当事务用完这些可用空间之后发现还是不够那怎么办呢?这时候事务会继续使用那些状态为未过期的回滚区,使用顺序是从使用时间越早的开始,这时候Oracle是不会再顾及UNDO RETENTION设置的,保证事务正常运行最重要。这也就是UNDO RETENTION只能是一个期望而非保证的原因。你也许会问如果未过期的回滚区也用完了之后会怎么样呢?活动的回滚区是不可能重用的,因此事务报个错然后会死掉的。当然如果UNDO表空间是自动扩展的话Oracle就是先保证UNDO RETENTION而去扩展数据文件了。    当然,Oracle从10g开始也是提供了GUARANTEED UNDO RETENTION选项的,要使用GUARANTEED UNDO RETENTION则需要设置UNDO表空间的RETENTION GUARANTEE属性,下面就是使用的例子:SQL> create undo tablespace undo_t2     datafile '/opt/oradata/test/undo-t2.dbf'      size 100M;  查看新建回滚段属性SQL> select retention from dba_tablespaces t where t.tablespace_name='UNDO_T2';   RETENTION  -----------   NOGUARANTEE   修改现有UNDO表空间的RETENTION GUARANTEE属性 SQL> ALTER TABLESPACE undo_t2 RETENTION GUARANTEE;   Tablespace altered. 查看属性SQL>  select retention from dba_tablespaces t where t.tablespace_name='UNDO_T2';RETENTION-----------GUARANTEE取消现有UNDO表空间的RETENTION GUARANTEE属性 SQL> ALTER TABLESPACE undo_t2 RETENTION NOGUARANTEE;   Tablespace altered.查看undo表空间属性SQL> select retention from dba_tablespaces t where t.tablespace_name='UNDO_T2';   RETENTION  -----------   NOGUARANTEE使用GUARANTEED UNDO RETENTION之后,未过期的UNDO数据将不会再被覆盖掉。不过这是一个很危险的举措,因为这个一不小心就是造成事务失败。在没有百分百使用的理由支持之下是不要去做的。