学无止境
分类: Oracle
2013-09-18 11:07:54
与UNDO相关的参数主要有3个:
undo_management AUTO为自动管理,MANUAL为手动管理,推荐设置为AUTO
undo_retention 该动态参数指定了保存UNDO的时间,该值是一个意向值,并不是一定能保存这么长时间
undo_tablespace 指定使用的UNDO表空间
undo_retention参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。
一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,UNDO中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此当创建一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo表空间有足够的存储空间。
估算当前数据库所需的UNDO表空间大小:
select (UR*(UPS*DBS))+(DBS*24) as "Bytes"
from (select value as UR
from v$parameter
where name='undo_retention'),
(select (sum(undoblks)/sum(((end_time-begin_time)*86400))) as UPS
from v$undostat),
(select value as DBS
from v$parameter
where name='db_block_size');
同时还要注意,也并不是说,undo_retention中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是到期,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback特性引用。如果undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo数据,它就会持续有效,从10g版本开始,ORACLE数据库会尽可能地保存UNDO信息。因此最主要关心的是UNDO表空间的大小,保证其有足够的存储空间。
只有在一种情况下,UNDO表空间能够确保undo中的数据在undo_retention指定时间过期前一定有效,就是为undo表空间指定Retention Guarantee,指定之后,ORACLE对于UNDO表空间中未过期的undo数据不会覆盖,但这样存在的隐患是,在事务繁忙的系统,且又undo_retention设置得较大的情况下,需要一个极大的的UNDO表空间。
例如:
SQL> select tablespace_name,status,contents,retention from dba_tablespaces where tablespace_name='UNDOTBS1';
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
UNDOTBS1 ONLINE UNDO NOGUARANTEE
SQL> Alter tablespace undotbs1 retention guarantee;
表空间已更改。
SQL> select tablespace_name,status,contents,retention from dba_tablespaces where tablespace_name='UNDOTBS1';
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
UNDOTBS1 ONLINE UNDO GUARANTEE
禁止undo 表空间retention guarantee:
SQL> Alter tablespace undotbs1 retention noguarantee;
表空间已更改。