topcheckpoint掃盲
top什麼是checkpoint
在資料庫系統中,寫日誌和寫資料檔案是資料庫中IO消耗最大的兩種操作,在這兩種操作中寫資料檔案屬於分散寫,寫日誌檔案是順序寫,因此為了保證資料庫的效能,通常資料庫都是保證在提交(commit)完成之前要先保證日誌都被寫入到日誌檔案中,而髒資料塊著儲存在資料快取(buffer cache)中再不定期的分批寫入到資料檔案中。也就是說日誌寫入和提交操作是同步的,而資料寫入和提交操作是不同步的。這樣就存在一個問題,當一個資料庫崩潰的時候並不能保證快取裡面的髒資料全部寫入到資料檔案中,這樣在例項啟動的時候就要使用日誌檔案進行恢復操作,將資料庫恢復到崩潰之前的狀態,保證資料的一致性。檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日誌應該被掃描並應用於恢復。
一般所說的checkpoint是一個資料庫事件(event),checkpoint事件由checkpoint程式(LGWR/CKPT程式)發出,當checkpoint事件發生時DBWn會將髒塊寫入到磁碟中,同時資料檔案和控制檔案的檔案頭也會被更新以記錄checkpoint資訊。
topcheckpoint的作用
checkpoint主要2個作用:
- 保證資料庫的一致性,這是指將髒資料寫入到硬碟,保證記憶體和硬碟上的資料是一樣的;
- 縮短例項恢復的時間,例項恢復要把例項異常關閉前沒有寫出到硬碟的髒資料通過日誌進行恢復。如果髒塊過多,例項恢復的時間也會很長,檢查點的發生可以減少髒塊的數量,從而提高例項恢復的時間。
通俗的說checkpoint就像word的自動儲存一樣。
- 完全檢查點(Normal checkpoint)
- 增量檢查點(Incremental checkpoint)
topcheckpoint相關概念術語
在說明checkpoint工作原理之前我們先了解一些相關的術語。
topRBA(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中的髒塊接下來將會被寫入到資料檔案當中去。
topBuffer checkpoint Queues (BCQ)
Oracle將所有在資料快取中被修改的髒塊按照LRBA順序的組成一個checkpoint佇列,這個佇列主要記錄了buffer cache第一次發生變化的時間順序,然後有DBWn程式根據checkpoint佇列順序將髒塊寫入到資料檔案中,這樣保證了先發生變更的buffer能先被寫入到資料檔案中。BCQ的引入是為了支援增量checkpoint的。
topActive checkpoint Queue (ACQ)
ACQ中包含了所有活動的checkpoint請求。每次有新checkpoint請求是都會在ACQ中增加一條記錄,ACQ記錄中包含了相應的checkpoint RBA。checkpoint完成以後相應的記錄將被移出佇列。
top完全檢查點 (normal checkpoint)
top完全檢查點工作過程
一個checkpoint操作可以分成三個不同的階段:
- 第一階段,checkpoint程式開始一個checkpoint事件,並記錄下checkpoint RBA,這個通常是當前的RBA。
- 第二階段,checkpoint程式通知DBWn程式將所有checkpoint RBA之前的buffer cache裡面的髒塊寫入磁碟。
- 確定髒塊都被寫入磁碟以後進入到第三階段,checkpoint程式將checkpoint資訊(SCN)寫入/更新資料檔案和控制檔案中。
更新SCN的操作由CKPT程式完成,在Oracle 8.0之後CKPT程式預設是被啟用的,如果CKPT程式沒有啟用的話那相應的操作將由LGWR程式完成。
top什麼時候發生normal checkpoint
下面這些操作將會觸發checkpoint事件:
- 日誌切換,通過ALTER SYSTEM SWITCH LOGFILE。
- DBA發出checkpoint命令,通過ALTER SYSTEM checkpoint。
- 對資料檔案進行熱備時,針對該資料檔案的checkpoint也會進行,ALTER TABLESPACE TS_NAME BEGIN BACKUP/END BACKUP。
- 當執行ALTER TABLESPACE/DATAFILE READ ONLY的時候。
- SHUTDOWN命令發出時。
特別注意:
- 日誌切換會導致checkpoint事件發生,但是checkpoint發生卻不會導致日誌切換。
- 日誌切換觸發的是normal checkpoint,而不是大家所說的增量checkpoint,只不過log switch checkpoint的優先順序非常低,當一個log switch checkpoint發生的時候它並不會立即的通知DBWn程式去寫資料檔案,但是當有其它原因導致checkpoint或者是寫入資料檔案的RBA超過log switch checkpoint的checkpoint RBA的時候,這次的log switch checkpoint將會被標記成完成狀態,同時更新控制檔案和資料檔案頭。我們隨後可以做個實驗驗證這個說法。
topcheckpoint和SCN有什麼關係?
在Oracle中SCN相當於它的時鐘,在現實生活中我們用時鐘來記錄和衡量我們的時間,而Oracle就是用SCN來記錄和衡量整個Oracle系統的更改。
Oracle中checkpoint是在一個特定的“時間點”發生的,衡量這個“時間點”用的就是SCN,因此當一個checkpoint發生時SCN會被寫入檔案頭中以記錄這個checkpoint。
top增量checkpoint
top增量checkpoint工作過程
因為每次完全的checkpoint都需要把buffer cache所有的髒塊都寫入到資料檔案中,這樣就是產生一個很大的IO消耗,頻繁的完全checkpoint操作很對系統的效能有很大的影響,為此Oracle引入的增量checkpoint的概念,buffer cache中的髒塊將會按照BCQ佇列的順序持續不斷的被寫入到磁碟當中,同時CKPT程式將會每3秒中檢查DBWn的寫入進度並將相應的RBA資訊記錄到控制檔案中。
有了增量checkpoint之後在進行例項恢復的時候就不需要再從崩潰前的那個完全checkpoint開始應用重做日誌了,只需要從控制檔案中記錄的RBA開始進行恢復操作,這樣能節省恢復的時間。
top發生增量checkpoint的先決條件
- 恢復需求設定 (FAST_START_IO_TARGET/FAST_START_MTTR_TARGET)
- LOG_checkpoint_INTERVAL引數值
- LOG_checkpoint_TIMEOUT引數值
- 最小的日誌檔案大小
- buffer cache中的髒塊的數量
top增量checkpoint的特點
- 增量checkpoint是一個持續活動的checkpoint。
- 沒有checkpoint RBA,因為這個checkpoint是一直都在進行的,所以不存在normal checkpoint裡面涉及的checkpoint RBA的概念。
- checkpoint advanced in memory only
- 增量checkpoint所完成的RBA資訊被記錄在控制檔案中。
- 增量checkpoint可以減少例項恢復時間。