ORA-01157错误应通过重建临时表空间解决:先确认默认临时表空间和现有临时文件状态,再用ALTER TABLESPACE ADD TEMPFILE或CREATE TEMPORARY TABLESPACE新建文件,最后清理残留会话、更新用户默认设置并刷新应用连接池。
ORA-01157:无法识别/锁定数据文件 temp01.dbf 时怎么办
临时表空间损坏或数据文件丢失后,数据库能启动,但执行排序、哈希连接等操作会直接报这个错——不是数据库挂了,而是临时资源断供了。核心思路不是“恢复”,而是“重建”:oracle 不允许对临时文件做介质恢复,alter database recover 对它无效。
实操建议:
- 确认当前默认临时表空间:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE'; - 检查是否还有完好的临时文件:
SELECT TABLESPACE_NAME, FILE_NAME, STATUS FROM DBA_TEMP_FILES;—— 如果只剩一个且状态为OFFLINE或查不到记录,就得新建 - 不要尝试用
CREATE TEMPORARY TABLESPACE ... DATAFILE直接覆盖原路径;若原temp01.dbf文件已删但路径仍被占用(如权限不足、磁盘满),会报ORA-25153: Temporary Tablespace is Empty - 优先使用新路径建文件,比如:
ALTER TABLESPACE temp ADD TEMPFILE '/u02/oradata/ORCL/temp02.dbf' SIZE 100M AUTOEXTEND ON NEXT 64M;
重建后用户会话仍卡在 TEMP 表空间分配失败?
新建的临时文件不会自动接管旧会话的临时段需求。已有连接可能还绑定着已失效的临时表空间句柄,尤其当它们正执行长查询或 PL/SQL 中含大量排序时。
实操建议:
- 强制清理残留临时段:
SELECT SEGMENT_NAME, SESSION_ADDR FROM V$SORT_SEGMENT WHERE TABLESPACE_NAME = 'TEMP';,再查对应SESSION_ADDR是否仍在V$SESSION中活跃;若已断连但段未释放,需重启实例(非紧急情况可跳过) - 确保所有用户默认临时表空间已切到新空间:
ALTER USER scott TEMPORARY TABLESPACE temp_new;,不能只改DEFAULT_TEMP_TABLESPACE数据库属性 - 应用层连接池(如 Tomcat JDBC Pool)可能缓存旧连接,需重启应用或清空连接池,否则照样报
ORA-01652: unable to extend temp segment
用 CREATE TEMPORARY TABLESPACE 还是 ALTER TABLESPACE ... ADD TEMPFILE?
二者本质不同:前者建全新表空间并设为默认,后者是在现有表空间里加文件。选哪个取决于你是否还能访问原表空间定义。
实操建议:
- 如果原
TEMP表空间还在DBA_TABLESPACES里且状态为ONLINE,只是文件丢了,就用ALTER TABLESPACE temp ADD TEMPFILE—— 简单、快、不影响其他用户对表空间的授权 - 如果
DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES已执行(或误删后元数据混乱),必须用CREATE TEMPORARY TABLESPACE temp_new ...,再改默认值和用户配置 - 注意:
CREATE TEMPORARY TABLESPACE不会自动设置DEFAULT_TEMP_TABLESPACE,必须显式执行:ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new; - 别用
REUSE参数试图重写原路径文件——若磁盘没空间或权限不对,会静默失败,日志里只记ORA-01119
临时文件建在 ASM 还是文件系统?性能与风险差异
临时文件 I/O 是典型的高并发、短生命周期、顺序读写为主,ASM 和本地文件系统表现接近,但容错逻辑完全不同。
实操建议:
- 用 ASM 时,
ADD TEMPFILE必须指定 ASM 磁盘组路径(如+DATA),不能写成操作系统路径;否则报ORA-17502: ksfdcre:4 Failed to create file - 文件系统下,避免把多个临时文件放在同一物理磁盘(尤其是
/tmp或根分区),否则排序高峰时容易触发IO wait和ORA-01114 - 临时文件不参与 RMAN 备份,也不计入
DB_FLASHBACK_RETENTION_TARGET计算,所以不用为它调大闪回区 - 如果数据库启用了
INMEMORY,临时表空间压力反而可能增大(因内存中物化结果需落盘排序),此时建议单个临时文件不低于 512MB,且开启AUTOEXTEND
SELECT 确认状态,比直接删重建更省时间。

















