資料寫過程中各項觸發條件及邏輯
如大家所知,使用者提交的資料並非直接寫入資料檔案,這中間有一個複雜的處理過程,如下圖所示:大致描述了資料寫過程中的處理邏輯
資料寫過程的體系結構.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的體系。
資料寫過程的體系結構.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/21302630/viewspace-1571823/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 觸發DBWR程式寫髒資料塊到資料檔案的幾個條件
- oracle中各程式的觸發條件(希望對大家有幫助) (zt)Oracle
- MySQL筆記 10 條件邏輯MySql筆記
- oracle邏輯讀過程Oracle
- Oracle DBWR觸發條件Oracle
- 觸發LGWR程式寫日誌的4個條件
- 關於 hibernate 邏輯刪除 預設查詢過濾條件問題(java set 條件)Java
- ASP.NET Razor – VB 邏輯條件簡介ASP.NET
- 幾個程式觸發條件(zt)
- DBWn程式觸發4個條件
- ASP.NET Razor – C# 邏輯條件簡介ASP.NETC#
- JavaScript(ES6)邏輯判斷條件優化JavaScript優化
- mysql 觸發器/過程中的變數!!MySql觸發器變數
- 【機器學習】邏輯迴歸過程推導機器學習邏輯迴歸
- Oracle DBWR,LGWR,CKPT,ARCH 觸發條件Oracle
- oracle checkpoint 觸發的9個條件Oracle
- Oracle9i DBWn 觸發條件Oracle
- Oracle9i CKPT 觸發條件Oracle
- Oracle9i LGWR 觸發條件Oracle
- Tom寫的show_space過程---紀錄每條紀錄及表資料大小 (zt)
- [BUG反饋]模型編輯模板存在條件邏輯判斷錯誤模型
- 專注資料才能發現邏輯
- 總結Minor GC、Full GC觸發條件GC
- DBWR,LGWR,CKPT,ARCH觸發條件總結
- 觸發CKPT(checkpoint)程式的幾個條件
- 儲存過程WHERE條件不生效儲存過程
- 資料泵過濾匯出資料的where條件
- hibernate如何處理儲存過程中的複雜邏輯儲存過程
- SQL資料庫觸發器例項SQL資料庫觸發器
- 儲存過程中的符合條件查詢 and 1= ''+@knlgName+''儲存過程
- 各種索引型別發生的條件索引型別
- 前端業務程式碼配置化處理條件判斷邏輯前端
- 計算機程式的思維邏輯 (72) – 顯式條件計算機
- 計算機程式的思維邏輯 (72) - 顯式條件計算機
- Oracle 發郵件過程Oracle
- 資料庫開發程式設計師在開發過程中的注意事項資料庫程式設計師
- oracle 寫入資料的過程Oracle
- Oracle DBWR,LGWR,CKPT,ARCH 觸發條件 總結Oracle