Oracle临时文件不会自动收缩,即使空闲也保持膨胀后大小;真实空闲空间需查v$temp_space_header.free_blocks;安全缩容唯一可靠方式是新建临时表空间、切换默认、确认无使用后DROP旧表空间。

Oracle 重启后 TEMP 表空间文件(如 temp01.dbf)大小没变,不是因为“没清理”,而是因为 Oracle 从不自动收缩临时文件——哪怕所有排序结束、所有会话断开、v$sort_usage 查不到任何活跃使用,文件体积仍保持膨胀后的状态。
TEMP 文件不会自动 shrink,这是设计行为,不是 bug
临时文件(tempfile)一旦扩展,Oracle 就不再尝试回收高位未使用的空间。它只维护“已分配但空闲”的块,这些块对后续排序仍可复用,所以物理文件尺寸不会缩小。ALTER DATABASE TEMPFILE ... RESIZE 看似可行,但常报 ORA-03297:文件高位仍有被标记为“已分配”的区(extent),哪怕当前没人用。这不是权限或锁的问题,是空间分配元数据决定的。
-
dba_temp_files.bytes显示的是文件系统级大小,和实际“逻辑占用”无关 - 真实空闲空间得查
v$temp_space_header的free_blocks字段,不是dba_free_space -
ALTER TABLESPACE TEMP COALESCE对临时表空间无效,该命令只适用于永久表空间
为什么 SMON 在重启后也没缩容文件
SMON 进程在实例启动时确实会清理残留临时段(比如异常中断留下的 orphaned sort segment),但它只释放段内空间,不触碰 tempfile 的 OS 文件尺寸。它的职责是让空间“可重用”,而非“归还给操作系统”。所以你看到 v$sort_segment 的 FREE_BLOCKS 可能很高,但 ls -lh temp01.dbf 仍是 30G。
- SMON 不调用
truncate()或fallocate()系统调用,它只更新数据字典里的 extent map - 即使你执行
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new切换后立刻删掉旧TEMP,原文件也必须显式DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES才会从磁盘移除 - 如果旧
TEMP里还有活跃会话(比如长事务未提交),DROP会 hang 住,直到会话自然退出或被 kill
查不到活跃会话,但 dba_temp_files 还显示 100% 使用率
这是典型“假性占满”:dba_temp_files.bytes 是文件大小,dba_free_space 不查临时表空间,所以常规空间视图会误导你。真正反映可用性的指标在内存视图里:
- 运行
SELECT tablespace_name, free_blocks * block_size / 1024 / 1024 AS free_mb FROM v$temp_space_header;——这才是真实空闲 MB 数 - 如果
free_mb > 0,说明空间可立即复用,无需操作;如果接近 0,才需排查谁在持续写入(比如未提交的全局临时表插入、隐式转换导致全表扫描+排序) -
v$sort_usage查不到会话 ≠ 没人用:某些后台操作(如统计信息收集、物化视图刷新)可能短暂使用后快速释放,快过你查询的窗口
安全缩容 TEMP 的唯一可靠路径
别碰 RESIZE,别信 COALESCE,直接重建。核心是让 Oracle 主动放弃旧文件,而不是强行截断:
- 先确认默认名:
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'; - 新建临时表空间:
CREATE TEMPORARY TABLESPACE temp_new TEMPFILE '/path/to/temp_new01.dbf' SIZE 512M AUTOEXTEND ON NEXT 64M; - 切换默认:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;(新会话立刻生效,老会话仍用旧文件,但不再增长) - 等
SELECT COUNT(*) FROM v$sort_usage WHERE tablespace = 'TEMP';返回 0,再执行DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;
这个过程不重启库、不中断业务,但要求应用端没有长期持有临时段的操作(比如一个跑 2 小时的 CREATE INDEX 正在用旧 TEMP)。一旦旧 TEMP 被删,对应文件就从磁盘消失——这才是真正“变小”。











