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 。


备注:摘自网络