log file sync 和 log file parallel write

zhouxianwang發表於2013-08-12

dbsnak在微博裡這樣描述等待事件log file sync和log file parallel write的關係:

前 臺程式a通知LGWR要刷log buffer了,這時候a就開始等待log file sync,LGWR接到a的請求後開始等待OS把log buffer寫回redo log,這時候LGWR就開始等待log file parallel write,OS寫完了通知LGWR,中止log file parallel write等待,接著LGWR通知a,中止log file sync等待  --- 這就是上述兩種等待的區別。

有上面這個形象的例子,可以明白等待事件log file sync和log file parallel write是同時存在的,均是等待LGWR程式將log buffer中的redo entries寫入online redo log的完成。

當 一個前臺程式(或使用者會話)進行提交(commit)或回滾(rollback)時,這個會話的redo資訊就需要被刷入redo log file中。且該回話會通知LGWR將所有需要的redo entries寫入redo log file。當LGWR寫入完成後,又會返回使用者會話一個確認資訊,以表明redo entries已全部安全的寫入到了磁碟。

log file sync的引數有:

P1 = buffer#

在log buffer中,所有變更到這個緩衝號的重做條目都必須被重新整理到磁碟,且保證所有已提交的事務被確認寫入,即使發生instance crash,也不會影響到已提交的事務,因此log file sync等待事件就是等待直到緩衝號為buffer#的redo entries均被寫入到了磁碟。

P2 = Not used

P2 = Not used

通常發生log file sync等待事件是由於LGWR寫入緩慢或者應用程式的提交操作過於頻繁。可以透過如下措施幫助減少log file sync等待:

1、將online redo log file放在最快的磁碟上,例如該磁碟不允許配置RAID 5,因為RAID 5對於頻繁寫入操作效能較差。

2、採用批次提交的方式。

3、 在Oracle 10gR2中,commit命令增加了WRITE子句來控制在commit操作期間,redo寫入redo log file的方式和程度。WRITE子句的作用只是為了提高效能,安全方面會被降低,因為可能會造成提交的事務卻沒被寫入redo log file而丟失資料。
Oracle文件中是這樣描述commit語句的write子句的:
COMMIT;
COMMIT WRITE WAIT; --&gt The commit command is synchronous. It doesn't return until the relevant redo information is written to the online redo log.
COMMIT WRITE NOWAIT; --&gt The commit command is asynchronous. It can return before the relevant redo information is written to the online redo log.
COMMIT WRITE BATCH; --&gt The commit command is synchronous. It doesn't return until the relevant redo information is written to the online redo log.
COMMIT WRITE IMMEDIATE; --&gt The commit "prods" the LGWR process by sending a message, so that the redo is written immediately to the redo logs.

上面這種方式是要透過修改程式程式碼實現的,如果想避免修改程式程式碼,也可以在session級別或system級別透過引數COMMIT_WRITE實現,如:

SQL> alter [system | session] set COMMIT_WRITE=’IMMEDIATE,NOWAIT’;

也可以透過觸發器來監視當某使用者的應用程式執行時進行COMMIT_WRITE引數的設定:

SQL> CREATE OR REPLACE TRIGGER sys.global_commit_session_settings ALTER LOGON ON .SCHEMA
BEGIN
execute immediate ‘alter session set COMMIT_WRITE=”IMMEDIATE,NOWAIT”’
END;
/

需要注意的是:如果使用了此選項,一旦資料庫例項失敗(CRASH),儘管是已被提交的事務,也會丟失沒有被寫入到redo log file中的資料,請慎用。

4、使用NOLOGGING或UNRECOVERABLE選項。

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

相關文章