Oracle資料庫中的多種SCN彙總

sjw1933發表於2022-10-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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23825935/viewspace-2917428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章