晚上整个数据仓库更新数据,执行了一个有建表语句的过程,结果发现报了这个错误ORA-01652:unable to extend temp segment by 8192 in tablespace TEMP
,其实等临时表空间释放在执行就可以了。学习一下正常的解决方法
当出现临时表空间无法扩展临时段的错误时,需要考虑语句中是否存在大量使用临时表空间的语句。临时表空间的使用通常为以下几个情况:
1.存储大规模排序结果:排序操作:包括(order by 、group by、distinct、union、intersect、minus、sort-merge joins、analyze);
2.管理索引:索引的创建,重建
3.存储临时表;
4.其他需要用到临时空间的操作:导入、查视图等。
找到之后尝试修改语句或 增大临时表空间
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 |
发现同步删除了物理文件。
既然是临时表空间无法扩展,我们可以尝试增大临时表空间大小,从以上总结中我们可以找到三种方法:
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;