全量CHECKPOINT和增量CHECKPOINT對用戶都是透明的,而增量CHECKPOINT只不過是將全量CHECKPOINT要寫的臟塊分時間分批次寫到數據文件中而已,此操作可以極大地減少對數據庫性能的影響。
- 全量CHECKPOINT
全量CHECKPOINT是指DBWR進程將臟緩沖區列表中的臟塊一次性地寫入數據文件中。該操作可以簡單地分為2個步驟(這里假設執行全量CHECKPOINT的時間點為t1):
(1)DBWR進程將t1時間點前的所有臟塊寫到數據文件。如果臟塊很多,將引起大量的I/O寫操作。如果DBWR進程數不夠,寫入速度將比較緩慢。
(2)確定所有臟塊都寫進數據文件之后,CKPT進程更新控制文件和數據文件頭。
假如SGA中的臟塊數量很多,那么DBWR進程一次性寫臟塊是非常消耗I/O的,這不僅加重了DBWR進程的負擔,而且還可能因為I/O問題而影響業務,所以不建議頻繁進行全量CHECKPOINT操作。 - 增量CHECKPOINT
從Oracle 8開始,Oracle推出了增量CHECKPOINT這一特性,即DBWR進程將CKPTQ隊列中的臟塊不斷地寫往磁盤中,從而減輕磁盤I/O壓力。Oracle是否啟用增量CHECKPOINT,跟隱含參數_disable_incremental_checkpoints有關(默認開啟增量CHECKPOINT)。增量CHECKPOINT操作步驟可以簡單地分為3步:
(1)BUFFER CACHE中臟塊第一次被更新的時候產生的重做日志記錄在重做日志文件中所對應的位置就稱為LRBA(Low Redo Block Adress)。臟塊按照LRBA順序組成CKPTQ列表。DBWR進程掃描CKPTQ列表,依次將滿足條件的臟塊寫進數據文件中,并在內存中遞增CHECKPOINT NUMBER值,即SCN值。
(2)臟塊寫成功之后,DBWR進程將臟塊從CKPTQ隊列中移走。
(3)CKPT進程每隔3秒在控制文件中更新DBWR寫臟塊的進度,即增量CHECKPOINT所完成的RBA信息。 - 全量CHECKPOINT和增量CHECKPOINT區別
增量CHECKPOINT時,CKPT進程不更新數據文件頭信息,但會更新控制文中的CHECKPOINT PROGRESS RECORDS。可以DUMP控制文件觀察當前實例LGWR進程寫在線日志的進度情況。全量CHECKPOINT和增量CHECKPOINT的主要區別如下:
?寫臟塊的動作不同。全量CHECKPOINT會將BUFFER CACHE中某一時間點之前的所有臟塊刷新到數據文件中,在臟塊比較多的數據庫中,全量CHECKPOINT操作可能會影響數據庫的性能。增量CHECKPOINT則是將臟塊第一次變臟的順序分為不同的時間點逐批寫到數據文件中,有點“細水長流”的感覺。
?更新的位置不同。全量CHECKPOINT完成之后,會更新內存、數據文件頭、控制文件。而增量CHECKPOINT完成之后,只更新內存SCN值和控制文件。
?觸發的條件不同。全量CHECKPOINT往往需要通過命令人為觸發,而增量CHECKPOINT的觸發受多種因素影響,如ONLINE REDOLOG大小、參數FAST_START_MTTR_TARGET等。