直接结论:这是控制文件残留主库asm路径所致,须用file#删除无效tempfile并add新本地路径tempfile;adg备库tempfile不支持autoextend,且所有操作均为纯本地行为,不同步主库。

ADG备库临时表空间报ORA-01186 / ORA-01157怎么办
直接结论:这不是“空间不足”,而是控制文件里残留了主库ASM路径的TEMPFILE记录,备库本地文件系统根本找不到那个+DATA/...路径,所以启动或应用日志时反复报错。不能用常规ALTER DATABASE DATAFILE ... RESIZE,因为临时文件不走DATABASE级命令。
典型错误链:ORA-01186(文件验证失败)→ ORA-01157(无法标识/锁定数据文件)→ ORA-01110(具体文件路径)。备库处于只读状态,ALTER DATABASE类命令会直接拒绝,但ALTER TABLESPACE ... DROP TEMPFILE和ADD TEMPFILE是允许的。
- 先确认问题文件ID:查
v$tempfile或dba_temp_files会卡住或报错,改用SELECT file#, name FROM v$tempfile WHERE status = 'INVALID',通常能拿到出问题的file#(比如201) - 不要尝试
DROP TEMPFILE '+DATA/...'——语法错误,必须用file#数字 - 删除后立即执行
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/xxx/temp02.dbf' SIZE 10G REUSE补上本地路径的新文件 - 补完后查
dba_temp_files应能正常返回,且status为ONLINE
为什么不能在ADG备库上用AUTOEXTEND ON临时文件
Oracle明确限制:ADG物理备库的TEMPFILE不支持AUTOEXTEND。即使你手动加了一个带AUTOEXTEND ON的TEMPFILE,数据库启动时也会自动将其AUTOEXTEND置为OFF,且后续ALTER DATABASE TEMPFILE ... AUTOEXTEND ON会被拒绝。
原因很实际:备库的临时文件只用于本地排序/哈希等操作,不参与主库日志重放;而AUTOEXTEND触发的文件增长需要写入控制文件,这与ADG只读架构冲突。强行开启会导致控制文件不一致风险。
- 所有
TEMPFILE必须显式指定SIZE,且建议预留足够余量(如10–20G),避免频繁维护 -
REUSE关键字很重要——它允许覆盖同名但已损坏的文件,比RESIZE更可靠 - 路径必须是备库本地可写的目录,不能复用主库ASM别名(如
+DATA)或NFS挂载点(除非确认IO稳定)
临时表空间扩容后仍报错ORA-01652的排查重点
加完新TEMPFILE后如果业务SQL仍报ORA-01652: unable to extend temp segment,大概率不是空间不够,而是默认临时表空间没切对,或者旧TEMPFILE还在被进程占用。
关键检查点:
- 确认当前默认临时表空间:
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE',确保是TEMP而非其他名字(如TEMP_OLD) - 查是否有会话还在用已删除的
TEMPFILE:SELECT * FROM v$sort_usage WHERE tablespace = 'TEMP',若SEGMENT_FILE#指向已删的file#(如201),需等会话结束或杀掉对应SID, SERIAL# - 临时表空间本身不能
SHRINK SPACE(该命令只对用户表空间有效),ALTERTABLESPACETEMPSHRINKSPACE会报ORA-12917 - 如果用了临时表空间组(
TABLESPACE GROUP),确保所有成员都已切换到本地路径,否则组内任一无效文件都会导致整个组不可用
生产环境ADG备库临时表空间维护的硬约束
最易被忽略的一点:ADG备库的临时表空间变更**不会同步到主库**,也不受主库LOG_ARCHIVE_DEST_n参数控制。这意味着你在备库上做的任何ADD/DROP TEMPFILE操作,都是纯本地行为,主库完全无感知,也不会写归档日志。
所以维护动作必须严格限定在备库生命周期内,并且要确保:
- 每次主库升级或重建备库前,必须重新校验并初始化临时表空间——旧控制文件可能再次带入ASM路径
- 监控脚本不能依赖
dba_temp_files.bytes算使用率,因为临时段释放是异步的,v$tempseg_usage才是实时依据 - 不要在备库上创建新的临时表空间再设为默认——
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE在ADG备库是禁用的,只能通过ALTER DATABASE DEFAULT TEMPORARY TABLESPACE在主库执行,再等同步 - 备份策略里要排除
TEMPFILE——RMAN不备份临时文件,恢复时需手动重建











