学习ORACLE-错误ORA-01652:unable to extend temp segment by 8192 in tablespace TEMP

晚上整个数据仓库更新数据,执行了一个有建表语句的过程,结果发现报了这个错误ORA-01652:unable to extend temp segment by 8192 in tablespace TEMP,其实等临时表空间释放在执行就可以了。学习一下正常的解决方法

1.错误原因

当出现临时表空间无法扩展临时段的错误时,需要考虑语句中是否存在大量使用临时表空间的语句。临时表空间的使用通常为以下几个情况:
1.存储大规模排序结果:排序操作:包括(order by 、group by、distinct、union、intersect、minus、sort-merge joins、analyze);
2.管理索引:索引的创建,重建
3.存储临时表;
4.其他需要用到临时空间的操作:导入、查视图等。
找到之后尝试修改语句或 增大临时表空间

2.解决方法

2.1 对临时表空间(文件)的相关操作

0.查询临时表空间使用率(来源网络)

SELECT d.tablespace_name "Name", 
TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.900') "Size (M)", 
TO_CHAR(NVL(t.hwm, 0)/1024/1024,'99999999.999') "HWM (M)", 
TO_CHAR(NVL(t.hwm / a.bytes * 100, 0), '990.00') "HWM % " , 
TO_CHAR(NVL(t.bytes/1024/1024, 0),'99999999.999') "Using (M)", 
TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Using %" 
FROM dba_tablespaces d, 
(select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a, 
(select tablespace_name, sum(bytes_cached) hwm, sum(bytes_used) bytes from v$temp_extent_pool group by tablespace_name) t 
WHERE d.tablespace_name = a.tablespace_name(+) 
AND d.tablespace_name = t.tablespace_name(+) 
AND d.extent_management like 'LOCAL'
AND d.contents like 'TEMPORARY';

1.查询数据库的默认临时表空间
SELECT * FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE';

PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace

2.查询临时文件的相关信息

SELECT file_name,
       file_id,
       tablespace_name,
       status,
       autoextensible,
       bytes/1024/1024 "file_size(M)"
FROM dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25

3.增加临时表空间中的临时文件

ALTER TABLESPACE temp ADD TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' SIZE 50M;
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files 
ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25
D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF 3 TEMP ONLINE NO 50

可以看到增加了一个大小为50M的不可扩展的在线状态的临时文件TEMP03.DBF到TEMP临时表空间
4.使临时文件脱机(联机)

ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' OFFLINE;--在线为ONLINE
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files 
ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25
D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF 3 TEMP OFFLINE

脱机之后的临时文件不再显示某些属性
5.修改临时文件的大小

ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' RESIZE 100M;
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files 
ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25
D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF 3 TEMP ONLINE NO 100

临时文件脱机时不可以修改大小或其他属性
6.修改临时文件为自动扩展

ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;--不自动扩展为 AUTOEXTEND OFF
SELECT file_name,file_id,tablespace_name,status,autoextensible,
       increment_by*8192/1024/1024 "increment_by(M)",
       bytes/1024/1024 "file_size(M)",
       maxbytes/1024/1024 "max_file_size(M)"
FROM dba_temp_files 
ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE increment_by(M) file_size(M) max_file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES .625 275 32767.984375
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 0 25 0
D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF 3 TEMP ONLINE YES 5 100 32767.984375

可以看到TEMP03.DBF的相关属性发生了改变
7.删除临时文件

ALTER TABLESPACE temp DROP TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF';
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25

可以发现TEMP03.DBF被删除了,windows中不会立即删除物理文件;
另一种删除方法:

ALTER TABLESPACE temp ADD TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP04.DBF' SIZE 50M;
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25
D:\APP\CHUJF\ORADATA\ORCL\TEMP04.DBF 3 TEMP ONLINE NO 50

删除文件:

ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP04.DBF' DROP INCLUDING DATAFILES;
SELECT file_name,file_id,tablespace_name,status,autoextensible,bytes/1024/1024 "file_size(M)" 
FROM dba_temp_files ORDER BY file_id;
FILE_NAME FILE_ID TABLESPACE_NAME STATUS AUTOEXTENSIBLE file_size(M)
D:\APP\CHUJF\ORADATA\ORCL\TEMP01.DBF 1 TEMP ONLINE YES 275
D:\APP\CHUJF\ORADATA\ORCL\TEMP02.DBF 2 TEMP ONLINE NO 25

发现同步删除了物理文件。

2.2 解决方法

既然是临时表空间无法扩展,我们可以尝试增大临时表空间大小,从以上总结中我们可以找到三种方法:
1.增大临时文件的大小:
ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' RESIZE 100M;
2.修改临时文件为自动扩展:
ALTER DATABASE TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;
3.向临时表空间中添加临时文件:
ALTER TABLESPACE temp ADD TEMPFILE 'D:\APP\CHUJF\ORADATA\ORCL\TEMP03.DBF' SIZE 50M;

你可能感兴趣的:(学习,oracle,ORA-01652)