ORACLE buffer cache 原理 --檢查點佇列連結串列(參照學習:oracle核心技術揭秘)

lff1530983327發表於2016-08-30

CKPT-Q 和 LRU

在update過程中,首先在前文所講的CBC Latch的保護下修改資料,之後程式先持有 checkpoint queue latch,然後將5號檔案中的1234號塊加入到檢查點佇列(CKPT-Q),當然還有產生對應的redo資料。再次update時 會在產生一個新的redo資料,並不會影響CKPT-Q,所以只有在不髒變髒的過程中才需要持有 checkpoint queue latch。最後一次redo的地址為high RBA,第一次是的 是 low rba ,LRBA的作用是巨大的,檢查點佇列中髒塊的順序就是    LRBA的順序。DBWR會按照CKPT-Q 順序寫髒塊。首先掃描checkpoint queue latch 然後確定要寫的髒塊後,將其移到OBJ-Q中,移動完畢,馬上釋放checkpoint queue latch。

例項恢復時是從檢查點佇列的LRBA處開始恢復的。檢查點佇列頭又稱為檢查點位置,CKPT程式會每隔3秒將檢查點位置對應的的LRBA記錄到控制檔案中。

redo資訊包括: 所屬的檔案號 對應的塊號 被修改的行號 列號 還有後映像。

DBWR發現佇列中的髒塊較多,才開始寫入磁碟。影響其寫入的因素有一下幾個:

1>fast_start_mttr_target,表示使用者期望的恢復時間。對應多少個髒塊的恢復時間可以估算需要刷髒塊的比例。10g後 自調節檢查點是預設開啟的。

2>IO合併緩衝區,是為了將相鄰的髒塊合併為一個IO一次性寫入而設定的一個專門的緩衝區。髒塊太多的時候 ,可以將髒塊分成多個batch 分批合併。開始寫構成一個batch的髒塊前,一個batch會記錄db file parallel write等待事件,直至這一個batch所有操作都完成,事件才結束。


檢查點佇列與例項恢復相關:

1.塊被修改時會產生redo log

2.塊由不髒變髒會寫入檢查點佇列

3.檢查點佇列中的排列順序和redo log記錄基本一致

4.DBWR每3秒檢查一次檢查點佇列長度,過長,則會觸發寫髒塊

5.DBWR會沿著檢查點佇列順序寫髒塊

6.CKPT每3秒一次,將檢查點佇列頭對應的LRBA寫進控制檔案

7.如果資料庫崩潰,需要恢復,起點就是控制檔案中的檢查點佇列頭對應的LRBA

8.開始恢復時候,Oracle找到LRBA再定位到redo 檔案的某個位置,開始依次進行例項恢復。


LRBA : low redo block address 對應的還有HRBA


寫髒塊之前,Oracle會有一個合併的動作,在共享池中有一個IO合併快取區就是用作這個的,主要是合併IO


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

相關文章