SCN详解

一 SCN概念

System Change Number. A database ordering primitive. The value of an SCN is the logical point in time at which changes are made to a database.

The system change number (SCN) is Oracle's clock – every time we commit, the clock increments. The SCN just marks a consistent point in time in the database. 

A checkpoint is the act of writing dirty (modified blocks from the buffer cache to disk. 

The database ALWAYS has transactions going on, ALWAYS. SMON and many other background processes are always doing work, the database (unless it is opened read only) is always doing transactions. 

SCN号与oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理,从而才能很好地解决这方面的问题。

SCN与CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到数据文件。

CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。与checkpoint相关的SCN号有四个,其中三个存在控制文件中,一个存放在数据文件头中,下面将分别介绍。

二 SCN分类

1 系统检查点scn(System Checkpoint SCN)

当一个检查点动作完成后,Oracle就把系统检查点的SCN存储到控制文件中。

SQL:SELECT checkpoint_change#,scn_to_timestamp(checkpoint_change#)+0,current_scn,scn_to_timestamp(current_scn)+0 FROM v$database;

2 数据文件检查点scn(Datafile Checkpoint SCN)

当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在控制文件中。

SQL:SELECT NAME,Checkpoint_change# ,scn_to_timestamp(Checkpoint_change#)+0, checkpoint_time FROM v$datafile;

3 开始scn(Start SCN)

Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为开始scn,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复(实例恢复)。

SQL:SELECT NAME,Checkpoint_change# ,scn_to_timestamp(Checkpoint_change#)+0, checkpoint_time FROM v$datafile_header;

执行检查点,并将表空间离线,离线的表空间对应的数据文件头部的SCN无法取到,而离线的表空间对应的数据文件存在控制文件头部的SCN保留在表空间离线的那一时间。

4 结束scn(Stop SCN)

每个数据文件的终止scn都存储在控制文件中,在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL。

SQL:SELECT NAME,status,enabled,Checkpoint_change# ,checkpoint_time,last_change# FROM v$datafile;

5 与检查点无关的SCN

1)日志文件SCN( Lowest system change number (SCN) in the log)

SQL语句:select group#,sequence#,status,first_change#,scn_to_timestamp(first_change#)+0,first_time from v$log;

当前日志组中的第一个SCN号。

记录日志时,自动记录最新的SCN 到日志中。因此,每一条日志都包含了一个时间。当DBWn 进程启动时,将依照日志记录写入一段数据。这一段日志记录的时间段必定有一个最早时间和一个最新(迟)时间。最早的时间我们称为LOW SCN(即上次清空日志后的第一条记录),最新时间我们称为NEXT SCN(即下次日志清空前的最近一条记录)。这里, 由CKPT 进程将NEXT SCN 的值同步更新到START SCN 、SYSTEM CHECKPOINT SCN 和DATAFILE CHECKPOINT SCN 中。以确保所有文件的一致性。

2)当前current scn

SQL语句:

select to_char(dbms_flashback.get_system_change_number) from dual;—当前SCN号

select to_char(current_scn) system_scn from v$database;—当前SCN号

select to_char(TIMESTAMP_TO_SCN(SYSDATE)) from dual;

SELECT TO_CHAR(SCN_TO_TIMESTAMP(scn)) from dual;  //scn是指具体的scn号

备注:SCN实际是和系统时间挂钩的,通过SYSDATE可以自动生成SCN号。

三 数据库运行期间SCN值

在数据库打开并运行之后,控制文件中的系统检查点、控制文件中的数据文件检查点scn和每个数据文件头中的开始scn都是相同的。控制文件中的每个数据文件的结束scn都为null.

在安全关闭数据库的过程中,系统会执行一个检查点动作,这时所有数据文件的结束scn都会设置成数据文件头中的那个开始scn的值。在数据库重新启动的时候,Oracle将文件头中的那个开始scn与数据库文件检查点scn进行比较,如果这两个值相互匹配,oracle接下来还要比较数据文件头中的开始scn和控制文件中数据文件的结束scn。如果这两个值也一致,就意味着所有数据块多已经提交,所有对数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,存储在控制文件中的数据文件结束scn的值再次被更改为null,这表示数据文件已经打开并能够正常使用了。   

四 SCN与数据库启动/关闭

1 SCN与数据库启动

1)检查是否需要介质恢复

在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN 号都相同时,数据库可以正常启动,不需要做media recovery。三者当中有一个不同时,则需要做media recovery。

2)检查是否需要实例恢复

如果在启动的过程中,End SCN 号为NULL,则需要做instance recovery,ORACLE 在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery。

2 SCN与数据库关闭

如果数据库正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号,当数据库启动时,发现它们是一致的,则不需要做instance recovery,在数据库正常启动后,ORACLE会将END SCN号设置为NULL,如果数据库异常关闭的话,则END SCN号将为NULL。

1) 数据库正常关闭

注:正常关闭时,Start SCN=End SCN,不需要恢复。

2)数据库异常关闭

查看检查点信息

注:异常关闭时,End SCN为空。

未提交的事务回滚

查看Alert信息,数据库打开时需进行实例恢复

五 讨论

为什么需要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或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平