由于+RECO磁盘组故障,导致指向该磁盘组的DB_RECOVERY_FILE_DEST下的文件都丢失。因为数据库文件使用OMF,对数据库影响较大的是一份控制文件和一半日志成员丢失,而控制文件缺失会造成数据库无法正常启动,报错如下:
ORA-00205: error in identifying control file, check alert log for more info
OMF管理的控制文件中有一份是保存的+DATA磁盘组上,于是使用这份完整的控制文件来恢复+RECO磁盘组中的控制文件:
1)使用控制文件原来的的文件名称来恢复控制文件,结果失败:
ASMCMD> cp +DATA/ORCL/CONTROLFILE/current.272.1093648975 +RECO/ORCL/CONTROLFILE/current.256.1093648975
copying +DATA/ORCL/CONTROLFILE/current.272.1093648975 -> +RECO/ORCL/CONTROLFILE/current.256.1093648975
ASMCMD-8016: copy source '+DATA/ORCL/CONTROLFILE/current.272.1093648975' and target '+RECO/ORCL/CONTROLFILE/current.256.1093648975' failed
ORA-15056: additional error message
ORA-15046: ASM file name '+RECO/ORCL/CONTROLFILE/current.256.1093648975' is not in single-file creation form
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 617
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)
2)不指定新控制文件文件的名称,直接拷贝完好的控制文件,即使用+DATA磁盘组上的控制文件名称,结果也失败:
ASMCMD> cp +DATA/ORCL/CONTROLFILE/current.272.1093648975 +RECO/ORCL/CONTROLFILE/
copying +DATA/ORCL/CONTROLFILE/current.272.1093648975 -> +RECO/ORCL/CONTROLFILE/current.272.1093648975
ASMCMD-8016: copy source '+DATA/ORCL/CONTROLFILE/current.272.1093648975' and target '+RECO/ORCL/CONTROLFILE/current.272.1093648975' failed
ORA-15056: additional error message
ORA-15046: ASM file name '+RECO/ORCL/CONTROLFILE/current.272.1093648975' is not in single-file creation form
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 617
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)
3)使用不带数字后缀的名称来命名新控制文件,命令成功。但是新控制文件实际上是保存在了+RECO/ASM/CONTROLFILE/位置,只在+RECO/ORCL/CONTROLFILE/上创建了一个别名:
ASMCMD> cp +DATA/ORCL/CONTROLFILE/current.272.1093648975 +RECO/ORCL/CONTROLFILE/current
copying +DATA/ORCL/CONTROLFILE/current.272.1093648975 -> +RECO/ORCL/CONTROLFILE/current
ASMCMD> ls -l
Type Redund Striped Time Sys Name
CONTROLFILE UNPROT FINE AUG 27 00:00:00 N current => +RECO/ASM/CONTROLFILE/current.256.1113785871
因此,在ASM中创建新文件时是不能指定由ORACLE自动生成的数字后缀,也就无法直接恢复原有的文件,只能通过更改文件名称的方式来进行恢复。
最后,更改初始化参数control_files,让丢失的控制文件指向恢复的新名称的控制文件。
#创建pfile
startup nomount
create pfile='/u01/app/oracle/product/19.0.0/dbhome/dbs/pfileorcl.ora' from spfile;
#编辑pfile,去掉名称后面的数字后缀
*.control_files='+DATA/ORCL/CONTROLFILE/current.272.1093648975','+RECO/ORCL/CONTROLFILE/current'
#关闭数据库
shutdown immediate
#使用更改的pfile启动数据库到挂载模式
startup pfile='/u01/app/oracle/product/19.0.0/dbhome/dbs/pfileorcl.ora' mount;
ORACLE instance started.
Total System Global Area 8657039528 bytes
Fixed Size 12443816 bytes
Variable Size 2852126720 bytes
Database Buffers 5771362304 bytes
Redo Buffers 21106688 bytes
Database mounted.
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string +DATA/ORCL/CONTROLFILE/current
.272.1093648975, +RECO/ORCL/CO
NTROLFILE/current
#重新创建spfile
create spfile='+DATA/ORCL/PARAMETERFILE/spfile' from pfile='/u01/app/oracle/product/19.0.0/dbhome/dbs/pfileorcl.ora';
#关闭数据库,重新启动,再次确认控制文件的位置
shutdown immediate
startup mount