在Oracle 10g RAC中,需要将一个实例的undo表空间缩小;但是undo表空间的datafile不好回收,不便resize,比较通用的方法是新建一个undo表空间作为此实例的默认表空间,等原来的undo表空间上没有事务后,删除原来的undo表空间和文件。
如果一定要用回之前的undo表空间名称,把刚才的步骤重复一遍就OK。
create undo tablespace tbs_undo_tmp datafile '+DATA' size 10G AUTOEXTEND OFF;
alter system set undo_tablespace = 'tbs_undo_tmp' scope = both sid = 'testdb1';
在10g新功能中有个叫AUR(Automatic Undo Retention)的东东,这东西就是根据系统现在使用的undo情况去自动调整UNDO_RETENTION的大小(当然,这个自动调整的数值不会少于UNDO_RETENTION的值)。
正是因为这个特性,会导致查询回滚段状态的时候,会发现UNEXPIRED的size非常大。
TABLESPACE_NAME STATUS undo_using_MB
------------------------------ --------- -------------
UNDOTBS1 EXPIRED 690
UNDOTBS2 EXPIRED 562.375
UNDOTBS1 UNEXPIRED 43302.75
UNDOTBS2 UNEXPIRED 27085.375
通过以下SQL可以查出AUR将UNDO_RETENTION的值调整到了多少
SELECT to_char(begin_time, 'YYYY-MM-DD HH24:MI:SS') begin_time,
tuned_undoretention
FROM v$undostat
ORDER BY begin_time DESC;
BEGIN_TIME TUNED_UNDORETENTION
------------------- -------------------
2013-08-06 22:33:59 49052
2013-08-06 22:23:59 48831
2013-08-06 22:13:59 48540
2013-08-06 22:03:59 48315
2013-08-06 21:53:59 48071
猜想,关闭AUR会不会对undo表空间中的回滚段使用状态立即造成影响呢?
通过修改隐藏参数关闭AUR功能
alter system set "_undo_autotune" = false scope = both sid = '*';
两次查询回滚段状态,发现关闭AUR会立即对回滚段使用状态立即造成影响。超过spfile中设定的UNDO_RETENTION的回滚段状态变为了EXPIRED。
TABLESPACE_NAME STATUS undo_using_MB
------------------------------ --------- -------------
UNDOTBS1 UNEXPIRED 582
UNDOTBS2 UNEXPIRED 563.5
UNDOTBS1 EXPIRED 43410.75
TBS_UNDO_TMP EXPIRED 2
UNDOTBS2 EXPIRED 24823.0625
TBS_UNDO_TMP UNEXPIRED 788.25
接下来就是等待系统中原默认的undo表空间全部EXPIRED之后将其删掉。
drop tablespace UNDOTBS1 including contents and datafiles;
阅读(2769) | 评论(0) | 转发(1) |