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;
对于online的datafile 这个Stop SCN会为null;
5.Low SCN(存在于控制文件以及redo文件中):它表示一个redo log的起始SCN。
6.Next SCN(存在于控制文件以及redo 文件中):他表示一个redo log 结束的SCN。对于一个current的redo 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 scn,redo里面的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
这里的scn就datafile 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,它有以下作用:
- Get current RBA from the log buffers
- 唤醒DBWn.
- DBWn把所有检查点以前修改过的buffers 写到disk.
- Update data file headers and control file.
- 由于执行了检查点,所以在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性能问题。