什麼是checkpoint

在數據庫系統中,寫日誌和寫數據文件是數據庫中IO消耗最大的兩種操做,在這兩種操做中寫數據文件屬於分散寫,寫日誌文件是順序寫,所以爲了保證數據庫的性能,一般數據庫都是保證在提交(commit)完成以前要先保證日誌都被寫入到日誌文件中,而髒數據塊着保存在數據緩存(buffer cache)中再不按期的分批寫入到數據文件中。也就是說日誌寫入和提交操做是同步的,而數據寫入和提交操做是不一樣步的。這樣就存在一個問題,當一個數據庫崩潰的時候並不能保證緩存裏面的髒數據所有寫入到數據文件中,這樣在實例啓動的時候就要使用日誌文件進行恢復操做,將數據庫恢復到崩潰以前的狀態,保證數據的一致性。檢查點是這個過程當中的重要機制,經過它來肯定,恢復時哪些重作日誌應該被掃描並應用於恢復。數據庫

通常所說的checkpoint是一個數據庫事件(event),checkpoint事件由checkpoint進程(LGWR/CKPT進程)發出,當checkpoint事件發生時DBWn會將髒塊寫入到磁盤中,同時數據文件和控制文件的文件頭也會被更新以記錄checkpoint信息。緩存

checkpoint的做用性能

checkpoint主要2個做用:日誌

保證數據庫的一致性,這是指將髒數據寫入到硬盤,保證內存和硬盤上的數據是同樣的;orm

縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬盤的髒數據經過日誌進行恢復。若是髒塊過多,實例恢復的時間也會很長,檢查點的發生能夠減小髒塊的數量,從而提升實例恢復的時間。隊列

通俗的說checkpoint就像word的自動保存同樣。進程

檢查點分類事件

徹底檢查點(Normal checkpoint)內存

增量檢查點(Incremental checkpoint)rem

checkpoint相關概念術語

在說明checkpoint工做原理以前咱們先了解一些相關的術語。

RBA(Redo Byte Address), Low RBA(LRBA), High RBA(HRBA)

RBA就是重作日誌塊(redo log block)的地址,至關與數據文件中的ROWID,經過這個地址來定位重作日誌塊。RBA由三個部分組成:

日誌文件序列號(4字節)

日誌文件塊編號(4字節)

重作日誌記錄在日誌塊中的起始偏移字節數(2字節)

一般使用RBA的形式有:

LRBA

數據緩存(buffer cache)中一個髒塊第一次被更新的時候產生的重作日誌記錄在重作日誌文件中所對應的位置就稱爲LRBA。

HRBA

數據緩存(buffer cache)中一個髒塊最近一次被更新的時候產生的重作日誌記錄在重作日誌文件中所對應的位置就稱爲HRBA。

checkpoint RBA

當一個checkpoint事件發生的時候,checkpoint進程會記錄下當時所寫的重作日誌塊的地址即RBA,此時記錄的RBA被稱爲checkpoint RBA。從上一個checkpoint RBA到當前的checkpoint RBA之間的日誌所保護的buffer cache中的髒塊接下來將會被寫入到數據文件當中去。

Buffer checkpoint Queues (BCQ)

Oracle將全部在數據緩存中被修改的髒塊按照LRBA順序的組成一個checkpoint隊列,這個隊列主要記錄了buffer cache第一次發生變化的時間順序,而後有DBWn進程根據checkpoint隊列順序將髒塊寫入到數據文件中,這樣保證了先發生變動的buffer能先被寫入到數據文件中。BCQ的引入是爲了支持增量checkpoint的。

Active checkpoint Queue (ACQ)

ACQ中包含了全部活動的checkpoint請求。每次有新checkpoint請求是都會在ACQ中增長一條記錄,ACQ記錄中包含了相應的checkpoint RBA。checkpoint完成之後相應的記錄將被移出隊列。

相關文章
相關標籤/搜索