不能直接 RESIZE 临时文件是因为 Oracle 不自动回收高位空闲区,控制文件仍标记已分配块,导致 ORA-03297;真实空闲空间需查 v$temp_space_header,而非 dba_free_space。
ALTER DATABASE TEMPFILE ... RESIZE
临时文件一旦扩展,oracle 不会自动回收高位未使用的区(extent),resize 会直接报 ora-03297。这不是磁盘空间真满,而是控制文件里仍标记着那些“已分配但空闲”的块。查真实空闲空间要用:select tablespace_name, round((free_blocks*block_size)/1024/1024) free_mb from v$temp_space_header,不是 dba_free_space。
TEMP 表空间前必须绕过活跃会话执行 DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES 报 ORA-60100(sort segment 阻塞)是 Oracle 19c 常见现象,说明仍有会话在用旧临时段。此时不能硬杀,而应先切换默认表空间:
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '+DATADG01' SIZE 1G AUTOEXTEND OFF
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2
SELECT sid, serial#, username FROM v$session WHERE tempseg_used > 0 AND tablespace = 'TEMP' —— 结果必须为空新 TEMP 表空间建好后,别忘了收尾动作,否则中转表空间长期占用资源,且部分用户可能仍绑定旧名:
CREATE TEMPORARY TABLESPACE TEMP TEMPFILE '+DATADG01' SIZE 20G AUTOEXTEND OFF
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP
DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES
ALTER USER scott TEMPORARY TABLESPACE TEMP(DBA_USERS 中 TEMPORARY_TABLESPACE 列值不随数据库默认值自动更新)ORA-01157 出现时,RMAN 对临时文件完全无效——RESTORE、RECOVER、DELETE 全部报错,因为 tempfile 不写归档、不参与一致性检查。唯一合法操作是:ALTER DATABASE TEMPFILE '/path/to/broken.dbf' OFFLINE DROP,它只清理控制文件元数据,不碰磁盘文件。之后再走新建表空间流程。
ORA-01652。真正麻烦的从来不是命令敲错,而是没盯住 v$session 和 v$sort_usage 的实时状态。