全域性檢查點和增量檢查點(zt)

tolywang發表於2008-01-12
由於Oracle中LGWR和DBWR工作的不一致,Oracle引入了檢查點的概念,用於同步資料庫,保證資料庫的一致性。在Oracle裡面,檢查點分為兩種:完全檢查點和增量檢查點。下面我們分別介紹這兩種檢查點的作用: [@more@]


1、 完全檢查點

在Oracle8i之前,資料庫的發生的檢查點都是完全檢查點,完全檢查點會將資料緩衝區裡面所有的髒資料塊寫入相應的資料檔案中,並且同步資料檔案頭和控制檔案,保證資料庫的一致。完全檢查點在8i之後只有在下列兩種情況下才會發生:

(1、)DBA手工執行alter system checkpoint的命令;

(2、)資料庫正常shutdown(immediate,transcational,normal)。

由於完全檢查點會將所有的髒資料庫塊寫入,巨大的IO往往會影響到資料庫的效能。因此Oracle從8i開始引入了增量檢查點的概念。


2、 增量檢查點

Oracle從8i開始引入了檢查點佇列這麼一種概念,用於記錄資料庫裡面當前所有的髒資料塊的資訊,DBWR根據這個佇列而將髒資料塊寫入到資料檔案中。檢查點佇列按時間先後記錄著資料庫裡面髒資料塊的資訊,裡面的條目包含RBA(Redo Block Address,重做日誌裡面用於標識檢查點期間資料塊在重做日誌裡面第一次發生更改的編號)和資料塊的資料檔案號和塊號。在檢查點期間不論資料塊更改幾次,它在檢查點佇列裡面的位置始終保持不變,檢查點佇列也只會記錄它最早的RBA,從而保證最早更改的資料塊能夠儘快寫入。當DBWR將檢查點佇列裡面的髒資料塊寫入到資料檔案後,檢查點的位置也要相應地往後移,CKPT每三秒會在控制檔案中記錄檢查點的位置,以表示Instance Recovery時開始恢復的日誌條目,這個概念稱為檢查點的“心跳”(heartbeat)。檢查點位置發生變更後,Oracle裡面透過4個引數用於控制檢查點位置和最後的重做日誌條目之間的距離。在這裡面需要指出的是,多數人會將這4個引數看作控制增量檢查點發生的時間。事實上這是錯誤的,這4個引數是用於控制檢查點佇列裡面的條目數量,而不是控制檢查點的發生。

(1、)fast_start_io_target

該引數用於表示資料庫發生Instance Recovery的時候需要產生的IO總數,它透過v$filestat的AVGIOTIM來估算的。比如我們一個資料庫在發生Instance Crash後需要在10分鐘內恢復完畢,假定OS的IO每秒為500個,那麼這個資料庫發生Instance Recovery的時候大概將產生500*10*60=30,000次IO,也就是我們將可以把fast_start_io_target設定為30000。

(2、)fast_start_mttr_target

我們從上面可以看到fast_start_io_target來估算檢查點位置比較麻煩。Oracle為了簡化這個概念,從9i開始引入了fast_start_mttr_target這麼一個引數,用於表示資料庫發生Instance Recovery的時間,以秒為單位。這個引數我們從字面上也比較好理解,其中的mttr是mean time to recovery的簡寫,如上例中的情況我們可以將fast_start_mttr_target設定為600。當設定了fast_start_mttr_target後,fast_start_io_target這個引數將不再生效,從9i後fast_start_io_target這個引數被Oracle廢除了。

(3、)log_checkpoint_timeout

該引數用於表示檢查點位置和重做日誌檔案末尾之間的時間間隔,以秒為單位,預設情況下是1800秒。

(4、)log_checkpoint_interval

該引數是表示檢查點位置和重做日誌末尾的重做日誌塊的數量,以OS塊表示。

(5、)90% OF SMALLEST REDO LOG

除了以上4個初始化引數外,Oracle內部事實上還將重做日誌檔案末尾前面90%的位置設為檢查點位置。在每個重做日誌中,這麼幾個引數指定的位置可能不盡相同,Oracle將離日誌檔案末尾最近的那個位置確認為檢查點位置。

=============================================

1. oracle 7 中只有全域性檢查點,因為沒有checkpoint queue,dirty buffer是無序的,所以必須一次性寫出,寫出的過程中要lock dirty buffer不能再被修改。

oracle 8 中全域性檢查點變成了增量檢查點,它是和checkpoint queue一起出現的。增量檢查點發生的時候,ckpt檢查點程式將已經完成的最後一個檢查點寫到資料檔案頭和控制檔案,通知dbwr開始寫資料檔案寫到檢查點觸發這個時刻(也就是當前時刻)。在checkpoint queue中,dirty buffer按照低重做值(第一次變髒的順序)排序,所以在寫出的時候dirty buffer可以同時被修改。這是增量檢查點最重要的作用。

有一個叫heartbeat的概念,也就是ckpt檢查點程式每3秒將當前dbwr寫的進度(rba)寫到控制檔案中。於是這個就縮短了instance recovery和media recovery的過程(當然這個過程也不是越短越好,否則dbwr寫太頻繁會帶來I/O方面的問題)。這是增量檢查點的另一個好處。


2. 這幾個引數就是透過oracle的演算法,決定了下一次增量檢查點發生的時間或者說位置。


3. 9i開始推薦使用fast_start_mttr_target,另外的引數都置0。

Whenever you set FAST_START_MTTR_TARGET to a nonzero value, and while MTTR advisory is ON, Oracle Corporation recommends that you disable (set to 0) the following parameters:

  • LOG_CHECKPOINT_TIMEOUT
  • LOG_CHECKPOINT_INTERVAL
  • FAST_START_IO_TARGET

Because these initialization parameters either override FAST_START_MTTR_TARGET or potentially drive checkpoints more aggressively than FAST_START_MTTR_TARGET does, they can interfere with the simulation.

這裡“MTTR advisory is ON”的條件是,STATISTICS_LEVEL is set to TYPICAL or ALL,以及the initialization parameter FAST_START_MTTR_TARGET is set to a nonzero value。

http://roujiaweize.spaces.live.com/blog/cns!9745F14B4AEB3B72!941.entry

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

相關文章