Oracle数据库中的多种SCN汇总

来源:这里教程网 时间:2026-03-03 17:56:09 作者:

SCN:

简单介绍SCN可称为系统改变号或者系统提交号,是Oracle内部的一种时间机制。

SCN的作用:

(1)一致性读,比如Oracle在读取数据时会比较读开始的SCN值和数据块的SCN值,从而判断哪些数据块需要从业务数据文件中读取,哪些块需要从undo数据文件中读取

(2)事务的唯一性:Oracle会给每一个事务都分配一个唯一的SCN,按SCN进行严格排序.

(3)介质恢复起点判断:在数据库异常宕机之后,Oracle后台进程可以根据数据文件头的SCN值判断出哪些数据文件需要恢复,并从控制文件的SCN值中判断出至少需要恢复至哪一个SCN。

几种常见的SCN:

1.控制文件中的SCN

2.数据文件头中的SCN

3.数据块中的SCN

4.日志文件头中的SCN

5.事务SCN

6.内存中的SCN

一:控制文件中的SCN:

1.数据库SCN:

数据库SCN通常表示最近一次完全检查点操作时的SCN

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

          1115719

也可以DUMP控制文件获取数据库的SCN

SQL> alter session set events 'immediate trace name controlf level 8';

Session altered.




SQL> select value from v$diag_info where name='Default Trace File';

VALUE

--------------------------------------------------------------------------------

/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3215.trc
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)

07/19/2020 06:54:42

DB Name "PROD"

Database flags = 0x00404001 0x00001200

Controlfile Creation Timestamp 07/19/2020 06:54:43

Incmplt recovery scn: 0x0000.00000000

Resetlogs scn: 0x0000.000e2006 Resetlogs Timestamp 07/19/2020 06:54:45

Prior resetlogs scn: 0x0000.00000001 Prior resetlogs Timestamp 08/24/2013 11:37:30

Redo Version: compatible=0xb200400

#Data files = 5, #Online files = 5

Database checkpoint: Thread=1 scn: 0x0000.00110647

Threads: #Enabled=1, #Open=1, Head=1, Tail=1


可以从中看到database checkpoint=0x0000.00110647转换成10进制为1115719

与通过v$database查询一致

2.数据文件SCN:

可以通过v$datafile查询保存在控制文件中的数据文件SCN,该SCN主要有以下三种形式 数据文件头SCN:判断控制文件和数据文件是否一致的标准之一,如果不对数据文件做额外的操作,那么数据文件文件头SCN值将和数据库SCN保持一致 数据文件停止SCN:STOP SCN,该值在数据库处于打开状态或者异常关闭时为无穷大. 数据文件创建SCN:CREATION SCN,如果数据文件被误删除,在重新创建该数据文件时,Oracle会根据该SCN值定位需要应用的第一个归档日志。 以上SCN也保存在控制文件中. dump转储控制文件查看:

DATA FILE #1: 

name #7: /oracle/app/oradata/prod/system01.dbf

creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1

tablespace 0, index=1 krfil=1 prev_file=0

unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00

Checkpoint cnt:111 scn: 0x0000.00110647 10/13/2020 22:13:54

Stop scn: 0xffff.ffffffff 10/13/2020 21:54:00

Creation Checkpointed at scn: 0x0000.00000007 08/24/2013 11:37:33

thread:0 rba:(0x0.0.0)




数据文件头SCN:scn: 0x0000.00110647

数据文件停止SCN: Stop scn: 0xffff.ffffffff

数据文件创建SCN:Creation Checkpointed at scn: 0x0000.00000007

3.checkpoint progress records中的SCN:

checkpoint progress records中的on disk scn表示当前系统最新RBA对应的SCN,由CKPT进程每3秒更新一次。

on disk scn的含义是当数据库异常宕机时,进行实例恢复的终点(应用到该SCN)。

dump转储控制文件查看:

THREAD #1 - status:0x2 flags:0x0 dirty:48

low cache rba:(0xa.2c36.0) on disk rba:(0xa.2f1e.0)

