一. SCN 說明
之前也整理過幾遍Oracle SCN的文章,如下:
Oracle DB 伺服器系統時間修改問題 與SCN 關係的深入研究
http://blog.csdn.net/tianlesoftware/article/details/6163859
Oracle Blockscn/commit scn/cleanout scn 說明
http://blog.csdn.net/tianlesoftware/article/details/6660530
Oracle SCNheadroom、ORA-19706 和_external_scn_rejection_threshold_hours 參數 說明
http://blog.csdn.net/tianlesoftware/article/details/8164455
RedoLogCheckpoint 和 SCN關係
http://blog.csdn.net/tianlesoftware/article/details/5251916
這裡在稍微小總結一下。
我們可以使用如下SQL 查看Oracle 的SCN:
SQL> select CURRENT_SCN from v$database;
CURRENT_SCN
-----------
3713849
上述結果返回的是一串數字。
但實際上,Oracle 在內部並不是用數字來儲存SCN的。
在Oracle內部,SCN分為兩部分儲存,分別稱之為scn wrap和scn base。實際上SCN長度為48位,即它其實就是一個48位的整數。只不過可能是由於在早些年通常只能處理32位甚至是16位的資料,所以人為地分成了低32位(scnbase)和高16位(scn wrap)。
為什麼不設計成64位,這個或許是覺得48位已經足夠長了並且為了節省兩個位元組的空間:)。那麼SCN這個48位長的整數,最大就是2^48(2的48次方, 281萬億,281474976710656),很大的一個數字了。
這裡有一個重要的公式:
SCN= (SCN_WRP * 4294967296) + SCN_BAS
根據上面的公式,可以計算出SCN的資料值。
在很多與我們事務相關的記錄中都是記錄SCN WRAP 和 SCN BASE.
SQL> select START_SCNB,START_SCNW from v$transaction;
SQL> desc smon_scn_time
Name Null? Type
------------------------------------------------- ----------------------------
THREAD NUMBER
TIME_MP NUMBER
TIME_DP DATE
SCN_WRP NUMBER
SCN_BAS NUMBER
NUM_MAPPINGS NUMBER
TIM_SCN_MAP RAW(1200)
SCN NUMBER
ORIG_THREAD NUMBER
包括在我們Data block 的內部,也是使用SCN WRP 和 SCN BASE的。
二.測試案例
我們這裡用Data File 1 上的DataBlock 92967為例。
BBED> show
FILE# 1
BLOCK# 92967
OFFSET 0
DBA 0x00416b27 (4287271 1,92967)
FILENAME /u01/app/oracle/oradata/dave/system.256.816661027
BIFILE bifile.bbd
LISTFILE /u01/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 8192
LOGFILE log.bbd
SPOOL No
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x00416b27
ub4 bas_kcbh @8 0x003566cc
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0xc36e
ub2 spare3_kcbh @18 0x0000
Block Dump 的結果:
Start dump data blocks tsn: 0 file#:1minblk 92967 maxblk 92967
Block dump from cache:
Dump of buffer cache at level 4 for tsn=0rdba=4287271
Block dump from disk:
buffer tsn: 0 rdba: 0x00416b27 (1/92967)
scn: 0x0000.003566cc seq: 0x01 flg: 0x04 tail: 0x66cc0601
frmt: 0x02 chkval: 0xc36e type: 0x06=transdata
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007FBE18328A00 to0x00007FBE1832AA00
7FBE18328A00 0000A206 00416B27 003566CC04010000 [....'kA..f5.....]
7FBE18328A10 0000C36E 00000001 00012965003566B8 [n.......e)...f5.]
......
7FBE1832A9F0 0144494C 014E014E 02C1024E66CC0601 [LID.N.N.N......f]
這裡的SCN 是:0x0000.003566cc
初看這裡估計很暈,在聯絡一下我們上面BBED的結果,就應該明白了。
ub4 bas_kcbh @8 0x003566cc
ub2 wrp_kcbh @12 0x0000
這裡的SCN 格式是: SCNWRAP.SCN BASE.
我們用第一節講的公式計算一下SCN:
SQL> select to_number('3566cc','xxxxxxx') from dual;
TO_NUMBER('3566CC','XXXXXXX')
-----------------------------
3499724
--系統當前的SCN 是:
SQL> select CURRENT_SCN from v$database;
CURRENT_SCN
-----------
3715593
我們的block修改時的SCN 是:
SCN= (0 * 4294967296) + 3499724 = 3499724
即,我們的block:92967 在修改時,對應的SCN 是3499724。
--------------------------------------------------------------------------------------------
著作權,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!
QQ: 251097186
Skype: tianlesoftware
Email: tianlesoftware@gmail.com
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware