一、故障现象:

在删除一个超大表的数据时报错:ORA-30036:

SQL> delete fromCRT_CURING_PRESS_TEMPHISTORY

 2  whereRECORD_TIME<to_date('2017-06-30','yyyy-mm-dd');

delete from CRT_CURING_PRESS_TEMPHISTORY

1 行出现错误:

ORA-30036: 无法按 8 扩展段 (在还原表空间'UNDOTBS1' )

仔细检查发现是由于undo表空间所在的数据文件已经使用达到32G所致。

二、解决办法:

1、检查undo表空间对应的数据文件目录

SQL>select tablespace_name,file_name fromdba_data_files;

2、查看undo表空间使用率:

SQL>select file_name,bytes/1024/1024from dba_data_files where tablespace_name like 'UNDOTBS%'; 

或者、

SQL>SELECT a.tablespace_name as tablespace_name,

      to_char(b.total/1024/1024,999999.99) as Total,

      to_char((b.total-a.free)/1024/1024,999999.99) as Used,

      to_char(a.free/1024/1024,999999.99) as Free,

      to_char(round((total-free)/total,4)*100,999.99) as Used_Rate

FROM (SELECT tablespace_name, sum(bytes)free FROM DBA_FREE_SPACE GROUP BY tablespace_name) a,

    (SELECT tablespace_name, sum(bytes) total FROM DBA_DATA_FILES GROUP BYtablespace_name ) b

WHERE a.tablespace_name=b.tablespace_name

  ANDa.tablespace_name='UNDOTBS1'

ORDER BY a.tablespace_name;

3等待原UNDO表空间所有UNDO SEGMENT OFFLINE 

SQL>select usn,xacts,status,rssize/1024/1024,hwmsize/1024/1024,shrinks from v$rollstat order by rssize;  

SQL>selectt.segment_name,t.tablespace_name,t.segment_id,t.status from dba_rollback_segst; 

4、新增undo数据文件!

SQL>alter tablespace undotbs1 add datafile'D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF' size 1000m AUTOEXTEND on next200m maxsize unlimited;

5、删除原有的UNDO表空间

SQL> create pfile from spfile; 

SQL> drop tablespace undotbs1 includingcontents; 

  最后需要在重启数据库或者重启计算机后到存储数据文件的路径下删除数据文件(为什么要手动删除呢:以上步骤只是删除了ORACLEundo表空间的逻辑关系,即删除了数据文件在数据字典中的关联,不会自动删除项关联的数据文件)。 

   droptablespace undotbs1 including contents and datafiles;  


新增undo数据文件!

SQL>alter tablespace undotbs1 add datafile'D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF' size 1000m AUTOEXTEND on next200m maxsize unlimited;

3、原理通透:

UNDO 表空间用于存放UNDO数据,当执行DML操作(INSERT,UPDATEDELETE),oracle会将这些操作的旧数据写入到UNDO, oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的.oracle9i开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间<