由于SYSTEM 数据文件丢失,启动数据库时会报如下无法标识或找不到数据文件1的错误:
03:47:02 SYS@racdb1*SQL> startup;
ORACLE instance started.
Total System Global Area 413372416 bytes
Fixed Size 2213896 bytes
Variable Size 381683704 bytes
Database Buffers 20971520 bytes
Redo Buffers 8503296 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '+DATA/racdb/datafile/system.256.858651361'
需要从备库拷贝system数据文件过来,但从常规的文件系统中拷贝到ASM磁盘组中有一定的命名规则,随便拷贝会报如下错误:
ASMCMD [+DATA/racdb/datafile] > cp /home/grid/tmp/SYSTEM.258.910919287 ./SYSTEM.256.858651361
copying /home/grid/tmp/SYSTEM.258.910919287 -> +DATA/racdb/datafile/./SYSTEM.256.858651361
ASMCMD-08016: copy source->'/home/grid/tmp/SYSTEM.258.910919287' and target->'+DATA/racdb/datafile/./SYSTEM.256.858651361' failed
ORA-19505: failed to identify file "+DATA/racdb/datafile/./SYSTEM.256.858651361"
ORA-17502: ksfdcre:4 Failed to create file +DATA/racdb/datafile/./SYSTEM.256.858651361
ORA-15046: ASM file name '+DATA/racdb/datafile/./SYSTEM.256.858651361' is not in single-file creation form
ORA-15122: ASM file name '+DATA/racdb/datafile/./SYSTEM.256.858651361' contains an invalid file number
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 397
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)
所以,不能随便复制OMF格式的文件名,用常规的文件名复制方式即可,如下:
ASMCMD [+DATA/racdb/datafile] > cp /home/grid/tmp/SYSTEM.dbf ./
copying /home/grid/tmp/SYSTEM.dbf -> +DATA/racdb/datafile/SYSTEM.dbf
ASMCMD [+DATA/racdb/datafile] > ls -ls
Type Redund Striped Time Sys Block_Size Blocks Bytes Space Name
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 12801 104865792 106954752 EXAMPLE.264.858651503
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 87041 713039872 715128832 SYSAUX.257.858651361
N SYSTEM.dbf => +DATA/ASM/DATAFILE/SYSTEM.dbf.256.917754869
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 12033 98574336 100663296 TEST_TBS.275.910289303
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 14081 115351552 117440512 UNDOTBS1.258.858651363
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 3201 26222592 27262976 UNDOTBS2.265.858651785
DATAFILE UNPROT COARSE JUL 21 03:00:00 Y 8192 641 5251072 6291456 USERS.259.858651363
但是,还必须使用 alter database rename file '+DATA/racdb/datafile/system.256.858651361' to '+DATA/racdb/datafile/SYSTEM.dbf'; 命令重命名system数据文件,
但由于+DATA/racdb/datafile/system.256.858651361 这个数据文件已经丢失,不存在这个数据文件,所以无法执行以上重命名文件命令,会报如下错误:
03:56:12 SYS@racdb1*SQL> alter database rename file '+DATA/racdb/datafile/system.256.858651361' to 'DATA/racdb/datafile/SYSTEM.dbf';
alter database rename file '+DATA/racdb/datafile/system.256.858651361' to 'DATA/racdb/datafile/SYSTEM.dbf'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01141: error renaming data file 1 - new file 'DATA/racdb/datafile/SYSTEM.dbf' not found
ORA-01110: data file 1: '+DATA/racdb/datafile/system.256.858651361'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
可以通过如下方法解决:
RMAN> run {
2> set newname for datafile 1 to '+DATA/racdb/datafile/SYSTEM.dbf';
3> switch datafile 1;
4> }
executing command: SET NEWNAME
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch command at 07/21/2016 04:04:30
RMAN-20230: datafile copy not found in the repository
RMAN-06015: error while looking up datafile copy name: +DATA/racdb/datafile/system.dbf
RMAN> catalog start with '+DATA/racdb/datafile'; ##这个必须要执行,否则执行 switch datafile 1;会报如上错误。
searching for all files that match the pattern +DATA/racdb/datafile
List of Files Unknown to the Database
=====================================
File Name: +data/racdb/DATAFILE/SYSTEM.dbf
Do you really want to catalog the above files (enter YES or NO)? YES
cataloging files...
cataloging done
List of Cataloged Files
=======================
File Name: +data/racdb/DATAFILE/SYSTEM.dbf
然后再执行以上的rman命令更新控制文件中system数据文件的新位置即可,如下:
RMAN> run {
2> set newname for datafile 1 to '+DATA/racdb/datafile/SYSTEM.dbf';
3> switch datafile 1;
4> }
executing command: SET NEWNAME
datafile 1 switched to datafile copy
input datafile copy RECID=9 STAMP=917755520 file name=+DATA/racdb/datafile/system.dbf
RMAN>
04:07:02 SYS@racdb1*SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '+DATA/racdb/datafile/system.dbf' ##已经提示新的system.dbf文件需要恢复了,执行如下恢复即可:
04:07:07 SYS@racdb1*SQL> recover datafile 1;
Media recovery complete.
04:07:15 SYS@racdb1*SQL> alter database open;
Database altered.
OK,主库system数据文件丢失,恢复完成。