undo_retention这个参数指定了undo表空间中的数据的最大保留时间,单位为秒,是动态参数,也就是说我们可以在实例运行的时候对这个参数进行修改,默认值为900s(15min)。undo_retention只是指定了undo数据的过期时间,并不是说undo中的数据一定会在表空间中保留15min。当undo表空间已被写满,新的事务就会自动覆盖那些已经提交的事务数据,而不会去理会这些数据是否已经过期。
undo_retention指定的时间一过,已提交的数据就立刻无法访问,它只是失效,但是只要没有被新数据覆盖就仍然存在,并且可随时被flashback特性引用。如果undo表空间足够大,而数据库又不是那么繁忙,那么undo_retention的值并不会有影响,只要没有事务去覆盖undo数据,就会持续有效。
只有一种情况,undo表空间能够确保undo数据在undo_retention指定的时间前一定有效,那就是为undo表空间指定retention guarantee,指定之后,对于undo表空间那些没有过期的数据就不会被覆盖。
可用如下命令查看当前数据库中undo的retention guarantee:
SYS@orcl 07-SEP-14>select tablespace_name,contents,retention
2 from dba_tablespaces;
TABLESPACE_NAME CONTENTS RETENTION
-------------------- --------- -----------
SYSTEM PERMANENT NOT APPLY
SYSAUX PERMANENT NOT APPLY
TEMP TEMPORARY NOT APPLY
USERS PERMANENT NOT APPLY
UNDOTBS2 UNDO NOGUARANTEE
EXAMPLE PERMANENT NOT APPLY
TEST PERMANENT NOT APPLY
HH PERMANENT NOT APPLY
GOODS PERMANENT NOT APPLY
DATA01 PERMANENT NOT APPLY
10 rows selected.
默认为NOGUARANTEE
用如下命令修改undotbs2的retention guarantee:
SYS@orcl 07-SEP-14>alter tablespace undotbs2 retention guarantee;
Tablespace altered.
SYS@orcl 07-SEP-14>select tablespace_name,contents,retention
2 from dba_tablespaces;
TABLESPACE_NAME CONTENTS RETENTION
-------------------- --------- -----------
SYSTEM PERMANENT NOT APPLY
SYSAUX PERMANENT NOT APPLY
TEMP TEMPORARY NOT APPLY
USERS PERMANENT NOT APPLY
UNDOTBS2 UNDO GUARANTEE
EXAMPLE PERMANENT NOT APPLY
TEST PERMANENT NOT APPLY
HH PERMANENT NOT APPLY
GOODS PERMANENT NOT APPLY
DATA01 PERMANENT NOT APPLY
10 rows selected.
使用如下命令禁止使用retention guarantee:
SYS@orcl 07-SEP-14>alter tablespace undotbs2 retention noguarantee;
Tablespace altered.