【新炬網路名師大講堂】關於LOG FILE SYNC的解惑
最近我收到一封郵件,有個同事管的一套系統出現很嚴重的log file sync,然後他透過DBA_HIST_ACTIVE_SESS_HISTORY想查詢是什麼語句導致的這麼嚴重的等待。最後查詢出來的結果讓他大吃一驚。在他關注的那幾分鐘內。有很多程式在等待log file sync,這些語句的SQL_ID是select。他提出了兩個疑問,send email給我。那麼我們來看看他提出的兩個問題。
一、為什麼select 語句也會遇到log file sync?
二、如何找出真正造成log file sync的語句?
首先,在回答這兩個問題之前,我們要先要了解一下log file sync產生的原因。這裡我拿出Tanel Pader大師的一副圖來。
如圖所示,Log file sync是分成6部分的。
√ 前臺程式,也就是使用者程式發起一個提交或者回滾的操作。
√ 前臺程式會通知Lgwr去寫日誌。
√ LGWR會進行物理寫的系統呼叫。
√ 物理寫呼叫完成。
√ LGWR通知前臺程式寫入操作已完成。
√ 前臺程式顯示提交已經完成。
我們的步驟1-6是log file sync的過程,在3-4是log file parallel write的過程。所以log file sync包含了log file parallel write這個過程。弄明白log file sync是如何發生的之後,我們在來談談它的觸發機制。
只要進行提交,就會產生log file sync。
√ 使用者程式提交。
√ DDL操作,我們執行了一些事務,然後執行一個DDL,他會隱式的進行提交。
√ 某些操作遞迴產生對資料字典的DML操作。
當然回滾也會產生log file sync
√ 使用者程式回滾,發起rollback命令。
√ 事務回滾,一些程式遇到ORA-錯誤,kill session等等。
瞭解了這些機制後,我們來回答第一個問題,為什麼select 語句也會遇到log file sync?其實這個可能有三種情況。
第一種情況是因為檢視DBA_HIST_ACTIVE_SESS_HISTORY的資料是取樣獲得的,可能會話發起了DML語句,再發起SELECT語句,最後執行了提交。這種情況很普遍,按照正常人的思維都是執行一個Update之後,我們在檢視一下Update是否成功了,看到成功修改之後我們就提交。只不過在取樣的時候採到了Select語句,因為最後執行的COMMIT這種語句是不會出現在SQL_ID當中的。
第二種情況是因為Select會產生延遲塊清除。如果一個事務commit後,由於某些block在commit之前已經寫回datafile, 或者事務影響到的block數過多,則commi的時候只會清理undo segment header中的事務表資訊,data block上的事務標誌不會清除,否則代價過高。那麼在下一次讀取這些block時,需要將這些事務標誌進行清除,就是延遲塊清除。延遲塊清除也是需要Lgwr寫redo的。
第三種情況是構造CR塊,在我們執行了一個DML語句之後,我們另外一個會話再執行查詢的操作,它會在記憶體中構造CR塊,構造CR會在記憶體中對塊進行修改,所以它會透過Lgwr記錄到redo log當中。
這就解釋了我們Select會產生log file sync的一個原因。至於第二個問題,如何找出引起log file sync的語句?我覺得這個根本就沒有必要去找。我們解決log file sync的思路是要判斷產生的原因。這個我推薦大家去看MOS上的文件。Troubleshooting: “log file sync” Waits (Doc ID 1376916.1)。這篇文件會告訴你從哪裡入手去判斷log file sync產生的原因。我們並不能簡單的因為幾個語句,就說它產生了log file sync,畢竟文件中提到了也會有I/O效能的問題,CPU爭用導致寫完redo之後LGWR無法post前臺程式,提交過於頻繁,redo log太小。log buffer過小等等,這些都有可能造成log file sync。所以最重要的還是先把這篇文件通讀一遍,按照上面的思路去進行處理。我相信只要你按照文件中的思路去找,一定會找出一些蛛絲馬跡出來。就算是一些疑難雜症,我們也還是可以透過Tanel Pader大師的snapper指令碼對LGWR各種等待進行測量。最終定位出問題。
參考文件:
Troubleshooting: “log file sync” Waits (Doc ID 1376916.1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29960155/viewspace-1362360/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【新炬網路名師大講堂】weblogic整合ejbWeb
- 【新炬網路名師大講堂】關於IMSI/MSISDN/IMEI的介紹
- 【新炬網路名師大講堂】SOA套件介紹套件
- 【新炬網路名師大講堂】總結和結論
- 【新炬網路名師大講堂】關於Oracle 12c Flex ASM特性的理解OracleFlexASM
- 【新炬網路名師大講堂】j2ee與weblogic簡介Web
- 【新炬網路名師大講堂】svn在linux下的使用Linux
- 【新炬網路名師大講堂】TUXEDO的配置最佳化之路一UX
- 【新炬網路名師大講堂】TUXEDO的配置最佳化之路二UX
- 【新炬網路名師大講堂】初識mysql的體系結構MySql
- 【新炬網路名師大講堂】Oracle中的回收站(Recycle Bin)Oracle
- 【新炬網路名師大講堂】Oracle Database 12c 新特性總結OracleDatabase
- 【新炬網路名師大講堂】Data Guard–物理主備庫切換
- 【新炬網路名師大講堂】cursor: pin S wait on X模擬AI
- 【新炬網路名師大講堂】clone oracle 12c pluggable databasesOracleDatabase
- 【新炬網路名師大講堂】GoldenGate的ADD SCHEMATRANDATA命令研究Go
- 【新炬網路名師大講堂】AIX上的配置網路調優引數AI
- 【新炬網路名師大講堂】12c新特性:備份CDBs和PDBs
- 【新炬網路名師大講堂】12c新特性:使用RMAN連線CDB
- 【新炬網路名師大講堂】Oracle 11g rac 刪除節點Oracle
- 【新炬網路名師大講堂】oracle application server之核心技術opmnOracleAPPServer
- 【新炬網路名師大講堂】RAC環境下SYSDATE返回錯誤時間
- 【新炬網路名師大講堂】不同資料庫取前幾條記錄資料庫
- 【新炬網路名師大講堂】Oracle小知識- Oracle KILLED會話的釋放Oracle會話
- 【新炬網路名師大講堂】CBO中”與NULL在cardinality計算上的差別Null
- 【新炬網路名師大講堂】MySQL複製與監控系列文章(1)——篇首MySql
- 【新炬網路名師大講堂】WAS控制檯資料來源資訊無故丟失
- 【新炬網路名師大講堂】有限條件下怎樣做好恢復演練
- 【新炬網路名師大講堂】理解TimesTen錯誤日誌資訊”waiting for latch”AI
- 【新炬網路名師大講堂】DATABASE REPLAY加壓播放引數之SCALE_UP_MULTIPLIERDatabase
- 【新炬網路名師大講堂】12c高可用新特性what-if command evaluation介紹
- 【新炬網路名師大講堂】記一次打PSU遇到的Copy failed的問題AI
- 【新炬網路名師大講堂】有關DBLINK操作的語句執行機制及最佳化方式
- 【新炬網路名師大講堂】11gR203 RAC一個比較嚴重的bug
- 【新炬網路名師大講堂】O2O同步實施涉及的變更V1.0
- 【新炬網路名師大講堂】在AIX機器上使用xlc編譯c的動態庫AI編譯
- 【新炬網路名師大講堂】TimesTen記憶體碎片(高水位)回收步驟詳解記憶體
- 【新炬網路名師大講堂】軟體測試中常見問題與解決辦法