觸發redo寫的幾個條件

觸發redo寫的幾個條件

 

主要有如下幾個條件觸發LGWR執行寫操做:

1.超時(timeout)
當LGWR處於空閒狀態時,它依賴於rdbms ipc message等待,處於休眠狀態,直到3秒超時時間到。
若是LGWR發現有redo須要寫出,那麼LGWR將執行寫出操做,log file parallel write等待事件將會出現。

啓用10046事件,從LGWR跟蹤日誌中能夠清楚的觀察到這些事件:

html

WAIT #0: nam='rdbms ipc message' ela= 2999554 p1=300 p2=0 p3=0
WAIT #0: nam='rdbms ipc message' ela= 2999470 p1=300 p2=0 p3=0
WAIT #0: nam='rdbms ipc message' ela= 566819 p1=300 p2=0 p3=0
WAIT #0: nam='log file parallel write' ela= 115 p1=1 p2=2 p3=1
WAIT #0: nam='rdbms ipc message' ela= 45752 p1=213 p2=0 p3=0
WAIT #0: nam='log file parallel write' ela= 94 p1=1 p2=3 p3=1
WAIT #0: nam='rdbms ipc message' ela= 51762 p1=208 p2=0 p3=0
WAIT #0: nam='log file parallel write' ela= 91 p1=1 p2=1 p3=1
WAIT #0: nam='rdbms ipc message' ela= 29033 p1=200 p2=0 p3=0
WAIT #0: nam='log file parallel write' ela= 99 p1=1 p2=2 p3=1
WAIT #0: nam='rdbms ipc message' ela= 40293 p1=197 p2=0 p3=0
WAIT #0: nam='log file parallel write' ela= 87 p1=1 p2=1 p3=1

 

2.閾值達到
只要一個進程在log buffer中分配空間,已經使用的Log buffer的數量將被計算。若是使用的塊的
數量大於或等於_log_io_size參數設置,那麼將會觸發LGWR寫操做
若是此時LGWR未處於活動狀態,那麼LGWR將被通知去執行後臺寫操做。
缺省的_log_io_size等於1/3 log buffer大小,上限值爲1M,此參數在X$KSPPSV中顯示的0值,意爲缺省值。
也就是,LGWR將在Min(1M,1/3 log buffer size)時觸發。注意此處的log buffer size是以log block來衡量的。
此值一般爲512 bytes.

20:33:15 SQL> @D:\GetHiddenParameter.sql
Enter value for par: log_io
old  14:   x.ksppinm like '%_&par%'
new  14:   x.ksppinm like '%_log_io%'

NAME                           VALUE                     ISDEFAULT ISMOD      ISADJ
------------------------------ ------------------------- --------- ---------- -----
_log_io_size                   0                         TRUE      FALSE      FALSE

Elapsed: 00:00:00.02

得到Oracle的隱含參數,參考 如何獲取Oracle的隱含參數

3.提交
當一個事物提交時,在redo stream中將記錄一個提交標誌。
在這些redo被寫到磁盤上以前,這個事物是不可恢復的。因此,在事務返回成功標誌給用戶前,必須等待LGWR寫完成。進程通知LGWR寫,而且以log file sync事件開始休眠,超時時間爲1秒。
Oracle的隱含參數_wait_for_sync參數能夠設置爲false避免redo file sync的等待,可是就將沒法保證事務的恢復性。
20:46:02 SQL> @D:\GetHiddenParameter.sql
Enter value for par: wait_for

NAME                           VALUE                     ISDEFAULT ISMOD      ISADJ
------------------------------ ------------------------- --------- ---------- -----
_wait_for_sync                 TRUE                      TRUE      FALSE      FALSE

注意,在遞歸調用(recursive calls)中的提交(好比過程當中的提交)不須要同步redo直到須要返回響應給用戶。所以遞歸調用僅須要同步返回給用戶調用以前的最後一次Commit操做的RBA。

存在一個SGA變量用以記錄redo線程須要同步的log block number。
若是多個提交在喚醒LGWR以前發生,此變量記錄最高的log block number,在此以前的全部redo都將被寫入磁盤。 這有時候被稱爲組提交(group commit). 4.在DBWR寫以前 若是DBWR將要寫出的數據的高RBA超過LGWR的on-Disk RBA,DBWR將post LGWR去執行寫出。 在Oracle8i以前,此時DBWR將等待log file sync事件。 從Oracle8i開始,DBWR把這些Block放入一個defer隊列,同時通知LGWR執行redo寫出,DBWR能夠繼續執行無需等待的數據寫出。
相關文章
相關標籤/搜索