1. 程式人生 > >oracle檢查點隊列

oracle檢查點隊列

臟數據 宕機 latch 每次 硬件 註意 TP 完數 實例

主要總結數據庫寫臟塊的機制。

當一個進程要進行修改數據塊的時候

1、獲取cbc latch

2、修改buffer pin status

3、釋放cbc latch

4、生成redo記錄

5、修改buffer數據塊

6、將臟塊移到檢查點隊列中,到此才算修改完畢

7、獲得cbc latch

8、修改buffer pin status

9、釋放cbc latch

這裏說明第6步:

技術分享圖片

如上圖,檢查點隊列上有4個塊,他們的順序就是變臟的順序,當6號文件322號塊被修改時,會在redo生成對應日誌條目,這裏的2.1.322意思是2號redo日誌1號塊的322號字節。這裏第一條redo日誌記錄6號文件322號塊第一次改變後映像在redo中的地址,稱為low rda,後面又一次改變的地址被稱為high rba,這裏high rba意義不大,而low rba意義重大。oracle中沒過3s會觸發增量檢查點通知dbwr寫臟塊,具體些多少臟塊由參數fast_start_mttr_target控制。這裏解釋下fast_start_mttr_target,oracle寫臟塊條件是發現臟塊過多,什麽情況下算臟塊過多?假設有3000個臟塊,系統每次io為1ms那麽恢復3000個臟塊就需要3s,而fast_start_mttr_target就是控制實例恢復時間,就是說假如宕機我要在該值的時間內恢復完數據庫,所以該值除每個臟塊寫的時間就是刷新一次臟塊的數目,通常由oracle根據系統硬件情況自動調整,默認為300s。

low rba的意義:實例恢復。

當數據庫在寫第2個臟塊也就是3號文件233號塊的時候突然宕機了,buffer中的臟數據都已經沒了,那oracle是怎麽恢復的呢?其實答案就是low rba,在實例恢復時候oracle會去檢查檢查點隊列第一個low rba地址位置,由於6號文件322號塊已經完成寫了(這裏註意下oracle在寫過程中會先把數據庫從檢查點隊列放到obj-q隊列)此時檢查點隊列的第一條記錄是3號文件的322號塊在redo中的low rda位置,這個記錄就記錄在控制文件中。其實仔細觀察可以發現,檢查點隊列的順序就是redo記錄中的順序,我們找到檢查點隊列第一條需要恢復的rda位置時候就能根據rda將原來的檢查點隊列恢復出來,有2個小點需要註意,第一,這裏的終點其實就是on disk rda,這條記錄的意思是oracle寫入redo日誌到磁盤的redo位置,如果說redo的rba大於這個值說明還有log buffer未刷到磁盤裏,oracle也不會去恢復它。第二,6號文件322號塊第二次改變是不需要恢復的,在第一次變成臟塊的時候,數據庫就已經將該塊的值改為了green當恢復遇到該條目的時候,會將green改為green,所以說low rba的重要性遠遠大於high rba。

oracle檢查點隊列