Oracle RAC 环境下数据文件误建在本地目录的处理过程

问题描述

在 Oracle RAC 环境中,有时会误将数据文件创建在本地目录,导致其他节点无法访问该数据文件,从而报出 ORA-01157 和 ORA-01110 错误。

问题分析

  1. 错误日志

    sh 复制代码
    Mon Nov 16 19:02:38 2021
    Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_m000_27416.trc:
    ORA-01157: cannot identify/lock data file 9 - see DBWR trace file
    ORA-01110: data file 9: '/u01/app/oracle/11.2.0/db1/dbs/testnew'
    Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_m000_27416.trc:
    ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
    ORA-01110: data file 10: '/u01/app/oracle/11.2.0/db1/dbs/testfilenew'
  2. 查询数据文件路径

    sql 复制代码
    SQL> SELECT file#, name FROM v$datafile;
    
    --输出示例:
      FILE# NAME
    ---------- -------------------------------------------------
           1 +DATA/orcl/datafile/system.259.855244341
           2 +DATA/orcl/datafile/sysaux.260.855244345
           3 +DATA/orcl/datafile/undotbs1.261.855244345
           4 +DATA/orcl/datafile/undotbs2.263.855244353
           5 +DATA/orcl/datafile/users.264.855244355
           6 +DATA/orcl/datafile/egapp.293.874859211
           7 +DATA/orcl/datafile/loop_test.294.879093349
           8 +DATA/orcl/datafile/loop_file_test.295.8790
           9 /u01/app/oracle/11.2.0/db1/dbs/testnew
          10 /u01/app/oracle/11.2.0/db1/dbs/testfilenew

解决方法

1. 确定数据文件的位置

  1. 确定数据文件在哪个节点上

    sh 复制代码
    -- 在节点2上执行
    ls -l /u01/app/oracle/11.2.0/db/dbs/

2. 将数据文件下线

  1. 登录到 SQL\Plus

    sh 复制代码
    sqlplus / as sysdba
  2. 将数据文件下线

    sql 复制代码
    SQL> ALTER DATABASE DATAFILE 9 OFFLINE;
    SQL> ALTER DATABASE DATAFILE 10 OFFLINE;
  3. 确认数据文件状态

    sql 复制代码
    SQL> COL NAME FOR A45
    SQL> SET LINESIZE 234
    SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;

3. 复制数据文件到共享目录

  1. 登录到 RMAN

    sh 复制代码
    rman target /
  2. 复制数据文件

    sql 复制代码
    RMAN> COPY DATAFILE '/u01/app/oracle/11.2.0/db/dbs/goa31new' TO '+DATA';
    RMAN> COPY DATAFILE '/u01/app/oracle/11.2.0/db/dbs/goafilenew' TO '+DATA';

4. 更改数据文件路径

  1. 重命名数据文件

    sql 复制代码
    SQL> ALTER DATABASE RENAME FILE '/u01/app/oracle/11.2.0/db1/dbs/testnew' TO '+DATA/orcl/datafile/testnew.339.895952649';
    SQL> ALTER DATABASE RENAME FILE '/u01/app/oracle/11.2.0/db1/dbs/testfilenew' TO '+DATA/orcl/datafile/testfilenew.340.895952749';
  2. 确认数据文件状态

    sql 复制代码
    SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;

5. 恢复数据文件

  1. 恢复数据文件

    sql 复制代码
    SQL> RECOVER DATAFILE '+DATA/orcl/datafile/testnew.339.895952649';
    SQL> RECOVER DATAFILE '+DATA/orcl/datafile/testfilenew.340.895952749';
  2. 确认数据文件状态

    sql 复制代码
    SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;

6. 将数据文件上线

  1. 将数据文件上线

    sql 复制代码
    SQL> ALTER DATABASE DATAFILE 9 ONLINE;
    SQL> ALTER DATABASE DATAFILE 10 ONLINE;
  2. 确认数据文件状态

    sql 复制代码
    SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;

特殊情况:系统表空间数据文件创建在本地

1. 模拟创建

  1. 在节点一上创建系统表空间数据文件

    sql 复制代码
    SQL> ALTER TABLESPACE SYSTEM ADD DATAFILE '/u02/app/oracle/datafile/system02.dbf' SIZE 10M AUTOEXTEND OFF;
  2. 检查数据文件

    sql 复制代码
    SQL> COL TABLESPACE_NAME FOR A20
    SQL> COL FILE_NAME FOR A50
    SQL> SELECT FILE_NAME, FILE_ID, ONLINE_STATUS, TABLESPACE_NAME FROM DBA_DATA_FILES;
    SQL> SELECT FILE#, NAME FROM V$DATAFILE;
    
      FILE# NAME
    ---------- -------------------------------------------------
          4 +DATA/orcl/datafile/users.257.901333687
          3 +DATA/orcl/datafile/undotbs1.264.901333687
          2 +DATA/orcl/datafile/sysaux.256.901333685
          1 +DATA/orcl/datafile/system.265.901333685
          5 +DATA/orcl/datafile/undotbs2.266.901333943
          6 +DATA/orcl/datafile/testdb.dbf
          7 /u02/app/oracle/datafile/system02.dbf

2. 处理系统表空间数据文件

  1. 将数据文件下线

    sql 复制代码
    SQL> ALTER DATABASE DATAFILE 7 OFFLINE;

    注意:系统表空间数据文件无法下线,需要停机时间。

    sh 复制代码
    ORA-01541: system tablespace cannot be brought offline; shut down if necessary
  2. 关闭问题节点

    sql 复制代码
    SQL> SHUTDOWN IMMEDIATE;
  3. 在另一个节点上检查数据文件状态

    sql 复制代码
    SQL> SELECT OPEN_MODE FROM GV$DATABASE;
  4. 使用 ASM 命令将本地文件移动到 ASM

    sh 复制代码
    ASMCMD [+data/orcl/datafile] > CP /u02/app/oracle/datafile/system02.dbf ./
    copying /u02/app/oracle/datafile/system02.dbf -> +data/orcl/datafile/system02.dbf
  5. 启动节点一数据库到 mount 状态

    sql 复制代码
    SQL> STARTUP MOUNT;
  6. 修改数据文件路径

    sql 复制代码
    SQL> ALTER DATABASE RENAME FILE '/u02/app/oracle/datafile/system02.dbf' TO '+data/orcl/datafile/system02.dbf';
  7. 启动数据库

    sql 复制代码
    SQL> ALTER DATABASE OPEN;
  8. 在另一个节点上检查数据文件状态

    sql 复制代码
    SQL> SELECT FILE_NAME, FILE_ID, ONLINE_STATUS, TABLESPACE_NAME FROM DBA_DATA_FILES;
  9. 重启另一个节点

    sql 复制代码
    SQL> SHUTDOWN IMMEDIATE;
    SQL> STARTUP;
  10. 确认数据文件状态

    sql 复制代码
    SQL> SELECT FILE_NAME, FILE_ID, ONLINE_STATUS, TABLESPACE_NAME FROM DBA_DATA_FILES;

总结

通过上述步骤,可以有效地解决 Oracle RAC 环境中数据文件误建在本地目录的问题,特别是系统表空间的数据文件。

相关推荐
wno7042 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数4 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室4 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen4 小时前
mysql数据库基本操作
数据库·mysql
2603_965148114 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe4 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新5 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball7 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai7 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网7 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析