今天做了个回滚段的测试,来观察回滚段的使用情况:
1. 先看回滚段的一些设置:自动扩展关闭,回滚段使用率达到99%,undo表空间的RETENTION为NOGUARANTEE(即不一定保证undo_retention设置的undo保留时间)
SQL> SELECT t.TABLESPACE_NAME,t.AUTOEXTENSIBLE FROM Dba_Data_Files t WHERE t.TABLESPACE_NAME='UNDOTBS1';
TABLESPACE_NAME AUT
------------------------------ ---
UNDOTBS1 NO
SQL> SELECT t.retention FROM Dba_Tablespaces t WHERE t.tablespace_name='UNDOTBS1';
RETENTION
-----------
NOGUARANTEE
2. 再看看回滚段各个区的状态:可以看到未过期的有3915.38(如果按undo_retention设置的时间来看,应该是早就过期了,因为这是我昨天产生的数据,只是oracle没人用的时候懒得回收)
SELECT T.TABLESPACE_NAME,
T.STATUS,
ROUND(SUM(T.BYTES)/1024/1024,2) UNDO_SIZE
FROM DBA_UNDO_EXTENTS T
GROUP BY T.TABLESPACE_NAME,T.STATUS;
UNDOTBS1 UNEXPIRED 3915.38
UNDOTBS1 EXPIRED 474.25
3.同样用上面的语句,来采样各个状态的变化:
UNDOTBS1 UNEXPIRED 3915.38
UNDOTBS1 EXPIRED 458.63
UNDOTBS1 ACTIVE 45.75
1 UNDOTBS1UNEXPIRED 3915.38
2 UNDOTBS1 EXPIRED 201.69
3 UNDOTBS1 ACTIVE 302.38 ----可见oracle在无力扩展的情况下,是会先重用EXPIRED的空间
1UNDOTBS1 UNEXPIRED19.31
2 UNDOTBS1 EXPIRED 3938.56
3 UNDOTBS1 ACTIVE 461.56 ----可见EXPIRED空间不够时,就会使用UNEXPIRED的空间,注意这里未过期并不一定说明其未超过undo_retention设置的undo保留时间,或 许只是oracle在悠闲的时候懒得去转换EXPIRED与UNEXPIRED的状态,所以即使undo表空间的RETENTION设置成了GUARANTEE,也有可能使用UNEXPIRED的空间(因为里面不一定都是未过期的内容)
1UNDOTBS1 UNEXPIRED19.31
2 UNDOTBS1 EXPIRED 3341.69
3 UNDOTBS1 ACTIVE 1058.44
实验证明了我在UNDO_RETENTIOIN文章里面说明的回滚段使用规律。。。。