一、故障现象:
在删除一个超大表的数据时报错: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;
最后需要在重启数据库或者重启计算机后到存储数据文件的路径下删除数据文件(为什么要手动删除呢:以上步骤只是删除了ORACLE中undo表空间的逻辑关系,即删除了数据文件在数据字典中的关联,不会自动删除项关联的数据文件)。
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,UPDATE和DELETE)时,oracle会将这些操作的旧数据写入到UNDO段,在 oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的.从oracle9i开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间<