checkpoint概要
什麼是checkpoint
在數據庫系統中,寫日志和寫數據文件是數據庫中IO消耗最大的兩種操作,在這兩種操作中寫數據文件屬於分散寫,寫日志文件是順序寫,因此為了保證數據庫的性能,通常數據庫都是保證在提交(commit)完成之前要先保證日志都被寫入到日志文件中,而髒數據塊著保存在數據緩存(buffer cache)中再不定期的分批寫入到數據文件中。也就是說日志寫入和提交操作是同步的,而數據寫入和提交操作是不同步的。這樣就存在一個問題,當一個數據庫崩潰的時候並不能保證緩存裡面的髒數據全部寫入到數據文件中,這樣在實例啟動的時候就要使用日志文件進行恢復操作,將數據庫恢復到崩潰之前的狀態,保證數據的一致性。檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日志應該被掃描並應用於恢復。
一般所說的checkpoint是一個數據庫事件(event),checkpoint事件由checkpoint進程(LGWR/CKPT進程)發出,當checkpoint事件發生時DBWn會將髒塊寫入到磁盤中,同時數據文件和控制文件的文件頭也會被更新以記錄checkpoint信息。
checkpoint的作用
checkpoint主要2個作用:
保證數據庫的一致性,這是指將髒數據寫入到硬盤,保證內存和硬盤上的數據是一樣的;
縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬盤的髒數據通過日志進行恢復。如果髒塊過多,實例恢復的時間也會很長,檢查點的發生可以減少髒塊的數量,從而提高實例恢復的時間。
通俗的說checkpoint就像word的自動保存一樣。
檢查點分類
完全檢查點(Normal checkpoint)
增量檢查點(Incremental checkpoint)
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。