on disk scn: 0x0000.00110939 10/13/2020 22:27:22

resetlogs scn: 0x0000.000e2006 07/19/2020 06:54:45

heartbeat: 1053695356 mount id: 465556623




SQL> select to_number('00110939','xxxxxxxxx') from dual;

TO_NUMBER('00110939','XXXXXXXXX')

---------------------------------

                        1116473




SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

          1115719




由于CHECKPOINT PROGRESS RECORDS由CKPT进程负责更新,也可以从基表x$kcccp中获得

SQL> select CPODS from x$kcccp where rownum < 2;

CPODS

----------------

1120334




SQL> select last_redo_change# from v$thread;

LAST_REDO_CHANGE#

-----------------

        1120334

二:数据文件头中的SCN

1.CREATION_CHANGE#

数据文件创建时SCN,该 值也保存在控制文件中.

可以通过v$datafile_header查询

SQL> select file#,creation_change# from v$datafile_header;




    FILE# CREATION_CHANGE#

---------- ----------------

        1               7

        2             1834

        3           923328

        4           16143

        5           952195

2.CHECKPOINT_CHANGE#

表示数据文件头当前SCN,该值也保存在控制文件中。由CKPT进程在完全检查点时更新.

可以通过v$datafile_header查询

SQL> select file#,checkpoint_change# from v$datafile_header;

    FILE# CHECKPOINT_CHANGE#

---------- ------------------

        1           1115719

        2           1115719

        3           1115719

        4           1115719

        5           1115719

3.RESETLOGS_CHANGE#

RESETLOGS_CHANGE#表示数据库以resetlogs方式打开时的SCN,也可以通过v$datafile_header查询

SQL> select file#,resetlogs_change# from v$datafile_header;

    FILE# RESETLOGS_CHANGE#

---------- -----------------

        1           925702

        2           925702

        3           925702

        4           925702

        5           925702

4.CHANGE#

CHANGE#表示数据文件头冻结时的SCN。在做数据文件在线热备份时,常用将数据文件头冻结,表明从change#这个点开始对数据文件进行备份,可以从$backup查询

SQL> alter database begin backup;

Database altered.




SQL> select file#,change# from v$backup;

    FILE#   CHANGE#

---------- ----------

        1   1120946

        2   1120946

        3   1120946

        4   1120946

        5   1120946


dump数据文件头查看以上SCN:

SQL> alter session set events 'immediate trace name file_hdrs level 10';

Session altered.




SQL> select value from v$diag_info where name='Default Trace File';

VALUE

--------------------------------------------------------------------------------

/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3558.trc




V10 STYLE FILE HEADER:

      Compatibility Vsn = 186647552=0xb200400

      Db ID=457994418=0x1b4c70b2, Db Name='PROD'

      Activation ID=0=0x0

      Control Seq=899=0x383, File size=96000=0x17700

      File Number=1, Blksiz=8192, File Type=3 DATA

Tablespace #0 - SYSTEM rel_fn:1 

Creation   at   scn: 0x0000.00000007 08/24/2013 11:37:33

Backup taken at scn: 0x0000.00111ab2 10/14/2020 00:25:29 thread:1

reset logs count:0x3e5b1335 scn: 0x0000.000e2006

prev reset logs count:0x3121c97a scn: 0x0000.00000001

recovered at 10/13/2020 21:53:28

status:0x2004 root dba:0x00400208 chkpt cnt: 113 ctl cnt:112

begin-hot-backup file size: 96000

Checkpointed at scn: 0x0000.00111ab2 10/14/2020 00:25:29

thread:1 rba:(0xa.5a08.10)


1.Creation at scn: 0x0000.00000007

2.Checkpointed at scn: 0x0000.00111ab2

3.reset logs count:0x3e5b1335 scn: 0x0000.000e2006

4.Backup taken at scn: 0x0000.00111ab2 10/14/2020 00:25:29 thread:1


附:在bbed中

kcvfhcrs表示creation_change,偏移量为100;

kcvfhrls表示resetlogs_change,偏移量为116

kcvfhsc表示change,偏移量128

