關于SCN的理解

baojian322 13年前發布 | 2K 次閱讀 eCromedos firefox手機

系統檢查點scn(v$database(checkpoint_change#)) 
數據文件檢查點(v$datafile(checkpoint_change#)) 
數據文件終止scn(v$datafile(last_change#)) 

數據文件中存放的檢查點 
啟動scn (v$datafile_header(checkpoint_change#) 

1、系統檢查點scn 
當一個檢查點動作完成之后,Oracle就把系統檢查點的SCN存儲到控制文件中。 
select checkpoint_change# from v$database 
2、數據文件檢查點scn 
當一個檢查點動作完成后,Oracle就把每個數據文件的scn單獨存放在控制文件中。  
select name,checkpoint_change# from v$datafile  
3、啟動scn 
Oracle把這個檢查點的scn存儲在每個數據文件的文件頭中,這個值稱為啟動scn, 
因為它用于在數據庫實例啟動時,檢查是否需要執行數據庫恢復。 
select name,checkpoint_change# from v$datafile_header 
4、終止scn 
每個數據文件的終止scn都存儲在控制文件中。 
select name,last_change# from v$datafile 
在正常的數據庫操作過程中,所有正處于聯機讀寫模式下的數據文件的終止scn都為null. 
5、在數據庫運行期間的scn值 
在數據庫打開并運行之后,控制文件中的系統檢查點、控制文件中的數據文件檢查點scn 
和每個數據文件頭中的啟動scn都是相同的。控制文件中的每個數據文件的終止scn都為null. 

在安全關閉數據庫的過程中,系統會執行一個檢查點動作,這時所有數據文件的終止scn 
都會設置成數據文件頭中的那個啟動scn的值。在數據庫重新啟動的時候, 
Oracle將文件頭中的那個啟動scn與數據庫文件檢查點scn進行比較, 
如果這兩個值相互匹配,oracle接下來還要比較數據文件頭中的啟動scn和控制文件 
中數據文件的終止scn。如果這兩個值也一致,就意味著所有數據塊多已經提交,所有 
對數據庫的修改都沒有在關閉數據庫的過程中丟失,因此這次啟動數據庫的過程 
也不需要任何恢復操作,此時數據庫就可以打開了。當所有的數據庫都打開之后, 
存儲在控制文件中的數據文件終止scn的值再次被更改為null, 
這表示數據文件已經打開并能夠正常使用了。 
------------------------------------------ 
澄清幾個概念 
1)系統當前SCN并不是在任何的數據庫操作發生時都會改變,SCN是在事務提交或回滾時改變, 
2)在控制文件,數據文件頭,數據塊,日志文件頭,日志文件change vector中都有SCN,但其作用各不相同數據文件頭中包含了該數據文件的checkpoint SCN,表示給數據文件最近一次執行檢查點操作時的SCN.日志文件頭中包含了low scn,next scn,表示給日志文件包含有從low scn到next scn的redo record.控制文件中包含了每個數據文件的checkpoint SCN,stop SCN,每個日志文件的low scn,next scn.控制文件中checkpoint scn同數據文件頭中checkpoint scn相同,除非數據文件被手工替換掉.控制文件中的low scn,next scn同日志文件中low scn和next scn相同在數據庫正常運行時,控制文件中對應數據文件的stop SCN都是最大值.在正常關閉數據庫的情況下,在關閉前會執行一次檢查點工作當oracle會將數據緩沖區上的內容全部寫回到磁盤中,然后更新控制文件中對應數據文件的stop SCN,使其等于checkpoint SCN 

但在異常當機的情況下,由于最后一次檢查點未進行或進行中間被中止,因而在控制文件,就存在部分的數據文件stop SCN為最大值,在數據庫重新啟動后,會檢查控制文件中對應每個數據文件的stop SCN,如果stop SCN不等于控制文件中對應每個數據文件的checkpoint SCN,就會使用日志文件redo從checkpoint SCN開頭到stop SCN為止的全部數據庫操作.在定位到底是使用哪一個redo log文件時,就用到了日志文件頭中的low scn,next scn,也就是說要使用的redo log 的low scn ,next scn必須包含數據文件重做所須的change vector. 

在確定了哪個數據文件須redo后,oracle會比較change vector中的SCN和數據文件數據塊中的SCN,如果change vector的SCN小于數據塊的scn,則跳過此change vector,否則redo 
數據塊中ITL中還有SCN,但它的作用是用于產生一致性讀快照

 本文由用戶 baojian322 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!