資料寫過程中各項觸發條件及邏輯

peng163fj發表於2015-04-13
如大家所知,使用者提交的資料並非直接寫入資料檔案,這中間有一個複雜的處理過程,如下圖所示:大致描述了資料寫過程中的處理邏輯


資料寫過程中各項觸發條件及邏輯
資料寫過程的體系結構.jpg


資料庫快取:
單資料庫快取的寫過程看起來很簡單,但是其實際過程相當複雜,大家務必要注意。最基本的在寫資料庫快取之前,肯定會先涉及到讀,比如你要更新一個表的資料,那麼它會首先查詢你要更新的資料是否已經存在於資料庫快取,如果不存在,就需要先將其從資料檔案中讀取出來,而這個讀取又有可能觸發寫操作,這個寫要分兩步:
·第一步是判斷資料庫快取中是否還有足夠的剩餘空間,如果剩餘空間不足,則首先按照LRU的規則寫一部分髒資料到資料檔案中,騰出足夠的空閒空間,然後再將要被更新的資料寫進來。
·另一步是將更新前的資料寫入回滾段,然後再將更新的資料寫入資料庫快取。

即使是資料庫快取中的資料,也不是實時寫向資料檔案的,其觸發條件看起來也很簡單:
1、資料庫快取區的空閒空間不足
2、執行了檢查點

執行檢查點主要完成兩項工作:
1、更新控制檔案,並修改資料檔案的頭資訊,記錄檢查點
2、向DBWR佈置將髒快取塊寫入資料檔案的任務

其觸發條件是比較多的:
1、重做日誌檔案切換
2、系統收到ALTER SYSTEM CHECKPOINT;命令
3、將表空間置為離線(offline)/只讀(read only)/備份(backup)狀態
4、通過初始化引數的設定控制檢查點的執行頻率。比如log_checkpoint_timeout初始化引數的值可以控制髒資料在DB BUFFER中的保留時間,log_checkpoint_interval初始化引數的值 可以控制在執行檢查點之前,redolog檔案中作業系統塊(非oracle資料庫塊)的數量。

注意,將表空間置為:離線(offline)/只讀(read only)/備份(backup)狀態時觸發的DBWR寫任務,只會寫入相關表空間的髒快取塊。另外,CKPT每隔3秒寫控制檔案,以記錄檢查點在重做日誌檔案中的位置。

你可能會擔心,我們的修改被儲存在了資料庫快取中,但資料庫快取並非實時向資料檔案寫資料,雖然有一些觸發條件,但觸發條件也不是時時都會發生,這會不會造成資料的丟失呢,別擔心,Oracle還有重做日誌,接著向下看:

寫重做日誌快取:

在一步一步學dataguard系列中我寫過一段文字專門白話了關於redo的相關概念,這裡就不詳述了,我們需要緊記一點,只要資料還在重做日誌快取中,尚未寫入重做日誌檔案,這些資料就仍是不安全的,因此明確觸發重做日誌快取向重做日誌檔案寫的條件就非常重要:
1、每隔3秒自動觸發一次
2、事務提交(注意理解ddl操作)
3、重做日誌快取被寫滿1/3
4、Dbwr準備寫髒資料塊到資料檔案,如果這些資料對應的重做資訊尚未寫入重做日誌檔案的話,會先等待lgwr將髒資料涉及的重做日誌寫入重做日誌檔案,然後再將其寫入資料檔案(保證資料一致的關鍵步驟)

注意,沒有重做日誌檔案切換這個條件,需要理解日誌檔案切換與重做日誌快取寫日誌檔案是兩種操作。當然,二者並非完全沒有關係,舉例來說假如切換日誌檔案之後,發現要切換的日誌檔案當然仍然在歸檔(或者其資料尚未完全寫入到資料檔案),則此時資料庫會被掛起,那麼重做日誌快取向日志檔案的寫過程也會暫停。

綜合來看,Dbwr,lgwr,ckpt三者相互關聯相互依存,因此我想,搞清楚它們之間的關係,不僅有助於我們瞭解oracle寫資料的邏輯,更有助於我們更深層次去理解oracle的體系。
 

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

相關文章