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