ORA-01157本质是控制文件记录存在但物理文件不可访问,需先查v$datafile定位缺失文件及路径,再查v$recover_file确认是否需介质恢复,最后核查告警日志中的OS级错误;修复须执行RECOVER DATABASE、校准路径(ALTER DATABASE RENAME FILE)、检查权限或ASM磁盘组状态。
ora-01157 不是数据损坏,而是控制文件“记得有这个文件”,但 oracle 进程在操作系统层面找不到或打不开它——所以不能靠 restore database 单独解决,必须配合 recover database 和路径/状态校准。
确认缺失文件编号和路径,别猜
数据库卡在 MOUNTED 状态时,v$datafile 里会暴露异常项:
- 执行
SELECT file#, name, status FROM v$datafile WHERE status IN ('MISSING', 'INVALID');—— 直接看到控制文件标记为异常的文件号和路径 - 再查
SELECT * FROM v$recover_file;,若有记录,说明该文件需要介质恢复(即 RMAN 还没完成归档日志应用) - 翻告警日志:
$ORACLE_BASE/diag/rdbms/<dbname>/<instance>/trace/alert_<instance>.log</instance></instance></dbname>,搜索ORA-01157,常带出ORA-27041或ORA-27037等 OS 级错误,明确提示“no such file”还是“permission denied”
RMAN 恢复后仍报 ORA-01157?检查这三步流程是否完整
RESTORE 只是把备份片拷贝成数据文件,不更新 SCN、不校验一致性,跳过 RECOVER 就等于没做完:
- 必须执行
RECOVER DATABASE;(或针对单个文件:RECOVER DATAFILE <n>;</n>),让 RMAN 应用归档日志到一致点 - 确认控制文件中记录的路径与实际文件位置一致:用
SELECT name FROM v$datafile WHERE file# = <n>;</n>查期望路径,再用ls -l <path></path>验证存在且oracle用户可读 - 若路径已变更(如从
/u01改到/u02),在MOUNT状态下运行ALTER DATABASE RENAME FILE '<old_path>' TO '<new_path>';</new_path></old_path>—— 单引号必须严格匹配,路径大小写敏感
临时文件(tempfile)报 ORA-01157,别走恢复流程
ADG 备库或快照库中,tempfile 报错最常见于 db_create_file_dest 配置未生效或 ASM 别名失效,此时不需要 RMAN:
- 先查
SELECT tablespace_name, file_name FROM dba_temp_files;,确认是否真缺失 - 直接执行
ALTER DATABASE TEMPFILE '<path>' DROP INCLUDING DATAFILES;</path>(注意:这是安全操作,不影响在线业务) - 再加新临时文件:
ALTER TABLESPACE <temp_ts> ADD TEMPFILE SIZE 100M AUTOEXTEND ON;</temp_ts> - 如果备库启用了
STANDBY_FILE_MANAGEMENT=AUTO,确保db_file_name_convert和db_create_file_dest设置正确,否则新建 tempfile 仍会落错位置
权限和 ASM 场景下最容易被忽略的细节
Linux/Unix 下权限问题常伪装成 ORA-01157,而 ASM 中磁盘组或别名异常则不会报具体路径错误:
- Oracle 进程用户(如
oracle)对数据文件所在目录必须有x(执行)权限,否则open()系统调用失败,只报 ORA-01157,不报 ORA-01157 的原因码 - ASM 环境下,先查磁盘组状态:
SELECT state, name FROM v$asm_diskgroup;,必须是MOUNTED;再查别名:asmcmd ls -l <diskgroup>/<alias></alias></diskgroup>,确认别名指向真实 AU - RAC 环境中,若仅一个节点报 ORA-01157,先检查该节点对应 LV/VG 是否 online(如 AIX 的
varyonvg),再执行ALTER SYSTEM CHECK DATAFILES;刷新 SGA 中的数据文件状态缓存
真正麻烦的不是文件丢了,而是控制文件和物理层之间的“认知偏差”——它记着,你却没放对地方,或者放对了但没给读的权限。每次操作前,先看 v$datafile 和告警日志,比盲目 restore 更省时间。


















