Oracle體系結構之檢查點

CKPTQCheckpoint Queue(檢查點隊列)檢查點隊列中的數據塊記錄着每個數據塊的LRBA地址

  • RBA      Redo Block Address(重做日誌塊的地址,相當於數據文件中的rowid,可以通過該地址定位重做日誌塊)

由三個部分組成:4byte+4byte+2byte

logfile sequence number(日誌文件序列號)

logfile block number(日誌文件塊編號)

byte offset into the block(重做日誌記錄在日誌塊中的起始偏移字節數)

  • LRBA    Low cache RBA(buffer cache中髒塊第一次變髒的時候產生重做日誌記錄在redo log file中對應的地址,即當前檢查點隊列的位置)

  • HRBA    High cache RBA(buffer cache中髒塊最近一次變髒的時候產生重做日誌記錄在redo log file中對應的地址)

  • on disk RBAredo log file中狀態爲CURRENT的最後一條日誌地址


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

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


Checkpoint的主要作用:

  • 保證數據庫的一致性。

   這是指將髒數據寫入到硬盤,保證內存和磁盤上的數據是一樣的;

  • 縮短實例恢復的時間。

   實例恢復需要把實例異常關閉前沒有寫入到磁盤的髒數據通過日誌進行恢復,如果髒塊過多,實例恢復的時間也會很長,檢查點的發生可以減少髒塊的數量,從而提高實例恢復的時間。


如果初始化參數LOG_CHECKPOINTS_TO_ALERT設置爲TRUE,則有關每個檢查點的信息都記錄在alert_$ORACLE_SID.log 文件內。該參數缺省值爲FALSE,表示不記錄檢查點。


在Oracle裏面,檢查點分爲三種:完全檢查點、增量檢查點、部分(臨時)檢查點

完全檢查點

在Oracle8i之前,數據庫的發生的檢查點都是完全檢查點。

完全檢查點會觸發DBWn將buffer cache裏面所有的髒數據塊寫入相應的數據文件中(即使事務未提交),並且同步數據文件頭和控制文件中的信息,保證數據庫的一致性。

完全檢查點在8i之後只有在下列兩種情況下才會發生:

  • 數據庫正常shutdown(immediate,transcational,normal)

  • DBA手工命令干預(alter system checkpoint)


增量檢查點

增量檢查點並不更新控制文件中系統SCN、文件SCN、結束SCN以及數據文件頭部的開始SCN,而是每隔3秒由CKPT進程將檢查點隊列中第一個髒塊所對應的LRBA地址(即檢查點的位置,前滾起點)記錄到控制文件中.

但如果是由日誌切換所引起的增量檢查點,則同時還會將LRBA地址記錄到每個數據文件頭中


引起增量檢查點的條件有:

  • fast_start_mttr_target參數(mttr:Mean Time To Recovery 快速啓動平均故障恢復時間)

   該參數控制數據庫對單個實例執行崩潰恢復所花費的時間量(以秒爲單位,默認爲0,最大值爲3600)。

啓用快速啓動檢查點功能時,Oracle將自動根據工作負載情況計算增量檢查點的頻率(間接影響DBWn進程的頻率),以便達到請求的MTTR。如果將該值設置爲0, 將禁用此功能。(但工作負載檢查無法關閉)

   log_checkpoint_timeout參數用於表示檢查點位置和重做日誌文件末尾之間的時間間隔,以秒爲單位,默認情況下是1800秒。

   fast_start_io_target參數用於表示數據庫發生Instance Recovery的時候需要產生的IO總數,它通過v$filestat的AVGIOTIM來估算的。(9i以後已經廢棄)


   SQL> alter system set fast_start_mttr_target=90;

   System altered.

   SQL> show parameter fast_start_mttr_target

   NAME                                 TYPE        VALUE

   ------------------------------------ ----------- ---------

   fast_start_mttr_target               integer     90


  • 日誌切換

   SQL> alter system switch logfile;

   System altered.


部分檢查點

觸發DBWn進程將buffer cache中相關的數據髒塊都會寫入相應的數據文件

引起部分檢查點的條件有:

  • 表空間下線/只讀

   SQL> ALTER TABLESPACE tablespace_name OFFLINE;

   SQL> ALTER TABLESPACE tablespace_name READ ONLY;

  • 熱備份(熱備份表空間的時候,爲了避免redo log被覆蓋,數據庫必須運行在歸檔模式下)

   SQL> ALTER TABLESPACE tablespace_name BIGEN BACKUP;          //進入熱備份狀態(鎖住數據文件頭,並記錄塊變化日誌)

   SQL> ! cp

   SQL> ALTER TABLESPACE tablespace_name END backup;            //退出熱備份(解鎖數據文件頭)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章