日期:2014-05-16  浏览次数:20378 次

收缩undo表空间

      通常情况下,如果undo表空间的处于自动扩展且未指定最大值的情形,对于使用小表空间模式的数据库,undo表空间可能会一再增长,直到达到32GB。或者是在指定了自动扩展及其最大值而月底或年末的批量数据计算导致undo表空间疯狂超范围增长后不再释放。对于这些情形我们需要手动收缩表空间以达到节省空间资源以及数据库管理开销,如rman备份等。本文列出了收缩undo表空间的基本步骤并给出示例。
      有关表空间,undo表空间的文章可参考:
           Oracle 表空间与数据文件
           Oracle 回滚(ROLLBACK)和撤销(UNDO)
           检查及设置合理的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表空间示例

--环境
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,fil