recover database :
在普通的recover database 或者 recover tablespace, recover datafile时,Oracle会以当前controlfile所纪录的SCN为准,利用archive log和redo log的redo entry,把相关的datafile 的block恢复到“当前controlfile所纪录的SCN”。
recover database using backup controlfile:
Oracle需要把数据恢复到比当前controlfile所纪录的SCN还要靠后的位置(比如说:control file是backup controlfile,或者controlfile是根据trace create的。),这时候,就需要用using backup controlfile。恢复就不会受“当前controlfile所纪录的SCN”的限制。只是想告诉数据库,我这个controlfile 是旧的,这个时候数据库就会不断应用归档日志,它也不知道哪一个是最后的归档和当前日志,需要限制就来自于你的语句(until time , until scn),或者可用的archive log(until cancel)
先介绍四个SCN概念
1:System Checkpoint SCN
当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询:
select checkpoint_change# from v$database
2:Datafile Checkpoint SCN
当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。
select name,checkpoint_change# from v$datafile;
select file#,name,checkpoint_change#,last_change#,status,enabled from v$datafile
3:Start SCN号
ORACLE将Start SCN号存放在数据文件头中,这个SCN用于检查数据库启动过程是否需要做Media Recovery.
我们可以通过以下SQL语句查询:
select name,checkpoint_change# from v$datafile_header
select file#,name,checkpoint_change#,status from v$datafile_header
4:End SCN (Stop SCN)号
ORACLE将stop SCN号存放在控制文件中,这个SCN号用于检查数据库启动过程是否需要做Instance Recovery.
我们可以通过以下SQL语句查询:
select name,last_change# from v$datafile
select file#,name,checkpoint_change#,last_change#,status,enabled from v$datafile
在正常的数据库操作过程中,所有正处于联机读写模式下的数据文件的终止scn都为null.
5:当前系统SCN
select current_scn from v$database
6、在数据库运行期间的scn值
在数据库打开并运行之后,控制文件中的系统检查点、控制文件中的数据文件检查点scn和每个数据文件头中的启动scn都是相同的。控制文件中的每个数据文件的终止scn都为null.
7:low scn
select recid,sequence#,first_change#,next_change# from v$log_history
SCN号与数据库启动
在安全关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的终止scn都会设置成数据文件头中的那个启动scn的值。在数据库重新启动的时候,Oracle将文件头中的那个启动scn与数据库文件检查点scn进行比较,如果这两个值相互匹配.那么数据库可以正常启动,不需要做media recoveryoracle。接下来还要比较数据文件头中的启动scn和控制文件中数据文件的终止scn。如果这两个值也一致,那么就不需要做需要instance recovery。就意味着所有数据块多已经提交,所有数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为null,这表示数据文件已经打开并能够正常使用了。
SCN号与数据库关闭
如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN号设置为NULL。如果数据库异常关闭的话,则END SCN号将为NULL.
为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号?
为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN号?
原因有二:
1.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。
这三个SCN在表空间处于只读期间都将被冻结。
2.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN,记录这些SCN号,可以区分控制文件是否是当前的控制文件。
Recovery database using backup controlfile
当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。
重建控制文件,重建方式分两种:
1.使用resetlogs选项时,System Checkpoint SCN为被归为0,而其中记录的各个数据文件的Datafile Checkpoint SCN则来自于Start SCN(也就是说可能会从冷备份的数据文件的数据文件头中获取)。根据上述的描述,此时需要采用using backup controlfile做recovery.因此情况是System Checkpoint SCN=0 < Start SCN = Datafile Checkpoint SCN。
2.使用noresetlogs选项时,有一个前提就是:一定要有online redo log的存在且可用,否则就要使用resetlogs选项。这个时候控制文件重建好时,其system checkpoint SCN=Datafile Checkpoint SCN=Lastest Checkpoint SCN in online redo log,我们可以看到Datafile Checkpoint SCN并没有从Start SCN中读取。而是读取了最新的日志文件中的SCN作为自己的数据。此 时重建的控制文件在恢复中的作用跟最新的控制文件类似,System Checkpoint SCN(已经读取最新的redo log的checkpoint SCN信息)可能会>Start SCN(因为数据文件可能会从冷备份中恢复),恢复时就不需要加using backup controlfile子句了。
关于backup controlfile的补充:backup controlfile只有备份时刻的archive log信息,并没有DB crash时刻的archive log信息,所以并不会自动应用online redo log,而是提示找不到序号为Lastest Archive log sequence + 1的archive log,尽管你可以手动指定online redo log来实现完全恢复,但因为一旦使用了using backup controlfile子句,Oracle就视为不完全恢复,必须open resetlogs!实际上,假如你有旧的控制文件又不想resetlogs,那很简单,使用旧的控制文件mount然后backup to trace,然后手工创建控制文件,使用reuse database ... noresetlogs .这样就可以recover database自动恢复并open database而不用resetlogs了(记住:必须有所有的online redo logs才可以这样!)。
备份的控制文件不能自动进行完全恢复,可以手工apply日志进行完全恢复
1、系统正常关闭:
system scn = datafile scn = start scn = stop scn
1)system scn = datafile scn = start scn,不需要介质恢复
2)stop scn not null且= start scn,不需要实例恢复
2、系统异常关闭:
system scn = datafile scn = start scn,stop scn null
1)system scn = datafile scn = start scn,不需要介质恢复
2)stop scn null,需要实例恢复
3、旧数据文件
system scn = datafile scn > start scn,stop scn null或stop scn not null 或stop scn not null= system scn = datafile scn
1)system scn = datafile scn > start scn,需要介质恢复成stop scn = start scn
4、备份控制文件
system scn = datafile scn < start scn,stop scn not null< start scn或stop scn not null= datafile scn=system scn < start scn或stop scn null
1)system scn = datafile scn <= start scn,需要使用using backup controlfile介质恢复成start scn = stop scn(当前日志最大SCN)
2)为保证上一次恢复没有用到log日志不被使用,必须resetlogs
5、重建控制文件(noresetlogs)前提:一定要有online redo log的存在且可用,否则就要使用resetlogs选项。
控制文件中datafile Checkpoint来自在线日志中的当前日志最大SCN.
当前日志最大SCN= system scn = datafile scn >= start scn ,stop scn not null/null
1)当前日志最大SCN = system scn = datafile scn >= start scn,需要介质恢复成start scn=stop scn
6、重建控制文件(resetlogs方式)
当使用resetlogs选项时,System Checkpoint SCN被归为0,而其中记录的各个数据文件的Datafile Checkpoint SCN则来自于Start SCN(也就是说可能会从冷备份的数据文件的数据文件头中获取)。根据上述的描述,此时需要采用using backup controlfile做recovery.因此该情况是System Checkpoint SCN=0 < Start SCN = Datafile Checkpoint SCN,stop scn not null/null。
1)System Checkpoint SCN=0 < datafile scn = start scn,需要使用using backup controlfile介质恢复成start scn=stop scn(当前日志最大SCN)
2)因为SCN已经为redolog scn,log已经不能使用,必须resetlogs 。
备注:摘自网络