一聚教程网:一个值得你收藏的教程网站

热门教程

怎样在Oracle 19c中安全地删除并重建临时表空间

时间:2026-07-03 11:06:46 编辑:袖梨 来源:一聚教程网

不能直接 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 DATAFILESORA-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 TEMPDBA_USERSTEMPORARY_TABLESPACE 列值不随数据库默认值自动更新)

损坏 tempfile 时别碰 RMAN

ORA-01157 出现时,RMAN 对临时文件完全无效——RESTORERECOVERDELETE 全部报错,因为 tempfile 不写归档、不参与一致性检查。唯一合法操作是:ALTER DATABASE TEMPFILE '/path/to/broken.dbf' OFFLINE DROP,它只清理控制文件元数据,不碰磁盘文件。之后再走新建表空间流程。

重建过程本身不需重启,但整个流程依赖应用侧无大规模排序或建索引操作;哪怕只漏掉一个长事务中的排序,也可能在切换瞬间触发 ORA-01652。真正麻烦的从来不是命令敲错,而是没盯住 v$sessionv$sort_usage 的实时状态。

热门栏目