谈到Crosscheck,就要先说说Controlfile,它里面记录了数据对象备份和恢复的相关信息,举例来说:如果物理归档日志发生丢失或损坏,但controlfile还记录着这些日志信息,则归档备份会因找不到这些文件而失败,这时就需要用到crosscheck archivelogall去检查控制文件和物理文件的差异,crosscheck的结果包含两个部分,存在于物理介质上的文件被标记为available,不存在的则标记为expired(如果不存在的文件恢复到原来位置上,则crosscheck后会重新标记为available),然后用deleteexpired archive log all删除控制文件中那些失效的日志信息,再次备份归档日志,成功;
crosscheck对于备份集也同样如此,如下例。
RMAN> crosscheck backupset;
using target database control file instead of recoverycatalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=74 devtype=DISK
crosschecked backup piece: found to be 'AVAILABLE'
backup piece handle=/oracle/QRH/102_64/dbs/c-748375813-20120520-00recid=1 stamp=783815906
crosschecked backup piece: found to be 'EXPIRED'
backup piece handle=/oracle/PRH/sapdata1/db_t785778883_s2_p1recid=2 stamp=785778884
crosschecked backup piece: found to be 'EXPIRED'
backup piece handle=/oracle/PRH/sapdata1/db_t785779014_s5_p1recid=5 stamp=785779016
crosschecked backup piece: found to be 'AVAILABLE'
backup piece handle=/oracle/QRH/102_64/dbs/c-748375813-20120612-00recid=6 stamp=785779052
Crosschecked 6 objects
以下案例是我今天遇到的情况,由于做归档日志恢复后,恢复的文件被删除而导致新的备份失败(可能是由于controlfile认为恢复的那些日志也需要重新备份):
上班发现归档日志所在的磁盘目录快撑爆了,在用NBU备份归档失败后尝试直接用RMAN手工备份,得到如下报错:
RMAN> RUN {
2> ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';
3> sql 'alter system archive log current';
4> BACKUP
5>
6>
7>
8> RELEASE CHANNEL ch00;
9> }
using target database control file instead of recoverycatalog
allocated channel: ch00
channel ch00: sid=259 devtype=SBT_TAPE
channel ch00: VERITAS NetBackup for Oracle - Release 6.0(2006110304)
sql statement: alter system archive log current
Starting backup at 13-AUG-12
current log archived
released channel: ch00
RMAN-00571:===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002: failure of backup command at 08/13/2012 10:15:04
RMAN-06059: expected archived log not found, lost of archived logcompromises recoverability
ORA-19625: error identifying file/oracle/PRH/sapdata12/1_376900_642211771.dbf
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
而默认的归档路径是在/oracle/PRH/oraarch下的,RMAN怎么会去sapdata12下查找归档文件呢,看这个SCN号才想起来上周末我做过归档日志的恢复,而且是恢复到了sapdata12目录下,现在该目录已经没有376900这个归档日志了,根据上述的crosscheck原理,在RMAN下分别执行crosscheck archivelog all 和delete expired archivelog all,然后备份就成功了。
RMAN> crosscheck archivelog all;
using target database control file instead of recoverycatalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=260 devtype=DISK
validation failed for archived log
archive log filename=/oracle/PRH/sapdata12/1_380592_642211771.dbfrecid=389354 stamp=791076624
validation failed for archived log
archive log filename=/oracle/PRH/sapdata12/1_380593_642211771.dbfrecid=389353 stamp=791076624
validation succeeded for archived log
archive logfilename=/oracle/PRH/oraarch/PRHarch1_380594_642211771.dbfrecid=385441 stamp=791036169
validation succeeded for archived log
archive logfilename=/oracle/PRH/oraarch/PRHarch1_380595_642211771.dbfrecid=385458 stamp=791036227
RMAN> delete expired archivelog all;
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=260 devtype=DISK
List of Archived Log Copies
Key
------- ---- ------- - --------- ----
389354
389353
Do you really want to delete the above objects (enter YES orNO)?YES
deleted archive log
archive log filename=/oracle/PRH/sapdata12/1_380592_642211771.dbfrecid=389354 stamp=791076624
deleted archive log
archive log filename=/oracle/PRH/sapdata12/1_380593_642211771.dbfrecid=389353 stamp=791076624
Deleted