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能夠繼續執行無需等待的數據寫出。