kcvcpscn表示checkpoint_change,偏移量484

三:数据块中的SCN

1.数据块变化时的SCN

数据块发生变化时记录的SCN,保存在数据块offset 8-14中

dump转储一个数据块查看数据块变化的SCN

SQL> alter system dump datafile 1 block 16;

System altered.

SQL> select value from v$diag_info where name='Default Trace File';

VALUE

--------------------------------------------------------------------------------

/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3558.trc




截取部分内容

Start dump data blocks tsn: 0 file#:1 minblk 16 maxblk 16

Block dump from cache:

Dump of buffer cache at level 4 for tsn=0 rdba=4194320

Block dump from disk:

buffer tsn: 0 rdba: 0x00400010 (1/16)

scn: 0x0000.00000023 seq: 0x01 flg: 0x04 tail: 0x00231e01

frmt: 0x02 chkval: 0x80ab type: 0x1e=KTFB Bitmapped File Space Bitmap

Hex dump of block: st=0, typ_found=1




数据块发生变化时记录的SCN

scn: 0x0000.00000023

2.数据块事务槽中的SCN

如果一个数据块中有多个事务槽,表明允许有多个事务对数据块进行并发修改,当其中一个事务发生变化时,会在相应的事务槽登记变化时的SCN。事务槽中的SCN也可以在数据块dump文件中找到。

Block header dump: 0x004171c9

Object id on Block? Y

seg/obj: 0x15587 csc: 0x00.e2ad8 itc: 2 flg: - typ: 2 - INDEX

    fsl: 0 fnx: 0x0 ver: 0x01


Itl           Xid                 Uba         Flag Lck       Scn/Fsc

0x01   0x0000.000.00000000 0x00000000.0000.00 ----   0 fsc 0x0000.00000000

0x02   0xffff.000.00000000 0x00000000.0000.00 C---   0 scn 0x0000.000e2ad8

3.数据块中数据行的SCN

如果在表级别打开ROW DEPENDENCIES,业务数据行发生更改时会在数据块中进行登记。

(1)创建测试表,插入3条数据,插入一条提交一条。并调用dbms_rowid获取3条测试数据的数据文件和数据块.




SQL> create table test (a number) rowdependencies;

Table created.




SQL> insert into test values(1);

1 row created.




SQL> commit;

Commit complete.




SQL> insert into test values(2);

1 row created.




SQL> commit;

Commit complete.




SQL> insert into test values(3);

1 row created.




SQL> commit;

Commit complete.







SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from test;

    FILE#     BLOCK#

---------- ----------

        1     94665

        1     94665

        1     94665

(2)dump数据块

SQL> alter system dump datafile 1 block 94665;




SQL> select value from v$diag_info where name='Default Trace File';

VALUE

--------------------------------------------------------------------------------

/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3885.trc

(3)查看trace

less /oracle/app/diag/rdbms/prod/prod/trace/prod_ora_3885.trc




data_block_dump,data header at 0x7fb539467a5c

===============

tsiz: 0x1fa0

hsiz: 0x18

pbl: 0x7fb539467a5c

    76543210

flag=--R-----

ntab=1

nrow=3

frre=-1

fsbo=0x18

fseo=0x1f7c

avsp=0x1f5b

tosp=0x1f5b

0xe:pti[0]     nrow=3 offs=0

0x12:pri[0]     offs=0x1f94

0x14:pri[1]     offs=0x1f88

0x16:pri[2]     offs=0x1f7c

block_row_dump:

tab 0, row 0, @0x1f94

tl: 12 fb: --H-FL-- lb: 0x0 cc: 1

dscn 0x0000.00111de3

col 0: [ 2] c1 02

tab 0, row 1, @0x1f88

tl: 12 fb: --H-FL-- lb: 0x0 cc: 1

dscn 0x0000.00111de7

col 0: [ 2] c1 03

tab 0, row 2, @0x1f7c

tl: 12 fb: --H-FL-- lb: 0x1 cc: 1

dscn 0x0000.00000000

col 0: [ 2] c1 04

end_of_block_dump

