oracle 11g中临时表空间“占满但无活跃会话”实为已分配未回收,alter tablespace temp shrink space是最准最安全解法,前提是版本≥11.1且无长期占用会话。
oracle 11g 中临时段空间“占满但查不到活跃会话”,不是真满了,而是已分配未回收 —— 直接 shrink space 是最准、最安全的解法,前提是版本 ≥ 11.1 且无长期占用。
确认是否真能用 SHRINK SPACE
11g R1(11.1.0)起原生支持对 TEMP 表空间执行收缩,不依赖 ASSM,也不需要重建。但必须验证两点:
- 查版本:
SELECT * FROM v$version WHERE banner LIKE 'Oracle%';—— 输出中必须含11.1.0.或更高 - 查权限:当前用户需有
ALTER TABLESPACE权限,否则报ORA-01031: insufficient privileges - 若报
ORA-10635: Invalid segment or tablespace type,基本可断定是版本低于 11g,别硬试
先清掉“卡住”的活跃临时段
SHRINK SPACE 不会杀会话,只等空闲段释放。如果 v$sort_usage 里没大排序,但 dba_temp_free_space 显示已用 100%,大概率是旧排序段残留未被 SMON 清理干净。此时要主动干预:
- 查真实占用者:
SELECT s.sid, s.serial#, s.username, s.program, u.blocks * t.block_size / 1024 / 1024 mb_used FROM v$sort_usage u, v$session s, v$transaction t WHERE u.session_addr = s.saddr AND u.xidusn = t.xidusn(+) ORDER BY mb_used DESC; - 若结果为空,但
v$temp_extent_pool.bytes_cached仍很高,说明是“已分配但空闲”的假满状态 - 可尝试触发 SMON 清理:
ALTER TABLESPACE temp COALESCE;(仅对老版本有效,11g 后作用有限) - 极端情况:用诊断事件强制清理残留临时段:
ALTER SESSION SET EVENTS 'immediate trace name DROP_SEGMENTS level 4';(其中4是TEMP表空间的ts# + 1,先查SELECT ts# FROM v$tablespace WHERE name = 'TEMP';)
执行 SHRINK SPACE 或 SHRINK TEMPFILE
两者都行,但粒度不同:
-
ALTER TABLESPACE temp SHRINK SPACE;—— 自动遍历所有 tempfile,按实际使用量收缩,适合日常运维 -
ALTER TABLESPACE temp SHRINK TEMPFILE '/u01/oradata/ORCL/temp01.dbf' KEEP 512M;—— 只动指定文件,KEEP防止缩过头导致后续排序失败(比如业务 SQL 突然需要 1G 临时空间) - 注意:
ALTER DATABASE TEMPFILE ... RESIZE在临时文件高位有已分配 extent 时必报ORA-03297,别用 - 执行后观察
v$temp_extent_pool.bytes_cached是否下降;若卡住不动,说明仍有会话在写该 tempfile,得等或 kill
重建 TEMP 是兜底方案,但代价明确
当 SHRINK 失败、版本太低、或临时文件物理路径混乱(如 ASM 和 FS 混用),重建是最彻底的办法,但它要求业务低峰期操作:
- 新建:
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '/u01/oradata/ORCL/temp02.dbf' SIZE 1G 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;(缺INCLUDING CONTENTS会报错) - 切记:不能只
DROP TEMPFILE留空表空间 —— Oracle 不允许 TEMP 表空间无 tempfile,下次排序直接报ORA-01652
临时文件一旦扩展,Oracle 就不会自动缩回磁盘,哪怕所有排序早已结束。SHRINK SPACE 是 11g 提供的“官方退烧药”,但它的生效前提是没人正踩着那块地 —— 所以动手前,先看 v$sort_usage 和 v$temp_extent_pool,比盲目 resize 或重启更省事。











