1. 程式人生 > >ORACLE追蹤應用執行sql語句——10046事件

ORACLE追蹤應用執行sql語句——10046事件

追蹤軟體連結資料庫所執行的命令時我們可以使用toad,但是對於web應用toad不能夠完成跟蹤,所以可以利用10046事件進行解決。

介紹:

Oracle的10046事件,可以跟蹤應用程式所執行的SQL語句,並且得到其解析次數.執行次數,CPU使用時間等資訊。這對我們分析、定位資料庫效能問題是非常有用的。

10046event是oracle用於系統性能分析時的一個最重要的事件。當啟用這個事件後,將通知oracle kernel追蹤會話的相關即時資訊,並寫入到相應trace檔案中。這些有用的資訊主要包括sql是如何進行解析,繫結變數的使用情況,會話中發生的等待事件等

級別

10046event 可分成不同的級別(level),分別追蹤記錄不同程度的有用資訊。對於這些不同的級別,應當注意的是向下相容的,即高一級的trace資訊包含低於此級的所有資訊。

10046event的追蹤級別大致有:
level 1:跟蹤sql語句,包括解析、執行、提取、提交和回滾等。
level 4:包括變數的詳細資訊
level 8:包括等待事件
level 12:包括繫結變數與等待事件

其中,level 1相當於打開了sql_trace

前提條件:
(先確保要event的會話環境符合條件)
1、必須確保timed_statistics為TRUE,這個引數可以在會話級上進行修改。
2、為了確保trace輸出能夠完整進行,還要調整此會話對trace檔案大小的限制,一般將此限制取消,即將max_dump_file_size設定為UNLIMITED,或者設定為一個很大的闕值。

在滿足了上述條件後,就可以啟用10046event對會話進行後臺跟蹤了。

獲取當前會話SID

操作:

 1. a.machine 為連線oracle的機器名

select b.spid,a.sid,a.serial#,a.machine from v$session a,v$process b where a.paddr = b.addr and a.machine='yz';
PID                SID    SERIAL#  MACHINE

9497                 49       3406     yz

2、利用10046事件開始跟蹤

SQL>execute sys.dbms_system.set_ev(49, 3406,10046,1,''); 
PL/SQL procedure successfully completed.

、這時候你可以執行應用程式,對於web 應用你就可以開啟你認為效能比較差頁面。

4、如果你要檢視這段時間執行了哪些sql語句,可以執行下面的語句結束跟蹤

SQL>execute sys.dbms_system.set_ev(49,3406,10046,0,'');  

PL/SQL procedure successfully completed.

5、SQL trace 工具會收集這個過程中執行的SQL的效能狀態資料,記錄到一個跟蹤檔案中.這個跟蹤檔案提供了許多有用的資訊,例如解析次數.執行次數,CPU使用時間等。

6、這時候你可以通過下面的語句獲得產生的跟蹤檔案所在的目錄

SQL> select value from v$parameter where name = 'user_dump_dest';

VALUE

--------------------------------------------------------------------------------

/opt/oracle/admin/ocn/udump

7、在/opt/oracle/admin/ocn/udump下找到yzoracle_ora_9497.trc。9497是你當前應用的spid。

8、注意yzoracle_ora_9497.trc是不可讀的,我們需要執行oracle的tkprof命令,將yzoracle_ora_9497.trc轉化為我們可讀的文字檔案。

tkprof  yzoracle_ora_9497.trc  yzoracle_ora_9497.sql

這樣你就可以在yzoracle_ora_9497.sql檔案中看到所有的sql語句執行次數,CPU使用時間等資料