【Oracle】-【體系結構-LGWR】-LGWR的一些理解

bisal發表於2013-07-26

LGWR的一些理解:


LGWR,是Log Writer的縮寫,也是一種後臺程式。主要負責將日誌緩衝內容寫到磁碟的線上重做日誌檔案或組中。DBWn將dirty塊寫到磁碟之前,所有與buffer修改相關的redo log都需要由LGWR寫入磁碟的線上重做日誌檔案(組),如果未寫完,那麼DBWn會等待LGWR,也會產生一些相應的等待事件(例如:log file prarllel write,後面單獨作為話題再聊)。總之,這樣做的目的就是為了當crash時,可以有恢復之前操作的可能,也是Oracle在保持交易完整性方面的一個機制。


相關知識點:

1、LGWR寫日誌是順序寫,這就解釋了一個Orace Server只能有一個LGWR程式,不能像DBWR那樣可以有多個,否則就無法保證順序寫的機制,而且可能會產生鎖的問題。

2、使用者程式每次修改記憶體資料塊時,都會在日誌緩衝區(redo buffer)中構造一個相應的重做條目(redo entry),它記錄了被修改資料塊修改之前和之後的值。

3、LGWR將redo entry寫入聯機日誌檔案的情況可以概括為兩種:後臺寫和同步寫,或者說非同步寫和同步寫。

後臺寫的條件:

(1)、每3秒LGWR啟動一次。

(2)、DBWR啟動時如果發現dirty塊對應的redo entry還沒寫入聯機日誌檔案,則DBWR觸發LGWR程式並等待LGWR完成後繼續。

(3)、redo entry數量達到整個log buffer的1/3時,觸發LGWR。

(4)、redo entry的數量達到1M。

同步寫的條件:

COMMIT。即執行COMMIT時,必須等待log buffer進行flushing操作(可能產生log file sync等待事件),寫入磁碟中的聯機日誌檔案。但一般上述1/3滿的條件觸發LGWR,幾乎強制LGWR實時寫,因此當需要執行COMMIT,可能沒有任何redo entry需要寫入了。

4、3秒觸發LGWR的規則,事實上,這個超時是DBWR的,但是因為LGWR總在DBWR呼叫之前執行,因此效果上也相當於LGWR的超時是3秒即呼叫。

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

相關文章