UNDO管理之二:UNDO基础

本文介绍了Oracle UNDO管理方法从手工管理到自动管理的演变过程,包括自动UNDO管理的引入及其在不同版本中的改进,如自动RETENTION优化,并探讨了UNDO_RETENTION参数的意义和作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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数据将不会再被覆盖掉。不过这是一个很危险的举措,
因为这个一不小心就是造成事务失败。在没有百分百使用的理由支持之下是不要去做的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值