通常情况下,如果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
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,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 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 9,568,256 11 106 371
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
--也可以看到该事物所使用的块数为527及其undo段号7
goex_admin@CICCFIX> SELECT addr,xidusn,used_ublk FROM v$transaction;
ADDR XIDUSN USED_UBLK
---------------- ---------- ----------
000000009CA69A00 7 527
--Author : Leshami
--Blog : http://blog.csdn.net/leshami
--下面回滚事务
goex_admin@CICCFIX> rollback;
--再次查看undo信息,其占用的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 9,568,256 11 106 371
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,收缩到23g,成功
goex_admin@CICCFIX> alter database datafile '/u02/database/CICCFIX/undo/undotbs1CICCFIX2.dbf' resize 23g;
Database altered.
--再次尝试收缩到10g出现错误提示,数据库中不存在事务,而undo表空间得不到释放
goex_admin@CICCFIX> alter database datafile '/u02/database/CICCFIX/undo/undotbs1CICCFIX2.dbf' resize 10g;
alter database datafile '/u02/database/CICCFIX/undo/undotbs1CICCFIX2.dbf' resize 10g
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
--下面新增一个新的undo表空间
goex_admin@CICCFIX> create undo tablespace undotbs2 datafile '/u02/database/CICCFIX/undo/undotbs_CICCFIX.dbf' size 100m autoextend on;
--设置系统undo表空间为新的表空间undotbs2
goex_admin@CICCFIX> alter system set undo_tablespace='UNDOTBS2' scope=both;
-->注,如果使用了pfile文件启动实例,此处会收到错误提示,可以省略scope参数,直接修改内存中的值,下次重启前需要相应修改pfile中的undo_tablespace
--观察undo段的变化情况,可以看到新的原来的undotbs表空间上的undo段全部处于OFFLINE状态,新的undo表空间为online状态
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._SYSSMU1$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU10$ UNDOTBS 131072 / 2 / 32765 OFFLINE 3,276,800 5
PUBLIC._SYSSMU11$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU12$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU13$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU14$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU15$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU16$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU17$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU18$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU2$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU21$ UNDOTBS 131072 / 2 / 32765 OFFLINE 4,325,376 6
PUBLIC._SYSSMU22$ UNDOTBS 131072 / 2 / 32765 OFFLINE 20,054,016 21
PUBLIC._SYSSMU3$ UNDOTBS 131072 / 2 / 32765 OFFLINE 4,325,376 6
PUBLIC._SYSSMU4$ UNDOTBS 131072 / 2 / 32765 OFFLINE 4,325,376 6
PUBLIC._SYSSMU5$ UNDOTBS 131072 / 2 / 32765 OFFLINE 4,325,376 6
PUBLIC._SYSSMU6$ UNDOTBS 131072 / 2 / 32765 OFFLINE 5,373,952 7
PUBLIC._SYSSMU7$ UNDOTBS 131072 / 2 / 32765 OFFLINE 9,568,256 11
PUBLIC._SYSSMU8$ UNDOTBS 131072 / 2 / 32765 OFFLINE 4,325,376 6
PUBLIC._SYSSMU9$ UNDOTBS 131072 / 2 / 32765 OFFLINE 11,665,408 13
--删除之前过大的undo表空间及数据文件
goex_admin@CICCFIX> drop tablespace undotbs including contents and datafiles;
--删除之后,原来undo表空间上的回滚段不复存在。新的undo段为1-2,11-18,总计10个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._SYSSMU1$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU11$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU12$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU13$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU14$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU15$ UNDOTBS2 131072 / 2 / 32765 ONLINE 196,608 3 0 2
PUBLIC._SYSSMU16$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 1
PUBLIC._SYSSMU17$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
PUBLIC._SYSSMU18$ UNDOTBS2 131072 / 2 / 32765 ONLINE 327,680 5 0 3
PUBLIC._SYSSMU2$ UNDOTBS2 131072 / 2 / 32765 ONLINE 131,072 2 0 0
--下面是收缩之后的结果
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
------------------------------ ------------------------------------------------------- --- ----------
UNDOTBS2 /u02/database/CICCFIX/undo/undotbs_CICCFIX.dbf YES 100
3、后记
a、undo表空间的释放通过创建新的过渡表空间且将新创建的设置为系统undo表空间以达到空间释放目的
b、原始undo表空间能否删除,需要看原undo表空间上是否存在事务,如果存在则不能立即删除,需要等到提交或回滚后再删除(或杀掉session)
c、原始undo表空间删除后可能存在空间不能立即返回给OS的情形,可能需要重启数据库等
d、注意修改系统undo表空间时当前使用的参数文件(pfile,spfile)可能引发的下次重启收到undo错误的相关提示
更多参考
有关Oracle RAC请参考
使用crs_setperm修改RAC资源的所有者及权限
使用crs_profile管理RAC资源配置文件
RAC 数据库的启动与关闭
再说 Oracle RAC services
Services in Oracle Database 10g
Migrate datbase from single instance to Oracle RAC
Oracle RAC 连接到指定实例
Oracle RAC 负载均衡测试(结合服务器端与客户端)
Oracle RAC 服务器端连接负载均衡(Load Balance)
Oracle RAC 客户端连接负载均衡(Load Balance)
ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
配置 RAC 负载均衡与故障转移
CRS-1006 , CRS-0215 故障一例
基于Linux (RHEL 5.5) 安装Oracle 10g RAC
使用 runcluvfy 校验Oracle RAC安装环境
有关Oracle 网络配置相关基础以及概念性的问题请参考:
配置非默认端口的动态服务注册
配置sqlnet.ora限制IP访问Oracle
Oracle 监听器日志配置与管理
设置 Oracle 监听器密码(LISTENER)
配置ORACLE 客户端连接到数据库
有关基于用户管理的备份和备份恢复的概念请参考
Oracle 冷备份
Oracle 热备份
Oracle 备份恢复概念
Oracle 实例恢复
Oracle 基于用户管理恢复的处理
SYSTEM 表空间管理及备份恢复
SYSAUX表空间管理及恢复
Oracle 基于备份控制文件的恢复(unsing backup controlfile)
有关RMAN的备份恢复与管理请参考
RMAN 概述及其体系结构
RMAN 配置、监控与管理
RMAN 备份详解
RMAN 还原与恢复
RMAN catalog 的创建和使用
基于catalog 创建RMAN存储脚本
基于catalog 的RMAN 备份与恢复
RMAN 备份路径困惑
使用RMAN实现异机备份恢复(WIN平台)
使用RMAN迁移文件系统数据库到ASM
linux 下RMAN备份shell脚本
使用RMAN迁移数据库到异机
有关ORACLE体系结构请参考
Oracle 表空间与数据文件
Oracle 密码文件
Oracle 参数文件
Oracle 联机重做日志文件(ONLINE LOG FILE)
Oracle 控制文件(CONTROLFILE)
Oracle 归档日志
Oracle 回滚(ROLLBACK)和撤销(UNDO)
Oracle 数据库实例启动关闭过程
Oracle 10g SGA 的自动化管理
Oracle 实例和Oracle数据库(Oracle体系结构)