SCN是唯一、单向增长的,除非重建数据库,否则不会归零。
oracle在很多地方都有记录SCN:
1 controlfile
(可以使用:alter system set events='immediate trace name controlf level 10';命令dump出控制文件)
***************************************************************************
DATABASE ENTRY
***************************************************************************
(blkno = 0x1, size = 192, max = 1, in-use = 1, last-recid= 0)
DF Version: creation=0x9200000 compatible=0x8000000, Date 04/21/2006 08:46:01
DB Name "ORA92"
Database flags = 0x00404001
Controlfile Creation Timestamp 04/21/2006 08:46:02
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0000.0002e872 Resetlogs Timestamp 04/21/2006 08:46:03
Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 05/12/2002 16:16:56
Redo Version: creation=0x9200000 compatable=0x9200000
#Data files = 14, #Online files = 14
Database checkpoint: Thread=1 scn: 0x0000.3c1234fc 系统最后一次checkpoint的SCN
Threads: #Enabled=1, #Open=1, Head=1, Tail=1
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000
...
***************************************************************************
DATA FILE RECORDS
***************************************************************************
(blkno = 0x6, size = 180, max = 100, in-use = 15, last-recid= 160)
DATA FILE #1:
(name #8) E:/ORACLE/ORADATA/ORA92/SYSTEM01.DBF
creation size=0 block size=8192 status=0xe head=8 tail=8 dup=1
tablespace 0, index=6 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:232 scn: 0x0000.3c1234fc 07/03/2006 14:36:58 记录数据文件头的checkpoint SCN 也叫start SCN
Stop scn: 0xffff.ffffffff 07/03/2006 12:33:20 数据库打开时为无穷大(infinity),关闭后修改为start SCN
Creation Checkpointed at scn: 0x0000.0000000b 05/12/2002 16:17:58
thread:0 rba:(0x0.0.0)
***************************************************************************
LOG FILE RECORDS 日志文件包含两个SCN(高低)表示记录的redo 信息的范围
***************************************************************************
(blkno = 0x5, size = 72, max = 50, in-use = 3, last-recid= 3)
LOG FILE #1:
(name #3) E:/ORACLE/ORADATA/ORA92/REDO01.LOG
Thread 1 redo log links: forward: 2 backward: 0
siz: 0x32000 seq: 0x00000050 hws: 0x5 bsz: 512 nab: 0xffffffff flg: 0x8 dup: 1
Archive links: fwrd: 0 back: 3 Prev scn: 0x0000.3c0d7dfe
Low scn: 0x0000.3c12040a 07/03/2006 11:16:01
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00 next scn为无穷大表示是当前日志文件
2 datafile
数据文件的头部也记录着checkpoint SCN ,当发生checkpoint时(我们可以使用alter system checkpoint;强制系统checkpoint),检查点通知 DBWR 写数据文件,写完后ckpt更新控制文件和数据文件头,当DBWR 写 数据块的时候若发现数据块的相关RDBA (位于日志文件的位置) 的 log block 还没有被写入日志文件,则在dbwr写块之前必须通知llgwr把log buffer 中日志写入日志文件。
SQL> select to_char(checkpoint_change#,'xxxxxxxx') from v$datafile;
TO_CHAR(C
---------
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
3c1522c7
在数据库启动时,比较数据文件头的checkpoint scn(也叫start scn) 和控制文件记录的关于此数据文件的checkpoint scn ,若前者大于后者,表示控制文件“老”,反之,数据文件“老”,若两者相等再比较start scn 和 stop scn 是否一致,不一致则该表明数据文件需要恢复 。
3 block
data block 里面的SCN是当 block 被更改的时候的 SCN ,不同block的scn也不相同。
块中包含 block scn 和 ITL 中的commit SCN,block SCN 又在块头和块位都有,若不一致意味着block损坏。而ITL 中的 commit SCN 则跟 consistent gets and delay block cleanout 有关
4 redo log
记录redo 对应SCN 用于恢复 ,没什么好讲的