日期:2014-05-16  浏览次数:20488 次

oracle中的检查点Ckpt和SCN号

Checkpoint

? checkpoint是用来减少在数据库恢复过程中所花的时间(instance recovery).数据库中有个CKPT进程,这个是个可选进程,但是真正执行检查点的任务并不是有ckpt来完成的,而是ckpt在更新控制文件和数据文件头的有关信息后,通知DBWn进程,产生一个检查点,在产生检查点的时候,DBWn进程会将buffer cache中的脏数据(当前online redo log对应的脏数据),写入我们的数据文件当中。那么这个时候如果数据库此时崩溃(比如我们做个shutdown abort),那么在进行实例恢复的时候就可以不需要当前online redo log的内容了,会很快就做完。因此ckpt进程只是个辅助进程,他的任务更多的是用来在系统做checkpoint的时候更新控制文件和数据文件头中的信息。其实在oracle 8i的时候呢,ckpt的任务一般都是由lgwr进程来完成,到了8i以后,随着CKPT进程的引入,lgwr的工作负担就减轻了很多(commit的速度加快了)


那么如何来产生检查点呢?有三种方法:

?

1.alter system checkpoint

2.alter system switch logfile

3.DBWn进程写出脏块


SCN (system change number)

?在Oracle的内部同步时钟,是系统改变号,的缩写(system change number。

?可以通过dbms_flashback包来查询当前系统的改变号:select dbms_flashback.get_system_change_number from dual;

?一般来讲SCN主要是用来标识数据库所做的所有改变,只能前进,不能回退,除非我们打算重建库,否则数据库中的SCN永远不会归0.

?

需要注意的是:

1.CKPT一定是是在checkpoint发生的时候将数据库当前的SCN更新入数据库文件头和控制文件当中,同时DBWn进程将buffer cache中的脏数据块(dirty block)写到数据文件当中(这个脏数据也一定是当前online redo log保护的那一部分)。


2.同时CKPT进程还会在控制文件当中记录(redo block address)RBA,这个地址用来标志恢复的时候需要从日志中的那个位置开始。


在Oracle数据库中和checkpoint相关的SCN总共有4个

1.System checkpoint SCN ?(存在于控制文件)

在系统执行checkpoint后,Oracle会更新当前控制文件中的System checkpoint SCN。

我们可以通过以下视图来查看

select checkpoint_change# from v$database:


2.Datafile checkpoint SCN (存在于控制文件)

由于控制文件中记录了Oracle中各个数据库文件的位置和信息,其中当然也包括了Datafile checkpoint SCN,因此在执行checkpoint的时候,Oracle还会去更新控制文件中所记录的各个数据文件的datafile checkpoint SCN.

我们可以通过以下视图来查看

select checkpoint_change# ?from v$datafile;


3.Start SCN (存在于各个数据文件头)

在执行checkpoint时,Oracle会更新存放在各个实际的数据文件头的Start SCN (除开控制文件),这个SCN存在的目的是用于检查数据库启动过程中是否需要做media recovery(介质恢复)

我们可以通过以下视图来查看

select checkpoint_change# from v$datafile_header;


4.End SCN(存在于控制文件)

最后一类SCN,End SCN他也是记录在控制文件当中,每一个所记录的数据文件头都有一个对应的End SCN,这个End SCN一定是存在于控制文件当中。这个SCN主要是用来去和控制文件的scn比较,判断数据库启动的时候是否需要做instance recovery。

我们可以通过以下视图来查看

select name,last_change# from v$datafile

那么其实在数据库正常运行的情况下,对于read/write的online 数据文件这个SCN号为#FFFFFF(NULL).


oracle