适用版本:Oracle 11.2.0.4 RAC(含 ASM)
工作模式:Oracle RAC + ASM(可选:Primary/Standby Data Guard)
核心场景:RAC 数据文件被误添加到节点本地磁盘,导致其他节点报 ORA-01157 / ORA-01110,通过 RMAN copy + rename + recover 将数据文件迁移至 ASM 共享磁盘组
目录
1. 环境信息
| 项目 | 值 |
|---|---|
| 数据库版本 | Oracle Database 11.2.0.4 |
| 集群架构 | Oracle RAC(2 节点) |
| 存储架构 | Oracle ASM(磁盘组 +DATA、+ARCH、+OCR) |
| 操作系统 | Linux x86_64 |
| Grid 用户 | grid |
| Oracle 用户 | oracle |
| 归档模式 | 已开启(Archive Mode) |
| 是否有 DG | 可选场景,见第 4 节 |
2. 报错现象
数据库查询报错,定位原因是 RAC 库将数据文件添加到了节点本地磁盘,另一个节点无法访问该路径,导致以下错误:
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: '/u01/app/oracle/product/11.2.0/db_1/dbs/lyp02.dbf'
根本原因: ALTER TABLESPACE ... ADD DATAFILE 时未指定 ASM 磁盘组路径(如 +DATA),而是使用了本地路径,文件创建在了 $ORACLE_HOME/dbs/ 下。该路径在其他节点不可见,只有创建文件的节点能访问。
3. 恢复步骤
恢复前提: 归档日志不能被删除。如有归档自动清理策略(RMAN 保留策略、第三方备份工具),需暂时暂停。
3.1 数据文件 OFFLINE
将路径错误的数据文件 offline:
-- 查看问题数据文件的 FILE# 和路径
SQL> select file_id, file_name, status from dba_data_files where tablespace_name='<表空间名>';
-- 将其 offline(替换 N 为实际 file_id)
SQL> alter database datafile N offline;
-- 确认状态变为 RECOVER
SQL> select file#, name, status from v$datafile where file#=N;
影响说明: offline 后,该数据文件上的数据块不可读;同一表空间其他数据文件中的数据不受影响。
3.2 RMAN Copy 数据文件到 ASM
rman target /
-- rman
-- 将本地路径数据文件 copy 到 ASM 数据磁盘组(+DATA 替换为实际磁盘组名)
RMAN> backup as copy datafile '/u01/app/oracle/product/11.2.0/db_1/dbs/<文件名>.dbf' format '+DATA';
说明: 命令执行完成后,输出中会显示
output file name=+DATA/rac/datafile/xxx,记录该新路径,后续步骤需要用到。
示例输出:
output file name=+DATA/rac/datafile/lyp.277.1010081595
3.3 Rename 数据文件
-- 将控制文件中的数据文件路径从本地路径更新为 ASM 路径
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/<文件名>.dbf'
to '+DATA/rac/datafile/<RMAN输出的新文件名>';
-- 确认路径已更新
SQL> select file_id, file_name, status from dba_data_files where tablespace_name='<表空间名>';
3.4 恢复数据文件
-- 应用归档日志,将数据文件恢复到一致状态
-- 数字 N 为 file#
SQL> recover datafile N;
-- 确认状态变为 OFFLINE(恢复完成)
SQL> select file#, name, status from v$datafile where file#=N;
说明:
recover datafile会自动应用所需的归档日志序列,生产环境通常已开启归档,直接执行即可。
3.5 数据文件 ONLINE
SQL> alter database datafile N online;
-- 确认状态变为 ONLINE
SQL> select file#, name, status from v$datafile where file#=N;
3.6 验证检查
-- 检查数据文件路径和状态
SQL> select file_id, file_name, status from dba_data_files where tablespace_name='<表空间名>';
SQL> select file#, name, status from v$datafile where file#=N;
-- 验证数据可查(两节点均需验证)
SQL> select count(*) from <问题表>;
两个节点均能正常查询,则恢复完成。
4. Data Guard 环境特殊处理
适用场景: 主库(Primary)为 Oracle RAC,存在 Data Guard Standby(物理备库)。
在 Data Guard 环境中,本地磁盘数据文件问题同样会传播到 Standby,需按以下流程处理。
4.1 影响分析
Primary 上 ADD DATAFILE 到本地磁盘的操作会产生 redo,该 redo 同样会传输到 Standby。Standby 端的 MRP 在 apply 到这条记录时,需要引用对应的数据文件——但同一本地路径在 Standby 上不存在,MRP 直接停止日志应用。
如果 Standby 也是 RAC 架构,即便文件在某节点本地磁盘被创建出来,其他节点同样不可访问,问题与 Primary 端完全一致。
4.2 处理顺序
原则:先处理 Primary,再处理 Standby。
Primary 处理(第 3 节步骤)→ Primary 恢复完成 → 检查 Standby MRP 状态 → 处理 Standby
4.3 检查 Standby 上的 MRP 状态
在 Standby 执行:
-- 查看 MRP 进程状态
SQL> select process, status, sequence# from v$managed_standby where process='MRP0';
-- 查看 Standby 日志应用差距
SQL> select name, value from v$dataguard_stats where name in ('transport lag','apply lag');
若 MRP 已停止,需要在 Standby 上先处理数据文件再重启 MRP。
4.4 Standby 数据文件处理
方式一:Standby 本地有数据文件副本(常见场景)
Standby 接收的 Redo 中包含新增数据文件的信息,DG Broker 或 MRP 会在 Standby 自动创建对应数据文件。若 Standby 上该文件也在本地路径,按以下步骤处理:
-- Standby 上查看问题数据文件
SQL> select file#, name, status from v$datafile where status != 'ONLINE';
-- 将 Standby 上的问题文件 offline
SQL> alter database datafile N offline;
1a. Standby 存储为 ASM(Standby 也使用 ASM 磁盘组):
-- 以 RMAN 连接 Standby,copy 到 ASM(Standby 的磁盘组)
RMAN> backup as copy datafile N format '+<Standby磁盘组>';
-- rename 到新 ASM 路径(路径来自 RMAN 输出的 output file name)
SQL> alter database rename file '<旧本地路径>' to '<新ASM路径>';
1b. Standby 存储为本地文件系统(Standby 未使用 ASM,用共享 NFS 或本地磁盘):
# Standby 存储是普通文件系统,可直接用 cp 或 RMAN copy 到共享路径
# 方式一:cp(目标为共享文件系统,如 NFS)
cp <旧本地路径> <新共享路径>/<新文件名>.dbf
# 方式二:RMAN copy 到本地目录
RMAN> backup as copy datafile N format '<目标目录>/<新文件名>.dbf';
-- rename 到新路径
SQL> alter database rename file '<旧本地路径>' to '<新路径>';
说明: 若 Standby 是单节点物理备库(非 RAC),文件在本地可见即可,目标路径不要求是 ASM;若 Standby 也是 RAC 架构,目标路径必须是 ASM 共享磁盘组。
-- 在 Standby 上 online(MRP 重启后自动追平,无需手动 recover)
SQL> alter database datafile N online;
4.5 重启 Standby MRP
-- 重启 MRP,恢复日志应用
SQL> alter database recover managed standby database disconnect from session;
-- 确认 MRP 状态为 APPLYING_LOG
SQL> select process, status from v$managed_standby where process='MRP0';
-- 确认 apply lag 趋近于 0
SQL> select name, value from v$dataguard_stats where name='apply lag';
4.6 Data Guard 全链路验证
-- Primary 端确认数据可查
SQL> select count(*) from <问题表>;
-- Standby 端(以 READ ONLY 方式打开,或查询 v$datafile)
SQL> select file#, name, status from v$datafile where file#=N;
SQL> select name, value from v$dataguard_stats;
5. 预防措施
7.1 规范 ADD DATAFILE 语法
始终在 ALTER TABLESPACE ... ADD DATAFILE 中显式指定 ASM 磁盘组路径,不依赖默认路径:
-- ✅ 正确:显式指定 ASM 数据磁盘组(+DATA 替换为实际磁盘组名)
alter tablespace lyp add datafile '+DATA' size 1G autoextend on next 256M maxsize 10G;
-- ❌ 错误:漏写 + 号,文件默认落在 $ORACLE_HOME/dbs/(本地磁盘)
alter tablespace lyp add datafile 'lyp02.dbf' size 1G;
7.2 添加数据文件后立即验证路径
-- 每次 ADD DATAFILE 后执行,确认路径以 + 开头(ASM 路径)
select file_id, file_name from dba_data_files order by file_id desc;
7.3 定期检查数据文件路径
将以下脚本加入日常巡检:
-- 找出所有不在 ASM 磁盘组的数据文件(不以 + 开头)
select file#, name, status
from v$datafile
where name not like '+%';
若有输出,需立即按本文第 3 节流程迁移到 ASM。
6. 总结 & 注意事项
核心流程回顾
数据文件 OFFLINE(必须,Oracle 持有文件句柄)
↓
RMAN copy 到 ASM(cp/scp 无法写入 ASM)
↓
rename 更新控制文件路径
↓
recover datafile(应用归档追平)
↓
数据文件 ONLINE
↓
(DG 环境)先修 Primary,再修 Standby
关键注意事项
| 注意项 | 说明 |
|---|---|
| 必须先 OFFLINE | ONLINE 状态下 Oracle 持有文件句柄,无法 rename |
| 用 RMAN 不用 cp | 目标是 ASM,操作系统 cp/scp 无法写入 ASM 磁盘组 |
| 归档日志不可删 | 恢复期间必须保留所有归档,否则 recover datafile 会中断 |
| DG 先 Primary 后 Standby | 不能在 Primary 未恢复的情况下单独操作 Standby |
| rename 路径必须来自 RMAN 输出 | 不能手动猜测 ASM 文件名,必须用 RMAN copy 的实际输出路径 |
| 生产优先修复 | 控制文件+SPFILE 秒级备份即可,不要花时间等全库备份 |
参考文档
- Oracle Database Backup and Recovery User’s Guide 11g Release 2
- Oracle Data Guard Concepts and Administration 11g Release 2
- Oracle ASM Administrator’s Guide 11g Release 2
- MOS Note: ORA-01157 / ORA-01110 Troubleshooting Guide
- MOS Note 1129489.1 - How To Move/Rename a Datafile Using RMAN in RAC Environment




