您现在的位置是:首页 >其他 >如何查看Oracle控制文件中的SCN网站首页其他
如何查看Oracle控制文件中的SCN
Oracle控制文件中的SCN很多,最重要的有3类:数据库SCN、数据文件SCN和Checkpoint progress record中的SCN。数据库SCN和数据文件SCN可以分别从V$DATABASE和V$DATAFILE视图的相应列中找到,它们的值通常在全量CHECKPOINT时由CKPT进程更新。CHECKPOINT PROGRESS RECORDS中的SCN可以从V$THREAD.LAST_REDO_CHANGE#列中找到,其值也是由CKPT进程每隔3秒更新一次。
1. 数据库SCN
数据库SCN通常表示最近一次全量CHECKPOINT操作时的SCN,可以查询V$DATABASE获取该SCN,如下所示:
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
722212
也可以DUMP控制文件获取数据库的SCN。DUMP控制文件的方法如下:
ALTER SESSION SET EVENTS 'immediate trace name controlf level n';
1 文件头信息
2 level 1 + 数据库信息 + 检查点信息
3 level 2 + 可重用节信息
10 level 3
打开跟踪文件,可以看到数据库的SCN和V$DATABASE.CHECKPOINT_CHANGE#中查询的SCN值一致,0x0000.000b0524转换成10进制为722212,如下所示(跟踪文件内容有所省略):
DATABASE ENTRY
***************************************************************************
(size = 316, compat size = 316, section max = 1, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 1, numrecs = 1)
03/02/2013 07:01:31
DB Name "ORA10205"
Database flags = 0x00404001 0x00001000
Controlfile Creation Timestamp 03/02/2013 07:01:31
Incmplt recovery scn: 0x0000.00000000
Resetlogs scn: 0x0b9d.47147d50 Resetlogs Timestamp 01/10/2013 10:56:41
Prior resetlogs scn: 0x0b9d.470c6a44 Prior resetlogs Timestamp 12/16/2012 13:56:32
Redo Version: compatible=0xa200500
#Data files = 8, #Online files = 7
Database checkpoint: Thread=1 scn: 0x0000.000b0524
Threads: #Enabled=1, #Open=1, Head=1, Tail=1
2. 数据文件SCN
可以通过V$DATAFILE查询保存在控制文件中的数据文件SCN,该SCN主要有以下3种形式:
- 数据文件头SCN。该SCN是判断控制文件和数据文件是否一致的标准之一。可以通过V$DATAFILE.CHECKPOINT_CHANGE#查询。如果不对数据文件做额外的操作(例如将表空间置为OFFLJNE或者BEGIN BACKUP),那么数据文件头SCN值(V$DATAFILE.CHECKPOINT_CHANGE#)将和数据库SCN(V$DATABASE.CHECKPOINT_CHANGE#)保持一致。
- STOP SCN。该SCN在数据库处于运行状态或者异常关闭时为无穷大,即0xffff.ffffffff。如果数据库正常关闭,则和V$DATAFILE.CHECKPOINT_CHANGE#值相同。可以通过V$DATAFILE.LAST_CHANGE#查询。
- CREATION SCN。表示数据文件创建时的SCN,可以通过V$DATAFILE.CREATEION_CHANGe#查询。如果数据文件被误删除,在重新创建该数据文件时,Oracle会根据该SCN值定位需要应用的第一个归档日志。
由于以上SCN保存在控制文件中,所以DUMP控制文件也可以获得数据文件SCN。其中“Checkpoint scn”表示数据文件头SCN,和V$DATAFILE.CHECKPOINT_CHANGE#值相同。“STOP SCN”和V$DATAFILE.LAST_CHANGE#值相同。“Creation Checkpointed at scn”表示CREATION SCN,和V$DATAFILE.CREATEION_CHANGe#相同。以下为1号数据文件在控制文件中的SCN:
DATA FILE #1:
(name #4) /ora10205/oradata/ora10205/system01.dbf
creation size=38400 block size=8192 status=0xe head=4 tail=4 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:103 scn: 0x0000.000b0524 07/29/2012 11:56:19
Stop scn: 0xffff.ffffffff 07/27/2012 22:25:17
Creation Checkpointed at scn: 0x0000.00000007 07/10/2012 10:25:11
3. CHECKPOINT PROGRESS RECORDS中的SCN
CHECKPOINT PROGRESS RECORDS中的ON DISK SCN表示当前系统最新RBA对应的SCN,由CKPT进程每3秒更新一次。如果数据库异常宕机,那么CRASH RECOVER时服务器进程至少要应用到该SCN为止。当系统比较空闲时, CHECKPOINT PROGRESS RECORDS信息能比较精确地反映数据库的运行状态。在DUMP控制文件之后,能获得CHECKPOINT PROGRESS RECORDS中的SCN,如下所示:
CHECKPOINT PROGRESS RECORDS
***************************************************************************
(size = 8180, compat size = 8180, section max = 11, section in-use = 0,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 2, numrecs = 11)
THREAD #1 - status:0x2 flags:0x0 dirty:5
low cache rba:(0x53.11040.0) on disk rba:(0x53.1104b.0)
on disk scn: 0x0000.000b2393 07/29/2012 16:56:44
resetlogs scn: 0x0000.00000001 07/10/2012 10:25:06
heartbeat: 789930889 mount id: 1694236548
由于CHECKPOINT PROGRESS RECORDS由CKPT进程负责更新,所以也可以从X$KCCCP([K]ernel [C]ache [C]ontrolfile management [c]heckpoint [p]rogress)中获得CHECKPOINT PROGRESS RECORDS中的ON DISK SCN,如下所示:
SQL> select CPODS from x$kcccp where rownum<2;
CPODS
----------------
730003
从Oracle 10g开始,也可以从V$THREAD.LAST_REDO_CHANGE#中查询,如下所示:
SQL> select LAST_REDO_CHANGE# from v$thread;
LAST_REDO_CHANGE#
-----------------
730003