Oracle SCN 深入研究

來源:互聯網
上載者:User

一. 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.