重建TEMP表空间是最稳妥解法,因其不自动回收已分配临时段;需新建temp2、切换默认、确认无会话使用旧TEMP、再drop tablespace including contents and datafiles。
temp 表空间不释放空间,不是因为没清理,而是因为 oracle 默认不自动回收已分配的临时段——直接重建 temp 是最稳妥的解法。
TEMP 表空间使用率长期 100% 却查不到活跃排序
这是典型现象:dba_temp_free_space 显示已用 100%,但 v$sort_usage 或 v$session 找不到大排序会话。原因在于临时文件(tempfile)一旦扩展,Oracle 不会自动收缩,即使所有排序结束,空间仍被标记为“已分配但空闲”。
- 别信
alter database tempfile ... resize能直接缩容——若高位有未释放的区(extent),会报错ORA-03297: file contains used data beyond requested RESIZE value - 检查真实空闲空间用:
select tablespace_name, round((free_blocks*block_size)/1024/1024) free_mb from v$temp_space_header;(注意是v$temp_space_header,不是dba_free_space) - 临时表空间不支持
shrink space,任何试图对tempfile做 shrink 的操作都会失败
重建 TEMP 表空间的最小安全步骤
必须在数据库 open 状态下完成,无需停机,但需确保无应用正在执行大规模排序或建索引(否则新 TEMP 尚未就绪时会报错 ORA-01652: unable to extend temp segment)。
- 新建临时表空间:
create temporary tablespace temp2 tempfile '/u01/oradata/ORCL/temp02.dbf' size 1024m autoextend on next 100m maxsize 8g; - 切换默认临时表空间:
alter database default temporary tablespace temp2; - 确认无会话还在用旧 TEMP:
select sid, serial#, username, program from v$session where tempseg_used > 0 and tablespace = 'TEMP';(结果应为空) - 删除旧 TEMP:
drop tablespace temp including contents and datafiles;(加including contents才能删掉里面的临时段)
为什么不能只删 tempfile、保留表空间?
临时表空间可以没有 tempfile,但此时任何需要排序的操作都会立即失败——Oracle 不允许 tempfile 全部 offline 或全部被 rm 掉后还维持表空间存在。
-
alter database tempfile '/old/temp01.dbf' drop including datafiles;只是移除控制文件记录,不会删物理文件,且表空间状态变为EMPTY,无法再分配新临时段 - 如果只剩一个 tempfile 且你把它 drop 了,
v$sort_usage会清空,但下次排序直接报ORA-01652,因为没地方写 - 真正释放磁盘空间,必须删掉 tempfile 物理文件,而唯一安全删物理文件的时机,就是
drop tablespace ... including datafiles之后
重建 TEMP 最容易被忽略的点:应用连接池可能缓存了 session-level 的临时表空间设置(比如通过 alter session set temporary tablespace temp;),这些会话在切换后仍尝试往旧 TEMP 写,直到断连重连。所以重建后观察 1–2 小时的 v$sort_usage,确认所有会话都已落到新 TEMP 上再删旧文件。

















