Oracle TEMP表空间长期100%是因高位临时段未释放,非数据未清理;有效收缩方式仅两种:11.1+用ALTER TABLESPACE temp SHRINK SPACE,或重建TEMP表空间。

TEMP表空间长期100%但查不到活跃排序会话
这不是数据没清理,是Oracle不自动回收已分配的临时段。v$temp_space_header显示的free_mb才是真实空闲空间,dba_free_space对TEMP完全无效。常见现象是dba_temp_free_space显示已用100%,但v$sort_usage和v$session里找不到大排序会话——说明空间被“占着不用”,高位extent没释放。
直接ALTER DATABASE TEMPFILE RESIZE大概率失败
报ORA-03297就说明高位有未释放区。别硬resize,它不解决根本问题。真正有效的收缩方式只有两种:
-
ALTER TABLESPACE temp SHRINK SPACE(Oracle 11.1+,推荐优先试) - 重建TEMP表空间(所有版本都适用,最稳妥)
前者需确认无活跃占用:SELECT * FROM v$sort_usage结果为空才安全;后者无需等空闲,但要确保切换期间没有新建的大排序操作,否则会触发ORA-01652。
重建TEMP表空间的最小安全步骤
全程数据库OPEN,不需停机。关键点在于“先建、再切、后删”:
- 新建中转表空间:
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '/u01/oradata/ORCL/temp02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 8G - 切换默认:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2 - 确认旧TEMP无使用:
SELECT sid, serial#, username FROM v$session WHERE tempseg_used > 0 AND tablespace = 'TEMP',结果必须为空 - 删除旧表空间:
DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES
注意:不能只删tempfile而保留表空间,否则任何排序操作立即失败——Oracle不允许空tempfile的临时表空间存在。
SHRINK SPACE比SHRINK TEMPFILE更省心
两者都支持KEEP子句防缩过头,但SHRINK SPACE自动遍历所有tempfile,不用逐个指定路径,适合多数运维场景。执行前务必检查版本:SELECT * FROM v$version WHERE banner LIKE 'Oracle%',输出含11.1.0.或更高才可用。若报ORA-10635,基本就是版本太低;报ORA-01031则是权限不足,需授予ALTER TABLESPACE。
重建法虽稳,但涉及DROP TABLESPACE,容易误删路径或漏切默认;SHRINK SPACE看似简单,却常因残留会话卡住不动——这两处最容易被跳过验证。


















