ORACLE 10046 Trace

來源:互聯網
上載者:User
10046 trace的跟蹤等級

10046是一個Oracle的內部事件(event),通過設定這個事件可以得到Oracle內部執行系統解析、調用、等待、綁定變數等詳細的trace資訊,對於分析系統的效能有著非常重要的作用。

設定10046事件的不同層級能得到不同詳細程度的trace資訊,下面就列出各個不同層級的對應作用:

等級 二進位 作用
0 0000 無輸出
1 0001 輸出 ****,APPNAME(應用程式名稱),PARSING IN CURSOR,PARSE ERROR(SQL解析),EXEC(執行),FETCH(擷取資料),UNMAP,SORT UNMAP(排序,臨時段),ERROR,STAT(執行計畫),XCTEND(事務)等行
2 0011 與等級1完全一樣
4 0101 包括等級1的輸出,加上BIND行(綁定變數資訊)
8 1001 包括等級1的輸出,加上WAIT行(等待事件資訊)
12 1101 輸出等級1、等級4以及等級8的所有資訊

等級1的10046 trace被視為是普通的SQL Trace,而等級4、等級8以及等級12則被稱為Extended SQL Trace,Extended SQL Trace裡麵包括了最有用的WAIT資訊,因此在實際中也是用的最多的。

與SQL Trace相關的參數

在開啟10046時間的SQL Trace之前,要先設定好下面幾個參數。 timed_statistics 這個參數決定了是否收集與時間相關的統計資訊,如果這個參數為FALSE的話,那麼SQL Trace的結果基本沒有多大的用處,預設情況下這個參數設定為TRUE。 max_dump_file_size dump檔案的大小,也就是決定是否限制SQL Trace檔案的大小,在一個很忙的系統上面做SQL Trace的話可能會產生很多的資訊,因此最好在會話層級將這個參數設定成unlimited。 tracefile_identifier 給Trace檔案設定識別字串,這是個非常有用的參數,設定一個易讀的字串能更快的找到Trace檔案。

要在當前會話修改上述參數很簡單,只要使用下面的命令即可:

1 2 3 ALTER SESSION SET timed_statistics= true ALTER SESSION SET max_dump_file_size=unlimited ALTER SESSION SET tracefile_identifier='my_trace_session

當然,這些參數可以在系統層級修改的,也可以載入init檔案中或是spfile中,讓系統啟動時自動做全域設定。

要是在系統運行時動態修改別的會話的這些參數就需要藉助DBMS_SYSTEM這個包了,設定方法如下:

1 2 3 4 5 6 7 8 9 SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION(    :sid, :serial,    'timed_statistics' , true )   SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION(    :sid, :serial,    'max_dump_file_size' , 2147483647 )

注意,Oracle並沒有提供一個set_string_param_in_session的函數在dbms_system包中,因此tracefile_identifier是無法在別的會話中修改的(至少我到現在沒有找到一個可以設定的方法)。 10046 Trace啟動方法 開啟當前會話的10046 Trace 使用sql_trace參數

sql_trace應該是簡單快捷的開啟Trace的方法了,不過通過sql_trace只能開啟層級為1的Trace,而無法開啟其他更進階的Trace。

1 2 3 4 5 -- 開啟Trace ALTER SESSION SET sql_trace= true ;   -- 關閉Trace ALTER SESSION SET sql_trace= false ;
使用set event開啟Trace

使用set event開啟10046事件Trace是最常用的了。

1 2 3 4 5 -- 開啟層級為12的Trace,level後面的數字設定了Trace的層級 ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'   -- 關閉Trace,任何層級 ALTER SESSION SET EVENTS '10046 trace name context off'
開啟其他會話的10046 Trace 使用登陸觸發器開啟Trace

我們可以通過編寫登陸觸發器來開啟10046 Trace,使用這種方法開啟Trace的代碼和開啟當前會話的是一樣的,不同的就是這些開啟代碼是包含在一個after logon觸發器裡面的。

1 2 3 4 5 6 7 8 9 10 -- 代碼來自《Optimazing Oracle Performance》 P116 CREATE OR REPLACE TRIGGER trace_test_user AFTER LOGON ON DATABASE BEGIN    IF USER LIKE '%\_test' ESCAPE '\' THEN      EXECUTE IMMEDIATE ' ALTER SESSION SET timed_statistics= true ';      EXECUTE IMMEDIATE ' ALTER SESSION SET max_dump_file_size=unlimited ';      EXECUTE IMMEDIATE ' ALTER SESSION SET EVENTS '' 10046 trace name context forever, level 8 '' ';    END IF; END ; /
使用oradebug工具

使用oradebug工具必須要知道所要處理的進程的OS進程PID,OS PID可以使用下面的語句得到:

1 2 3 4 5 6 SELECT S.USERNAME,      P.SPID OS_PROCESS_ID,      P.PID ORACLE_PROCESS_ID FROM V$SESSION S, V$PROCESS P WHERE S.PADDR = P.ADDR      AND S.USERNAME = UPPER ( '&USER_NAME' );

得到PID之後就可以使用oradebug工具了,注意需要使用sysdba登陸到資料庫:

1 2 3 4 5 6 7 8 -- 假設9999為會話的OS PID oradebug setospid 9999; -- 設定Trace檔案大小 oradebug unlimit; -- 開啟層級為12的Trace oradebug event 10046 trace name context forever , level 12; --關閉trace Oradebug event 10046 trace name context off ;
使用DBMS_SYSTEM包

DBMS_SYSTEM包提供了兩個開啟10046 Trace的方法,一個是使用SET_SQL_TRACE_IN_SESSION過程,不過使用這個過程的效果和sql_trace是一樣的:

1 2 3 4 5 -- 開啟Trace EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(:sid, :serial#, true );   -- 關閉Trace EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(:sid, :serial#, false );

另一個方法是使用SET_EV過程,當然這個過程不僅僅用來設定10046事件,還能設定所有的其他的事件,使用方法為:

1 2 3 4 5 6 7 8 PROCEDURE SET_EV   Argument Name                  Type                    In / Out Default ?   ------------------------------ ----------------------- ------ --------   SI                             BINARY_INTEGER          IN   SE                             BINARY_INTEGER          IN   EV                             BINARY_INTEGER          IN   LE                             BINARY_INTEGER          IN   NM                             VARCHAR2                IN

使用例子:

1 2 3 4 5 -- 開啟level 12的Trace EXEC SYS.DBMS_SYSTEM.SET_EV(:sid, :serial, 10046, 12, '' );   -- 關閉Trace EXEC SYS.DBMS_SYSTEM.SET_EV(:sid, :serial, 10046, 0, '' );
使用DBMS_SUPPORT包

DBMS_SUPPORT包預設情況下並沒有包含在資料庫中,需要通過運行$ORACLE_HOME/rdbms/admin/dbmssupp.sql安裝之後才能使用。

可以DBMS_SUPPORT包來開啟自身進程或者是別的進程的Trace。

開啟自身進程:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -- 使用方法 DESC DBMS_SUPPORT   PROCEDURE START_TRACE   Argument Name                  Type                    In / Out Default ?   ------------------------------ ----------------------- ------ --------   WAITS                          BOOLEAN                 IN     DEFAULT   BINDS                          BOOLEAN                 IN     DEFAULT PROCEDURE STOP_TRACE   -- 執行個體 -- 開啟層級為12的Trace EXEC SYS.DBMS_SUPPORT.START_TRACE( true , true );   -- 關閉Tr

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.