一. 說明
Oracle的一個資料區塊裡的SCN有三種,分別是塊頭的SCN, CSC (cleanout SCN)和ITL中的commit SCN。 關於block 裡的具體資訊,可以把block dump 出來,進行查看。 這個在我之前的blog裡有整理:
Oracle datafile block 格式 說明
Orace ITL(InterestedTransaction List) 說明
Block的cache header部分,記錄著一個block scn,它是當前塊最後一次變更的時間戳記,確切說,這個更新並不是指itl上的scn的最新更新,在接下來delayed block cleanout下的slot重用情況下,可以看到blockscn並不等於itl上的最後一次更新的scn。可以通過dump獲得block scn/last itl scn 和發布ora_rowscn語句獲得last itl scn。
Oracle ORA_ROWSCN 偽列 說明
Eachdata block in a datafile contains an SCN, which is the SCN at which the lastchange was made to the block. During an incremental backup, RMAN reads the SCNof each data block in the input file and compares it to the checkpoint SCN ofthe parent incremental backup. RMAN reads the entire file every time whether ornot the blocks have been used.
發布transaction後,未提交之前,block scn是不會改變的,對應的itl中也並不做scn記錄。Block scn的改變,確切的說不是在發布commit之時(因為有delayed block cleanout的情況存在),而是在transaction對應的itl獲得commit scn之時。
cleanout分為2鐘,一種是fast commit cleanout,另一種是delayed block cleanout.
oracle有一個modified block list結構,用來記錄每個transaction更改過的block,每個transaction大約可以記錄10% buffer cache這多的modified block。這部分block就是當發生commit的時候,oracle可以根據modified block list定位到那些塊並做fast commit cleanout。如果一個transaction修改的塊超過10% buffer cache,那麼超過的塊就執行delayed block cleanout。
當做fast commit cleanout時,oracle不會清理 Row locks lb標誌位,ITL lck標誌位。
另一種情況是delayed block cleanout,當transaction還未commit或rollback時modified block已經被寫回磁碟,當發生commit時oracle並不會把block重新讀入做cleanout,這樣成本太高,而是把cleanout留到下一次對此塊的dml時來完成。當delayed cleanout時候如果undo segment header的transaction table slot還沒有被覆蓋,那麼可以找回該事務遞交的exact scn,如果slot已經被覆蓋,那麼將會使用undo segment header中的control scn來做為upper bound scn。
當發生fast commit cleanout,系統將transaction提交時刻的scn作為commit scn,更新block上 itl和undo segment header的Transaction table的slot上的 scn,並修改block scn,三者是一致的。
發生delayed block cleanout的時候,之前的transaction commit更新的只是Transaction table,而並未做block上的處理,等待下次使用此block的時候,更新block scn和itl狀態。block scn和itl的更新又分2種情況:
(1)當不產生slot重用的時候(ITL不重用), delayed block cleanout時,根據Transaction table裡面的資訊,更新block scn和itl上的Scn/Fsc為transaction曾經提交時候的scn。
(2)當產生slot重用的時候(重用ITL),更新對應itl上scn為control scn,而block scn 為delayed block cleanout發生時刻的scn。
說明:ITL 中SCN 和 FSC 的區別
dump block的ITL 的資訊如下:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000e.007.00000236 0x00000000.0000.00C-U- 0 scn 0x0000.005b1f7f
0x02 0x000c.005.000003b4 0x01401727.0144.13C--- 0 scn 0x0000.005bbf0b
0x03 0x0011.007.00000406 0x0140015b.00c7.57--U- 483 fsc 0x0000.005bdee1
這裡的SCN和FSC其實就是這個ITL對應的事務提交時候的SCN,那麼這裡所有槽位上的最大的一個SCN號就表示這個BLOCK最後被更新的時候的SCN。每一個事務對應一個itl 記錄。如果該事務沒有涉及延時塊清除,那麼顯示的FSC。 如果是延時塊清除(delayed block cleanout),那麼顯示的就是SCN。
在ITL資訊中有一個顯示的Flag的狀態,FLAG在block中佔用1個位元組大小。 不同flag 標記的意義如下:
---- = transaction is active, or committedpending cleanout
C--- = transaction has been committed andlocks cleaned out
-B-- = this undo record contains the undofor this ITL entry
--U- = transaction committed (maybe longago); SCN is an upper bound
---T = transaction was still active atblock cleanout SCN