暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle RAC 数据文件误添加本地文件系统处理

原创 lucky、糯米汤圆 1天前
48

适用版本: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. 环境信息
  2. 报错现象
  3. 恢复步骤
  4. Data Guard 环境特殊处理
  5. 预防措施
  6. 总结 & 注意事项

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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论