一、实验,如下: --Control fil e三个地方为: 1.1 System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file) SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE# ------------------ 3779864
1.2 Datafile checkpoint SCN ===============> (DATAFILE CHECKPOINT SCN in control file) SQL> set lines 200 SQL> col name for a60 SQL> select name,checkpoint_change# from v$datafile;
restore datafile后,可以mount database然后去检查controlfile and datafile header的SCN
select 'controlfile' "SCN location",name,checkpoint_change# from v$datafile where name like '%users01%' union select 'file header',name,checkpoint_change# from v$datafile_header where name like '%users01%';
3.2 RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE; ===> OPEN DATABASE RESETLOG
如果只是某TABLE被DROP掉,没有破坏数据库整体数据结构,还可以用NCOMPLETE RECOVERY解决 如果是某个TABLESPACE OR DATAFILE被DROP掉,因为档案结构已经破坏,目前的CONTROL FILE内已经没有 该DATAFILE的信息,就算你只RESTORE DATAFILE然后进行INCOMPLETE RECOVERY也无法救回被DROP的DATA FILE。
只好RESOTRE 之前备份的CONTROL FILE(里头被DROP DATAFILE Metadata此时还存在),不过RESTOREC CONTROL FILE后 此时Oracle会发现CONTROL FILE内的SYSTEM SCN会小于目前的DATAFILE HEADER SCN,也不等于目前储存于LOG FILE内的SCN, 此时就必须使用RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE到DROP DATAFILE OR DROP TABLESPACE之前的SCN。