ora-27037本质是操作系统层stat()调用失败,返回“no such file or directory”,需根据报错路径确认缺失文件类型(数据文件、控制文件、日志或归档),再针对性修复:裸设备rac环境须确保集群可见路径统一,有备份优先rman恢复,无备份重建需谨慎recover。

ORA-27037 错误本质是操作系统层无法访问指定路径的文件,不是 Oracle 自身逻辑错误。直接原因是 Oracle 进程(如 DBW)调用 stat() 系统调用失败,返回 Error: 2: No such file or directory。修复方向非常明确:让 Oracle 能“看到”那个路径下的文件,或让它别再找错地方。
确认缺失的是什么文件类型
先看报错中紧跟在 ORA-01110 后面的路径和文件名,再结合上下文判断类型:
-
data file(如data file 5: '/u01/oradata/orcl/dtt01.dbf')→ 数据文件丢失或路径错误 -
control file(如control file: '/u01/app/oracle/oradata/orcl/control01.ctl')→ 控制文件被删、移动或权限不对 -
online log(如online log 1 thread 1: '/u02/oracle/JINGYU/onlinelog/o1_mf_1_bwjsmn50_.log')→ 日志成员丢失或路径不可写 -
archive log(出现在recover阶段)→ 归档日志缺失,RMAN 找不到所需序列
不同类型修复策略完全不同,不能一概而论。
数据文件缺失时优先用 RMAN restore
如果缺失的是数据文件(data file X),且你有有效 RMAN 备份,最稳妥方式是直接恢复,而不是手动复制或重建:
- 确保目标路径存在且 Oracle 用户有读写权限:
mkdir -p /u01/oradata/orcl/&&chown oracle:oinstall /u01/oradata/orcl/ - 数据库必须处于
MOUNT状态(startup mount),system 表空间文件不能缺 - RMAN 中执行:
restore datafile 5;(用实际 file#)或restore datafile '/u01/oradata/orcl/dtt01.dbf'; - 接着执行:
recover datafile 5;—— 这步会自动应用归档和在线日志 - 最后:
alter database datafile 5 online;
注意:Oracle 10g 及以后版本支持在 OPEN 状态下对非 SYSTEM 表空间的数据文件做 offline/restore/recover/online 操作,但前提是该表空间未被强制只读或处于加密挂起状态。
裸设备 RAC 环境下路径错配是高频坑
像知识库中提到的 RAC 裸设备场景,错误把数据文件加到节点本地路径(如 /oracle/app/product/10.2.0.4/rac/dbs/rlv_cora9_4g013),其他节点根本看不到这个路径,必然报 ORA-27037:
- 检查所有节点是否都能访问该路径:
ls -l /oracle/app/product/10.2.0.4/rac/dbs/rlv_cora9_4g013—— 节点2应返回 “No such file or directory” - 裸设备必须使用统一的、集群可见的路径,例如
/dev/raw/raw10或 ASM diskgroup,绝不能用本地文件系统路径 - 修复时不能简单
cp,要用RMAN copy或dd将文件内容写入裸设备:RMAN> copy datafile 1495 to '/dev/raw/raw10'; - 之后需在所有节点上运行
alter database rename file ... to ...更新控制文件记录
这里最容易被忽略的是:rename 操作必须在所有实例都 mount 且未 open 的状态下完成,否则部分节点仍会尝试访问旧路径。
无备份时重建数据文件风险极高
若真无任何 RMAN 备份,又确认数据文件物理丢失,Oracle 允许用 create datafile 重建空文件,但仅适用于以下情况:
- 该数据文件所属表空间未包含
SYSTEM、UNDO、TEMP等关键对象 - 你清楚该文件原本大小、是否 autoextend、是否加密、是否在某个 tablespace 中
- 重建后必须立即
recover datafile X,否则数据库无法校验一致性;若归档不全,recover 会失败
示例:alter database create datafile '/u01/oradata/orcl/dtt01.dbf' as '/u01/oradata/orcl/dtt01.dbf' size 100M autoextend on next 10M maxsize 2G;
这一步看似简单,但一旦 recover 找不到足够重做日志,就会卡死或报 ORA-00368,此时只能接受数据丢失。所以真正没备份时,ORA-27037 往往是灾难链的起点,而非终点。











