檢查點機制與scn

lsl031發表於2007-09-02

oracle在資料庫啟動到open階段進行檢查點的檢查和完整性的檢查。

oracle中包括了幾個重要的scn資料結構:

其中有檢查點計數器checkpoint cnt(在資料檔案頭和控制檔案當中都有,是決定是否需要介質恢復的關鍵,即便是處於begin backup情況下檢查點scn凍結了,此技術器仍然是不凍結的)。

控制檔案中還包括出checkpoint scn和stop scn。

而日誌檔案包括low scn 和next scn決定了回滾時每個scn應該到哪個重日誌當中找重做記錄進行重做。

而控制檔案當中還包括low cache rba(recovery block address),指明在例項恢復或者崩潰恢復時,需要由此開始重做。應該是寫入了redo log file 還沒有完成ckpt。on disk rba則是磁碟上的最高的重做值。在恢復時應用重做應該至少到達點。這是如何讀取redo的記錄來重做的機制

而每次事務包括一個系列的重做記錄(是對操作的描述),每個重做記錄又包括一系列的重做向量,重做向量裡面就包括了寫入回滾段事務槽,回滾段塊,以及最終資料的修改,這就可以理解如何與回滾段進行事務的控制了,記錄萬重做記錄再做最終的修改。要麼全部成功,要麼全部失敗。(特別注意:commit時,在redo stream中記錄一個提交標記表明該事務不可恢復了--回滾,而相應回滾段的內容也會有所標記)。

接上面的內容:

控制檔案中還包括了每個資料檔案的checkpoint scn和stop scn,如果正常情況下stop scn是為null的,而在正常關閉的情況下,資料庫會執行檢查點,並且將stop scn改為和checkpoint scn相同的值。如果是非正常關閉的,那麼資料庫不會執行檢查點,此時stop scn還是為null,資料庫再次啟動時檢查出該狀況而執行例項恢復。

檢查點(checkpoint)的工作機制

檢查點是一個資料庫事件,它把修改資料從快取記憶體寫入磁碟,並更新控制檔案和資料檔案。

檢查點分為三類:
1)區域性檢查點:單個例項執行資料庫所有資料檔案的一個檢查點操作,屬於此例項的全部髒快取區寫入資料檔案。
觸發命令:
alter system checkpoint local;
這條命令顯示的觸發一個區域性檢查點。
2)全域性檢查點:所有例項(對應並行資料伺服器)執行資料庫所有所有資料檔案的一個檢查點操作,屬於此例項的全部髒快取區寫入資料檔案。
觸發命令
alter system checkpoint global;
這條命令顯示的觸發一個全域性檢查點。單例項下全域性檢查點和區域性檢查點是一致的。
3)檔案檢查點:所有例項需要執行資料檔案集的一個檢查點操作,如使用熱備份命令alter tablespace USERS begin backup,或表空間離線命令alter tablespace USERS offline,將執行屬於USERS表空間的所有資料檔案的一個檢查點操作。(針對資料檔案的操作)

檢查點處理步驟:
1)獲取例項狀態佇列:例項狀態佇列是在例項狀態轉變時獲得,ORACLE獲得此佇列以保證檢查點執行期間,資料庫處於開啟狀態;
2)獲取當前檢查點資訊:獲取檢查點記錄資訊的結構,此結構包括當前檢查點時間、活動執行緒、進行檢查點處理的當前執行緒、日誌檔案中恢復截止點的地址資訊;
3)快取區標識:標識所有髒快取區,當檢查點找到一個髒快取區就將其標識為需進行重新整理,標識的髒快取區由系統程式DBWR進行寫操作,將髒快取區的內容寫入資料檔案;
4)髒快取區重新整理:DBWR程式將所有髒快取區寫入磁碟後,設定一標誌,標識已完成髒快取區至磁碟的寫入操作。系統程式LGWR與CKPT程式將繼續進行檢查,直至DBWR程式結束為止;
5)更新控制檔案與資料檔案。
注:控制檔案與資料檔案頭包含檢查點結構資訊。
在兩種情況下,檔案頭中的檢查點資訊(獲取當前檢查點資訊時)將不做更新:
1)資料檔案不處於熱備份方式,此時ORACLE將不知道作業系統將何時讀檔案頭,而備份複製在複製開始時必須具有檢查點SCN;
ORACLE在資料檔案頭中保留一個檢查點的記數器,在正常操作中保證使用資料檔案的當前版本,在恢復時防止恢復資料檔案的錯誤版本;即使在熱備份方式下,計數器依然是遞增的每個資料檔案的檢查點計數器,也保留在控制檔案相對應資料檔案項中。
2)檢查SCN小於檔案頭中的檢查點SCN的時候,這表明由檢查點產生的改動已經寫到磁碟上,在執行全域性檢查點的處理過程中,如果一個熱備份快速檢查點在更新檔案頭時,則可能發生此種情況。應該注意的是,ORACLE是在實際進行檢查點處理的大量工作之前捕獲檢查SCN的,並且很有可能被一條象熱備份命令 alter tablespace USERS begin backup進行快速檢查點處理時的命令打斷。
ORACLE在進行資料檔案更新之前,將驗證其資料一致性,當驗證完成,即更新資料檔案頭以反映當前檢查點的情況;未經驗證的資料檔案與寫入時出現錯誤的資料檔案都被忽略;如果日誌檔案被覆蓋,則這個檔案可能需要進行介質恢復,在這種情況下,ORACLE系統程式DBWR將此資料檔案離線。

檢查點演算法描述:
髒快取區用一個新佇列連結,稱為檢查點佇列(實現了增量檢查點的機制)。對快取區的每一個改動,都有一個與其相關的重做值。檢查點佇列包含髒的日誌快取區,這些快取區按照它們在日誌檔案中的位置排序,即在檢查點佇列中,快取區按照它們的低重做值進行排序。需要注意的是,由於快取區是依照第一次變髒的次序連結到佇列中的,所以,如果在快取區寫出之前對它有另外的改動,連結不能進行相應變更,快取區一旦被連結到檢查點佇列,它就停留在此位置,直到將它被寫出為止。

ORACLE系統程式DBWR在響應檢查點請求時,按照這個佇列的低重做值的升序寫出快取區。每個檢查點請求指定一個重做值,一旦DBWR寫出的快取區重做值等於或大雨檢查點的重做值,檢查點處理即完成,並將記錄到控制檔案與資料檔案。
由於檢查點佇列上的快取區按照低重做值進行排序,而DBWR也按照低重做值順序寫出檢查點快取區,故可能有多個檢查點請求處於活動狀態,當DBWR寫出快取區時,檢查位於檢查點佇列前端的快取區重做值與檢查點重做值的一致性,如果重做值小於檢查點佇列前快取區的低重做值的所有檢查點請求,即可表示處理完成。當存在未完成的活動檢查點請求時,DBWR繼續寫出檢查點快取區。

演算法特點:
1)DBWR能確切的知道為滿足檢查點請求需要寫那些快取區;
2)在每次進行檢查點寫時保證指向完成最早的(具有最低重做值的)檢查點;
3)根據檢查點重做值可以區別多個檢查點請求,然後按照它們的順序完成處理。

俺是貼上過來地,希望有助於大家對checkpoint的理解
[@more@]

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

相關文章