oracle教程之管理undo表空间

对于undo表空间的管理来说,与一般的表空间区别不大。我们可以对undo表空间使用alter命令,主要用来添加数据文件、重命名数据文件、将数据文件联机 或脱机。比如,我们对undo表空间添加一个新的数据文件:
SQL> alter tablespace undonew add datafile '/u01/app/oracle
/oradata/ora10g/undonew02.dbf' size 10M autoextend on;
可以看到,该SQL命令与普通的表空间管理没有任何区别。
 
数据库中可以同时存在多个undo表空间,但是在一个时间点上,数据库只能使用一个undo表空间。如果我们将undo_tablespace参数设置为另外一个undo表空 间的名字,则这叫做undo表空间的切换。
 
当我们切换undo_tablespace时,如果旧的undo表空间上有事务正在执行,则该旧的undo表空间变成pending offline状态。同时用户的事务可以正常执行, 切换操作立刻结束,它并不会等待使用旧的undo表空间的事务结束。发生切换以后,所有新的事务所产生的undo数据不会存放在该旧的undo表空间里,而是 会使用新的undo表空间。我们不能使用pending offline状态的undo表空间,该状态下的undo表空间也不能被删除。最终,当旧的undo表空间上的所有的事务 都提交以后,旧的undo表空间从pending offline状态变成offline状态,这时我们才可以删除该旧的undo表空间。
 
在删除undo表空间时,与删除一般的表空间不同。也就是说,如果drop tablespace后面跟的是某个undo表空间的名字,就相当于发出drop tablespace K  including contents命令。一个undo 表空间只有在当前没有被活动的事务使用的时候才能被删除。如果undo表空间还包含某个未结束的事务,比如某个事务 异常中断,但是还没有回滚,这时drop tablespace会报错。但是,drop tablespace命令能够删除那些含有inactive状态的undo块(这些undo块还没有 expired)的undo表空间。这样就有可能发生ORA-1555错。因此,我们在切换undo_tablespace以后,应该在等待的时间超过undo_retention的长度以后再删 除旧的undo表空间。
 
我们知道,undo的信息只是尽可能地保留undo_retention所指定的时间。当undo数据文件不能自动扩展时,同时可用的undo块不够用时,Oracle也还会将保 留时间小于undo_retention的undo数据覆盖掉。从Oracle 10g开始,我们可以通过为undo表空间设置retention guarantee属性,从而不让这种情况出现。也 就是说,当undo数据文件不能自动扩展,并且undo块不够用时,直接报错,而不是覆盖那些inactive而又没有expired的undo块。
 
retention guarantee属性可以在创建undo表空间时指定,也可以在创建完毕以后设置:
SQL> create undo tablespace undonew1 datafile '/u01/app/
oracle/oradata/ora10g/undonew01. dbf' size 10M autoextend
on maxsize 100M retention guarantee;
SQL> alter tablespace undonew retention guarantee;
 
若要取消retention guarantee属性,则使用下列命令:
SQL> alter tablespace undonew retention noguara  ntee;
 
在我们计算undo表空间大小时,可以借助视图v$undostat。Oracle每隔10分钟更新该视图,将这10分钟里产生的undo块的个数记录在该视图里。Oracle在 v$undostat里保留最近7天的数据,也就是1008行记录。
SQL> select end_time,undoblks from v$undostat;
END_TIME               UNDOBLKS
------------------- ---------
2007-10-04 19:37:32          1
2007-10-04 19:34:21          5
2007-10-04 19:24:21          8
2007-10-04 19:14:21          2
2007-10-04 19:04:21         51
 
因此,通过该视图,我们可以计算undo表空间应该设置多大,Oracle提供了如下公式:
UndoSpace = Undo Retention * Undo Per Second + overhead(24 undo blocks)
 
其中,undo retentio就是系统中运行时间最长的那个查询所花费的时间,我们把该时间设置到初始化参数undo_retention上去。而Undo Per Second则可以 通过查询v$undostat来计算:
Select blks/((end-begin)*3600) as "Undo Per Second" from
(Select min(begin_time) begin,max(end_time) end,sum(undoblks) blks from v$undostat);
 
当然,在判断undo表空间应该设置多大时,借助Database Control所提供的Undo Advisory会更加简单,如图7-3所示。其中,重点部分为①部分。这里,横 轴为undo retention,以秒为单位,纵轴为undo表空间大小尺寸,以MB为单位。蓝色线条上的点表示当设定横轴上的undo retention时,需要多大的undo表 空间(从对应的纵轴可以获得)。
 
图7-3  使用Undo Management Advisor

你可能感兴趣的:(oracle,oracle,oracle,undo,undo表空间)