问题描述
在 Oracle RAC 环境中,有时会误将数据文件创建在本地目录,导致其他节点无法访问该数据文件,从而报出 ORA-01157 和 ORA-01110 错误。
问题分析
-
错误日志
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'
-
查询数据文件路径
SQL> SELECT file#, name FROM v$datafile;--输出示例:FILE# NAME ---------- -------------------------------------------------1 +DATA/orcl/datafile/system.259.8552443412 +DATA/orcl/datafile/sysaux.260.8552443453 +DATA/orcl/datafile/undotbs1.261.8552443454 +DATA/orcl/datafile/undotbs2.263.8552443535 +DATA/orcl/datafile/users.264.8552443556 +DATA/orcl/datafile/egapp.293.8748592117 +DATA/orcl/datafile/loop_test.294.8790933498 +DATA/orcl/datafile/loop_file_test.295.87909 /u01/app/oracle/11.2.0/db1/dbs/testnew10 /u01/app/oracle/11.2.0/db1/dbs/testfilenew
解决方法
1. 确定数据文件的位置
-
确定数据文件在哪个节点上
-- 在节点2上执行 ls -l /u01/app/oracle/11.2.0/db/dbs/
2. 将数据文件下线
-
登录到 SQL\Plus
sqlplus / as sysdba
-
将数据文件下线
SQL> ALTER DATABASE DATAFILE 9 OFFLINE; SQL> ALTER DATABASE DATAFILE 10 OFFLINE;
-
确认数据文件状态
SQL> COL NAME FOR A45 SQL> SET LINESIZE 234 SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;
3. 复制数据文件到共享目录
-
登录到 RMAN
rman target /
-
复制数据文件
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. 更改数据文件路径
-
重命名数据文件
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';
-
确认数据文件状态
SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;
5. 恢复数据文件
-
恢复数据文件
SQL> RECOVER DATAFILE '+DATA/orcl/datafile/testnew.339.895952649'; SQL> RECOVER DATAFILE '+DATA/orcl/datafile/testfilenew.340.895952749';
-
确认数据文件状态
SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;
6. 将数据文件上线
-
将数据文件上线
SQL> ALTER DATABASE DATAFILE 9 ONLINE; SQL> ALTER DATABASE DATAFILE 10 ONLINE;
-
确认数据文件状态
SQL> SELECT NAME, FILE#, STATUS FROM V$DATAFILE;
特殊情况:系统表空间数据文件创建在本地
1. 模拟创建
-
在节点一上创建系统表空间数据文件
SQL> ALTER TABLESPACE SYSTEM ADD DATAFILE '/u02/app/oracle/datafile/system02.dbf' SIZE 10M AUTOEXTEND OFF;
-
检查数据文件
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.9013336873 +DATA/orcl/datafile/undotbs1.264.9013336872 +DATA/orcl/datafile/sysaux.256.9013336851 +DATA/orcl/datafile/system.265.9013336855 +DATA/orcl/datafile/undotbs2.266.9013339436 +DATA/orcl/datafile/testdb.dbf7 /u02/app/oracle/datafile/system02.dbf
2. 处理系统表空间数据文件
-
将数据文件下线
SQL> ALTER DATABASE DATAFILE 7 OFFLINE;
注意:系统表空间数据文件无法下线,需要停机时间。
ORA-01541: system tablespace cannot be brought offline; shut down if necessary
-
关闭问题节点
SQL> SHUTDOWN IMMEDIATE;
-
在另一个节点上检查数据文件状态
SQL> SELECT OPEN_MODE FROM GV$DATABASE;
-
使用 ASM 命令将本地文件移动到 ASM
ASMCMD [+data/orcl/datafile] > CP /u02/app/oracle/datafile/system02.dbf ./ copying /u02/app/oracle/datafile/system02.dbf -> +data/orcl/datafile/system02.dbf
-
启动节点一数据库到 mount 状态
SQL> STARTUP MOUNT;
-
修改数据文件路径
SQL> ALTER DATABASE RENAME FILE '/u02/app/oracle/datafile/system02.dbf' TO '+data/orcl/datafile/system02.dbf';
-
启动数据库
SQL> ALTER DATABASE OPEN;
-
在另一个节点上检查数据文件状态
SQL> SELECT FILE_NAME, FILE_ID, ONLINE_STATUS, TABLESPACE_NAME FROM DBA_DATA_FILES;
-
重启另一个节点
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;
-
确认数据文件状态
SQL> SELECT FILE_NAME, FILE_ID, ONLINE_STATUS, TABLESPACE_NAME FROM DBA_DATA_FILES;
总结
通过上述步骤,可以有效地解决 Oracle RAC 环境中数据文件误建在本地目录的问题,特别是系统表空间的数据文件。