您现在的位置是:首页 >其他 >如何查看Oracle控制文件中的SCN网站首页其他

如何查看Oracle控制文件中的SCN

Lao A(zhou liang)的菜园 2024-06-17 10:29:37
简介如何查看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种形式:

  1. 数据文件头SCN。该SCN是判断控制文件和数据文件是否一致的标准之一。可以通过V$DATAFILE.CHECKPOINT_CHANGE#查询。如果不对数据文件做额外的操作(例如将表空间置为OFFLJNE或者BEGIN BACKUP),那么数据文件头SCN值(V$DATAFILE.CHECKPOINT_CHANGE#)将和数据库SCN(V$DATABASE.CHECKPOINT_CHANGE#)保持一致。
  2. STOP SCN。该SCN在数据库处于运行状态或者异常关闭时为无穷大,即0xffff.ffffffff。如果数据库正常关闭,则和V$DATAFILE.CHECKPOINT_CHANGE#值相同。可以通过V$DATAFILE.LAST_CHANGE#查询。
  3. 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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。