oracle檢查點隊列
主要總結數據庫寫臟塊的機制。
當一個進程要進行修改數據塊的時候
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檢查點隊列