End dump data blocks tsn: 0 file#: 1 minblk 94665 maxblk 94665







--------------

dscn:表示数据行的SCN




SQL> select a,ora_rowscn from test;

        A ORA_ROWSCN

---------- ----------

        1   1121763

        2   1121767

        3   1121770

四:日志文件头中的SCN

1.FIRST_CHANGE#

表示redo日志文件被使用时的起始SCN,也叫被重用时的SCN,可以从v$log_history中查询。

2.NEXT_CHANGE#

表示redo日志文件被使用时的结束SCN,也叫重用结束时的SCN,可以从v$log_history中查询。

3.RESETLOGS_CHANGE#

表示数据库以RESETLOGS方式打开时的SCN。通常和数据文件头的RESETLOGS_CHANGE#相同,可以从v$log_history中查询。

DUMP日志文件头获取上述SCN:

SQL> alter session set events 'immediate trace name redohdr level 10'

SQL> select value from v$diag_info where name='Default Trace File';

VALUE

--------------------------------------------------------------------------------

/oracle/app/diag/rdbms/prod/prod/trace/prod_ora_2539.trc




截取部分内容:

FILE HEADER:

      Compatibility Vsn = 186647552=0xb200400

      Db ID=457994418=0x1b4c70b2, Db Name='PROD'

      Activation ID=458015666=0x1b4cc3b2

      Control Seq=932=0x3a4, File size=102400=0x19000

      File Number=1, Blksiz=512, File Type=2 LOG

Format ID is 2

redo log key is 5995abea5d855956889b4ae1d59cc188

redo log key flag is 5

descrip:"Thread 0001, Seq# 0000000010, SCN 0x00000010fd57-0x000000117064"

thread: 1 nab: 0x65e4 seq: 0x0000000a hws: 0x8 eot: 0 dis: 0

reset logs count: 0x3e5b1335 scn: 0x0000.000e2006

Low scn: 0x0000.0010fd57 10/13/2020 21:53:31

Next scn: 0x0000.00117064 10/14/2020 17:01:36

Enabled scn: 0x0000.000e2006 07/19/2020 06:54:45

Thread closed scn: 0x0000.00117062 10/14/2020 01:30:32

Disk cksum: 0xda64 Calc cksum: 0xda64

Terminal Recovery Stop scn: 0x0000.00000000

Terminal Recovery Stamp 01/01/1988 00:00:00

Most recent redo scn: 0x0000.00000000

Largest LWN: 0 blocks

Miscellaneous flags: 0x800000

Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000




Low scn: 0x0000.0010fd57

Next scn: 0x0000.00117064

reset logs count: 0x3e5b1335 scn: 0x0000.000e2006

五:事务开始时的SCN

Oracle为每一个事务都分配一个唯一的SCN值,事务开始时的SCN可以从v$transaction中查询

SQL> update test set A='6' where rownum=1;

1 row updated.




SQL> select xidusn,start_scnb,start_scnw from v$transaction;




  XIDUSN START_SCNB START_SCNW

---------- ---------- ----------

        2   1148003         0

        

dump回滚段头进行观察事务开始时的SCN

SQL> alter system dump undo header '_SYSSMU2_2996391332$';

System altered.




截取部分

index state cflags wrap#   uel         scn           dba           parent-xid   nub     stmt_num   cmt

0x1e   9   0x00 0x03c4 0x0021 0x0000.00118363 0x00c01104 0x0000.000.00000000 0x00000001   0x00000000 1602666762

0x1f   10   0x80 0x03c4 0x0013 0x0000.00118463 0x00c01104 0x0000.000.00000000 0x00000001   0x00000000 0




state为10表示这是一个未提交的事务,SCN表示事务开始SCN

SQL> select to_number(00118463,'xxxxxxx') from dual;

TO_NUMBER(00118463,'XXXXXXX')

-----------------------------

                    1148003 //与通过v$transaction视图查询得出一致

                     

state为9表示一个已提交的事务

六:数据库的CURRENT SCN

数据库的current scn是Oracle当前最大的SCN。

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

  1149821

相关推荐