一个SCN号就是一个oracle数据库中使用的逻辑的、内部的时间戳。这个SCN号可以表明一个事件在oracle数据库中发生的精确时间。
Oracle数据库中的SCN号分为四种,分别为:系统检查点SCN、数据文件SCN、结束SCN、数据文件头SCN。
可使用如下语句查看当前的4类SCN:
SELECT B.NAME,
A.CHECKPOINT_CHANGE# DATABASE_SCN,
B.CHECKPOINT_CHANGE# DATAFILE_SCN,
C.CHECKPOINT_CHANGE# START_SCN,
B.LAST_CHANGE# SHUT_SCN
FROM V$DATABASE A, V$DATAFILE B, V$DATAFILE_HEADER C
WHERE B.FILE# = C.FILE#;
V$DATABASE → CHECKPOINT_CHANGE# ,系统检查点SCN。当一个检查点动作完成后,Oracle就把系统检查点的SCN存储到控制文件中。
V$DATAFILE →CHECKPOINT_CHANGE#,数据文件检查点SCN。当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在控制文件中。
→LAST_CHANGE#,终止SCN,每个数据文件的终止scn都存储在控制文件中。
V$DATAFILE_HEADER → CHECKPOINT_CHANGE#,启动SCN。Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。
当检查点SCN,datafile SCN和start SCN都一致时,数据库不需要进行介质恢复。
至于终止SCN,如果数据库是abort方式关闭的,当你启动到mount 的时候,会发现 终止SCN 为 空。这是因为因为abort 后,系统非正常关闭。redo里还有赃块没有写入磁盘。于是数据库重新开启会根据这个终止SCN为空而判断出需要进行介质恢复。
只有正常关闭数据库时,所有的脏块写入磁盘后,终止SCN才会有值。
这时候在Oracle在启动地过程中会进行实例恢复:1.定位到最早的 active状态的redo日志文件(scn号和系统scn相等的那个)进行前滚恢复。
如果数据库是正常关闭的,那么进入mount 后 ,会看到 上次终止SCN的状态,open后 终止SCN会被置为空。