码迷,mamicode.com
首页 > 其他好文 > 详细

SCN

时间:2016-11-14 14:36:57      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:ack   工作   故障   man   部分   reset   res   版本   开始   

SCN

一、SCN的引入

   众所周知,当oracle实例崩溃时,oracle通过检查点队列使用CKPT进程,周期性的将LRBA记入控制文件,以记录读取REDO LOG的范围。确定范围之后,oracle首先进行前滚(将redo log中的数据块重新构造成buffer),然后回滚(将不需要进行构造的未提交的脏块回滚)。然而,这里又有几个问题:

1、Oracle如何确定读取哪些redo log进行日志的前滚。

2、REDO LOG中存在部分不需要前滚的数据,比如,数据已经提交,或者,数据文件的数据是最新的,而redo log中的数据,反而是老旧的,如果覆盖,就会出现大问题。这个是如何识别的?

 

二、SCN相关概念

    SCN是一串自增的数字,由DBMS按照相关算法,将时间转换而成,用来记录oracle数据库的数据更新,标识数据库在某个确切时刻提交的版本。当执行事务时(DML语句、DDL语句),系统会为每个事务变化生成相应的SCN。当备份数据文件时,备份文件会记录备份点的SCN值,当恢复时,oracle会从备份点的SCN值开始恢复,一直到失败点的SCN值。scn在数据库中是无处不在的,常见的事务表,控制文件,数据文件头,日志文件,数据块头等都记录有scn.冠以不同前缀,scn也有了不同的名称,比如检查点scn(checkpoint scn),resetlogs scnSCN有一下四个:系统SCN、数据文件SCN、结束SCN、开始SCN

1、系统 SCN

针对整个数据库的一个时间戳,所以只有一个。

2、数据文件 SCN

针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份。

3、结束SCNStop SCN

记录的是日志文件中最老的ACTIVE文件的FIRST SCN号或者CURRENTFIRST SCN号。实例恢复需要用到ACTIVECURRENT的日志文件。

结束SCN为空,表明数据库非正常关闭。如果正常关闭,系统scn、数据文件scn和结束scn应该是一样的。

实例恢复时,需要用到这三个SCN来确定要哪些日志文件做恢复,需要用到LRBA来确定从哪个记录开始恢复。

4、开始SCNStart SCN

三、SCN的应用场景

1、数据库正常的关闭和启动

   数据库正常关闭时,系统会执行一个完全检查点动作,并用该检查点时的SCN号更新上述4个SCN号,这时所有数据文件的终止SCN号会设置为数据文件头的那个启动SCN(除了离线和只读的数据文件)

       数据库重新启动时,Oracle将数据文件头中的启动SCN与数据文件检查点SCN比较,如果这两个值匹配,Oracle接下来再比较数据文件头中的SCN和控制文件中数据文件的终止SCN,如果这个值也匹配,就意味着所有数据块已经提交,因此数据 库不需要进行恢复,此时数据库直接打开。当所有的数据文件都打开之后,在线且可读写的数据文件终止SCN再次被设置为NULL,表示数据文件已经打开并能 够正常使用了。有些表空间是只读的,这时控制文件中的系统检查点SCN号会不断增长,而数据文件SCN号和文件头中的启动SCN(会停止更新直到表空间又 设置为可读写),显然这时系统检查点SCN号会大于数据文件SCN和文件头启动SCN。

2、数据库正常的关闭和启动

      数据库非正常关闭 ( 或称为实例崩溃 ) 时,终止 SCN 不会被设置,依然为 NULL ,这可以通过把数据库启动至 mount 状态查询出来。 这样重新启动时,SMON进程 会执行实例恢复工作,即先执行前滚、回滚操作,再把数据库打开。

3、数据文件介质故障

      出现介质故障时,数据文件检查点SCN及系统检查点SCN比文件头启动SCN大。系统发生介质故障时,数据文件被以前的备份代替,控制文件中的数据文件检查点SCN肯定比文件头中的启动SCN要大,这样Oracle就知道要对这个文件进行介质恢复

4、控制文件介质故障

    系统检查点SCN及数据文件SCN比数据文件头启动SCN小:在数据库恢复时,控制文件可能不是最新的,即把一个较早的控制文件还原为当前的控制文件,然后再执行恢复操作,这时控制文件中的系统检查点SCN和数据文 件SCN可能比文件头的启动SCN小。这时恢复数据库要用下面命令:recover database using Backup Controlfile或其他的恢复语句。

5、备份时的实例崩溃

      当执行begin backup时实例崩溃:控制文件中的数据文件检查点SCN号和数据文件头部检查点SCN号相同,但是每个可读写的在线数据文件之间检查点SCN号不同, 那么要求介质恢复,例如发出begin backup命令后就会出现这种情况,需要通过end backup命令好才可以打开数据库。

6、日志空跑

      在oracle数据库中,每一个数据块、日志都有相对应的SCN号。在实例崩溃,日志前滚的过程中,oracle会比较每个待前滚的日志块,如果日志块的SCN比数据文件的SCN号低,则表明数据文件的数据较新,则不会覆盖数据文件上的块,这样就形成日志空跑。日志空跑保证了跑日志过程中的数据一致性。

 

SCN

标签:ack   工作   故障   man   部分   reset   res   版本   开始   

原文地址:http://www.cnblogs.com/ironyoda/p/6061458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!