SCN&CHECKPOINT

        SCN:System Change Number ,用来标示数据库在某个时刻的确切版本,他只能前进,不能后退. SCN是数字,它是由timestamp转换过来的,可以select timestamp_to_scn(systimestamp) from dual;获得一个SCN,也可以用scn_to_timestamp转换为timestamp.

         SCN存在于控制文件,数据文件头,BLOCK头,日志文件头,日志文件中。

         1.控制文件中的SCN:当系统执行checkpoint之后,会更新控制文件的System checkpoint SCN;

          Select checkpoint_change# from v$database;

         2.Datafile checkpoint SCN(存在于控制文件):由于控制文件记录了数据文件的位置和信息,所以控制文件也会记录数据文件的Datafile checkpoint SCN,当执行checkpoint时,会更新控制文件中的datafile checkpoint scn.

         Select checkpoint_change# from v$datafile;

         3.Start SCN(存在于各个数据文件头):执行checkpoint的时候,ORACLE会更新存放在各个数据文件的Start SCN

         Select checkpoint_change# from v$datafile_header;

         4.Stop SCN(存在于控制文件中)既然有Start SCN,当然也会有Stop SCN,

         Select name,last_change# from v$datafile;

         对于onlinedatafile 这个Stop SCN会为null

         5.Low SCN(存在于控制文件以及redo文件中):它表示一个redo log的起始SCN

         6.Next SCN(存在于控制文件以及redo 文件中):他表示一个redo log 结束的SCN。对于一个currentredo log来说 它的next SCN为无穷大,或者null,因为不可知。

         7.有关block 中的SCN太复杂,另外单独介绍。

          在数据库的启动:

1.      检查System checkpoint SCN是否等于数据文件头中的Datafile checkpoint scn.如果相等就表示这个数据文件不是来自于备份就不需要做media recovery.

2.      检查Start SCN是否等于Stop SCN,如果想等就不需要做instance recovery,如果不等,就需要做instance recovery,因为非正常关闭数据库不会做checkpoint,那么Stop SCN依然为无穷大,所以ORACLE就可以根据这两个的值是否相等判断数据库是否需要做instance recovery.如果数据库是正常关闭的,那么ORACLE 会将Stop SCN的值设为Start SCN.其实数据库打开的时候也会做一次checkpoint,具体可以设值log_checkpoints_to_alert=true参数,然后查看alert文件来验证open阶段是否执行了checkpoint,执行这个checkpoint的时候会将End SCN设置为null.

总结一下:控制文件中记录了多个SCN System checkpoint SCN, datafile checkpoint scn, Stop  scnredo里面的low scn ,next scn.数据头文件中记录的只有一个Start  t scn.

下面是dump实验:

dump control file:   

SQL> alter session set events 'immediate trace name controlf level 8';

 

Session altered.

下面是一部分转储内容(系统处于OPEN状态):

 

          DB Name "ROBIN"

 Database flags = 0x00404001 0x00001000

 Controlfile Creation Timestamp  09/08/2009 18:28:58

 Incmplt recovery scn: 0x0000.00000000

 Resetlogs scn: 0x0000.00000001 Resetlogs Timestamp  09/08/2009 18:28:58

 Prior resetlogs scn: 0x0000.00000000 Prior resetlogs Timestamp  01/01/1988 00:0

0:00

 Redo Version: compatible=0xa200200

 #Data files = 6, #Online files = 6

 Database checkpoint: Thread=1 scn: 0x0000.00053433

这里的SCN就是

System checkpoint scn 它等于0x0000.00053433

 Threads: #Enabled=1, #Open=1, Head=1, Tail=1

…………………………..

DATA FILE #5:

  (name #12) /storage/ora_data/ROBIN/datafile/o1_mf_test_5bf4m3y7_.dbf

creation size=12800 block size=8192 status=0xe head=12 tail=12 dup=1

 tablespace 5, index=6 krfil=5 prev_file=0

 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00

 Checkpoint cnt:14 scn: 0x0000.00053433 09/15/2009 07:15:48 

  这里的scndatafile checkpoint scn ,它和System checkpoint scn是相等的。

 Stop scn: 0xffff.ffffffff 09/10/2009 15:30:07                      

  这里的Stop SCN就是null

 Creation Checkpointed at scn:  0x0000.00027255 09/08/2009 19:20:39

 thread:1 rba:(0xb.9588.10)

 Offline scn: 0x0000.00000000 prev_range: 0

 Online Checkpointed at scn:  0x0000.00000000

 thread:0 rba:(0x0.0.0)

 

这里控制文件中记录了System checkpoint scn,Stop scn,datafile check point scn.

 Full checkpoint :到了log_checkpoint_interval设置时间间隔, 或者alter system checkpoint,以非abort shutdown 就会产生full checkpoint,它有以下作用:

  1. Get current RBA from the log buffers
  2. 唤醒DBWn.
  3. DBWn把所有检查点以前修改过的buffers 写到disk.
  4. Update data file headers and control file.
  5. 由于执行了检查点,所以在instance recover的时候不需要redo 里面的内容了

数据库关闭和开始都会执行一次checkpoint,具体可以设置参数

alter system set log_checkpoints_to_alert=true; 让执行的检查点被记录到alert log 中。

另外Egyle log switch不是full checkpoint ,它是incremental checkpoint,但是它会更新控制文件和数据文件的头。

 

Incremental Checkpoint:

1.      避免当执行full checkpoint的时候执行大量的I/O操作。

2.      只写oldest block,不是写all block.

3.      只记录到control file,不会更新数据头文件。

增量检查点可以有效的减少恢复的时间,同时避免执行检查点带来的I/O性能问题。

原文地址:https://www.cnblogs.com/hehe520/p/6330706.html