收缩undo表空间
通常情况下,如果undo表空间的处于自动扩展且未指定最大值的情形,对于使用小表空间模式的数据库,undo表空间可能会一再增长,直到达到32GB。或者是在指定了自动扩展及其最大值而月底或年末的批量数据计算导致undo表空间疯狂超范围增长后不再释放。对于这些情形我们需要手动收缩表空间以达到节省空间资源以及数据库管理开销,如rman备份等。本文列出了收缩undo表空间的基本步骤并给出示例。
1、undo表空间收缩的基本步骤
a、使用较小的尺寸创建一个新的undo表空间
SQL> create undo tablespace UNDO_RBS1 datafile 'undorbs1.dbf' size <new size>;
b、设置新的undo表空间为系统undo表空间
SQL> alter system set undo_tablespace=undo_rbs1;
c、删除原始的undo表空间及其数据文件
SQL> drop tablespace undo_rbs0 including contents.
d、使用原始undo表空间名创建一个新的小尺寸的undo表空间并且且换回系统undo,删除过渡undo表空间(此步骤可选)
2、收缩undo表空间示例
[sql]
--环境
goex_admin@CICCFIX> select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
--创建测试表t
goex_admin@CICCFIX> CREATE TABLE t
2 AS
3 SELECT rownum AS id,
4 round(5678+dbms_random.normal*1234) AS n1,
5 mod(255+trunc(dbms_random.normal*1000),255) AS n2,
6 dbms_random.string('p',255) AS pad
7 FROM dual
8 CONNECT BY level <= 10000
9 ORDER BY dbms_random.value;
Table created.
--观察当前回滚段的情形,注意第一行为system表空间的撤销段,用于系统表空间的撤销
--其余的为public,也就是说任意用户都可以使用这些基于undo表空间的回滚段
goex_admin@CICCFIX> @rollback_segments
Rollback Name Tablspace Init/Next Extents Min/Max Ex Status Bytes Extents Shrinks Wraps Opt. Size
------------------ ----------- -------------------- ---------- -------- ---------------- ------- -------- -------- ------------
SYS.SYSTEM SYSTEM 114688 / 1 / 32765 ONLINE 393,216 6 0 0
PUBLIC._SYSSMU10$ UNDOTBS 131072 / 2 / 32765 ONLINE 3,276,800 5 77 209
PUBLIC._SYSSMU21$ UNDOTBS 131072 / 2 / 32765 ONLINE 4,325,376 6 75 229
PUBLIC._SYSSMU22$ UNDOTBS 131072 / 2 / 32765 ONLINE 14,811,136 16 194 1,004
PUBLIC._SYSSMU3$ UNDOTBS 131072 / 2 / 32765 ONLINE 4,325,376 6 133 394
PUBLIC._SYSSMU4$ UNDOTBS 131072 / 2 / 32765 ONLINE 4,325,376 6 115 386
PUBLIC._SYSSMU5$ UNDOTBS 131072 / 2 / 32765 ONLINE 4,325,376 6 123 392
PUBLIC._SYSSMU6$ UNDOTBS 131072 / 2 / 32765 ONLINE 5,373,952 7 119 367
PUBLIC._SYSSMU7$ UNDOTBS 131072 / 2 / 32765 ONLINE 5,373,952 7 106 367
PUBLIC._SYSSMU8$ UNDOTBS 131072 / 2 / 32765 ONLINE 4,325,376 6 121 421
PUBLIC._SYSSMU9$ UNDOTBS 131072 / 2 / 32765 ONLINE 11,665,408 13 114 368
--当前undo表空间的大小
goex_admin@CICCFIX> col file_name format a55
goex_admin@CICCFIX> select tablespace_name,file_name,AUTOEXTENSIBLE,bytes/1024/1024 size_mb
2 from dba_data_files where tablespace_name like '%UNDO%';
TABLESPACE_NAME FILE_NAME AUT SIZE_MB
------------------------------ ------------------------------------------------------- --- ----------
UNDOTBS /u02/database/CICCFIX/undo/undotbs1CICCFIX2.dbf YES 24280.3125
--当前数据库存在的事务,为零值,表示没有未提交的事务
goex_admin@CICCFIX> select count(*) from v$transaction;
COUNT(*)
----------
0
--更新测试表以产生大量的undo
goex_admin@CICCFIX> update t set pad=dbms_random.string('l',255);
10000 rows updated.
--再次观察undo使用情况
--可以看到7号undo段上的extents由7增加到11,其字节数由5,373,952增加到9,568,256,增加了4M多
goex_admin@CICCFIX> @rollback_segments
Rollback Name Tablspace Init/Next Extents Min/Max Ex Status Bytes Extents Shrinks Wraps Opt. Size
------------------ ----------- -------------------- ---------- -------- ---------------- ------- -------- -------- ------------
SYS.SYSTEM SYSTEM