checkpoint 優化

n-lauren發表於2012-09-17

什麼是checkpoint

Checkpoint是為了記憶體中已經被修改的資料塊與磁碟資料檔案同步的一種資料庫事件。它提供了一種保持事務提交以後資料一致的手段。往Oracle磁碟寫髒資料的機制與事務提交不是同步的。

checkpoint有兩個目的:

1、確保資料一致性。

2、使資料庫能快速地恢復。

怎樣快速恢復

因為資料庫會把所有的改變都在資料檔案上設定checkpoint並一直增加,它不需要請求checkpoint之前的重做日誌,Checkpoint能保證所有在快取區的資料寫到相應的資料檔案,防止因為意外的例項失敗導致的資料丟失。

Oracle寫這個髒資料只在一定的條件下:
1DBWR 超時,大約3秒時間
2系統中沒有多的空緩衝區來存放資料
3CKPT程式(產生新的checkpoint) 觸發DBWR

一個checkpoint5中事件型別:
1、每次重做日誌的切換;
2LOG_CHECKPOINT_TIMEOUT 這個延遲引數的到達;
3、相應位元組(LOG_CHECKPOINT_INTERVAL* size of IO OS blocks)被寫到當前的重做日誌;
4ALTER SYSTEM SWITCH LOGFILE 這個命令會直接導致checkpoint發生
5ALTER SYSTEM CHECKPOINT

Checkpoint期間會有下面程式發生:
1. DBWR寫所有髒資料到資料檔案;
2. LGWR更新控制檔案和資料檔案的SCN

Checkpoints和優化:
Checkpoints是一個資料庫優化的難點。頻繁的Checkpoints可以實現快速的恢復,但也會使效能下降。怎樣處理這個問題呢?

依賴於資料庫資料檔案的數量,一個Checkpoint可能是高速的執行。因為所有的資料檔案在Checkpoint期間都會被凍結。更頻繁的Checkpoints可以快速恢復資料庫。這也客戶對不按規定系統當機的容忍的原因。然而,在一些特殊情況下,頻繁的Checkpoints也不能保證可以快速恢復。我們假設資料庫在95%的時間內是正常執行,5%由於例項失敗導致不可用,要求恢復。對大多數客戶而言,他們更希望調整95%的效能而不是5%的當機時間。這個假設表明,效能是擺在第一位的所以我門的目標就是在優化期間減少Checkpoints的頻繁度。

優化Checkpoints包括4個關鍵的初始化引數:

- FAST_START_MTTR_TARGET
- LOG_CHECKPOINT_INTERVAL
- LOG_CHECKPOINT_TIMEOUT
- LOG_CHECKPOINTS_TO_ALERT

詳細介紹每個引數:

FAST_START_MTTR_TARGET

Oracle9i以來FAST_START_MTTR_TARGET 引數是調整checkpoint的首選的方法。FAST_START_MTTR_TARGET 可以指定單例項恢復需要的秒數。基於內部的統計,增長的checkpoint會自動調整的checkpint的目標以滿足FAST_START_MTTR_TARGET 的需求。

V$INSTANCE_RECOVERY.ESTIMATED_MTTR 顯示當前估計需要恢復的秒數。這個值會被顯示即使FAST_START_MTTR_TARGET 沒有被指定。
V$INSTANCE_RECOVERY.TARGET_MTTR 表明在短時間內MTTR的目標。
V$MTTR_TARGET_ADVICE 顯示這個當前MTTR設定的工作量產生的I/O數量和其他I/O。這個檢視幫助使用者評定這個在優化和恢復之前的平衡。

LOG_CHECKPOINT_INTERVAL

LOG_CHECKPOINT_INTERVAL 引數指定這個最大的重做塊的間隔數目。如果FAST_START_MTTR_TARGET被指定,LOG_CHECKPOINT_INTERVAL不能被設定為0
在大多數Unix系統的OS塊大小是512位元組。設定LOG_CHECKPOINT_INTERVAL=10000意味著這個增長的checkpoint不能追加到當前日誌,因為多於5M。如果你的重做日誌是20M,你將發出4checkpoint對每個重做日誌。


LOG_CHECKPOINT_INTERVAL 會發生影響當一個checkpoint發生時,小心設定這個引數,保持它隨著重做日誌檔案大小變化而變化。checkpoint頻繁是這個影響資料庫恢復的原因之一。短的checkpoint間隔意味資料庫將快速恢復,也增加了資源的利用。這個引數也影響資料庫向前回滾的時間。實際的恢復時間是基於這個時間,當然還有失敗的型別和需要歸檔日誌的數量。

LOG_CHECKPOINT_TIMEOUT
這個引數指定checkpoint發出的時間間隔。換句話說,它指定一次髒資料多少時間寫出一次。checkpoint頻率會影響這個資料庫恢復的時間。長時間的間隔會要求資料庫恢復要求更久。Oracle建議用LOG_CHECKPOINT_interval去控制checkpoint而不用LOG_CHECKPOINT_TIMEOUTLOG_CHECKPOINT_TIMEOUTn秒發一次checkpoint,不顧事務提交的頻率。這可能會導致一些沒有必要的checkpoint在事務已經變化的情況下。不必要的checkpoint必須被避免。還有一個容易誤解的地方:LOG_CHECKPOINT_TIMEOUT 會間隔性地發出log switch。而Log switch會觸發一個checkpoint,但checkpoint不會導致一個log switch。唯一手工方式alter system switch logfile或者重新設定redo logs大小可以導致頻繁switch

SQL> alter system set log_checkpoint_timeout=300;[單位是秒]

log_checkpoint_to_alert

設定為真,可以在告警日誌中觀察到增量檢查點的觸發

SQL> alter system set log_checkpoints_to_alert=true;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22990797/viewspace-743721/,如需轉載,請註明出處,否則將追究法律責任。

相關文章