sql_trace/ 10046 整理

zecaro發表於2011-03-13

 sql_trace

sql_trace 在10G中是動態引數,之前的版本是靜態引數

1.
 在全域性啟用 在引數檔案(pfile/spfile)中指定:
sql_trace =true

在全域性啟用SQL_TRACE會導致所有程式的活動被跟蹤,包括後臺程式及所有使用者程式,這通常會導致比較嚴重的效能問題,所以在生產環境中要謹慎使用.

2.建議在session 級使用
在當前session級設定

alter session set sql_trace=TRUE;
alter session set sql_trace=false;

alter session set timed_statistics =TRUE

3. 跟蹤其他使用者程式
在很多時候我們需要跟蹤其他使用者的程式,而不是當前使用者,這可以透過Oracle提供的系統包D
BMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
來完成

SET_SQL_TRACE_IN_SESSION過程式要提供三個引數:

SQL> desc dbms_system
...
PROCEDURE SET_SQL_TRACE_IN_SESSION
Argument Name                     Type                    In/Out Default?
------------------------------           -----------------------   ------ --------
SID                               NUMBER                  IN
SERIAL#                          NUMBER                  IN
SQL_TRACE                        BOOLEAN                 IN
...


透過v$session我們可以獲得sid、serial#等資訊:

獲得程式資訊,選擇需要跟蹤的程式:

SQL> select sid,serial#,username from v$session
  2  where username is not null;

       SID    SERIAL#  USERNAME
---------- ---------- ------------------------------
         8       2041  SYS
         9        437  EYGLE

設定跟著:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)

PL/SQL procedure successfully completed.

....
可以等候片刻,跟蹤session執行任務,捕獲sql操作...
....

停止跟蹤:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)

PL/SQL procedure successfully completed.
     



10046

10046事件是Oracle提供的內部事件,是對SQL_TRACE的增強.


10046事件可以設定以下四個級別:
 
1 - 啟用標準的SQL_TRACE功能,等價於sql_trace
4 - Level 1 +繫結值(bind values)
 8 - Level 1 + 等待事件跟蹤
12 - Level 1 + Level 4 + Level 8

其中1相當於設定SQL_TRACE=TRUE之後的結果,4包括1的結果和繫結變數的實際值,8包括1的結果和等待事件的情況,12則同時包含1的結果,繫結變數的實際值和等待事件情況,所以可以說level 12是最為詳細的trace了。


類似sql_trace,10046事件可以在全域性設定,也可以在session級設定。

1. 在全域性設定

全域性設定 不建議開啟,影響效能
alter system set sql_trace=TRUE;
alter system set events '10046 trace name context forever, level 12';


 在全域性設定 在引數檔案中增加:

event="10046 trace name context forever,level 12"
此設定對所有使用者的所有程式生效、包括後臺程式.


2. 對當前session設定

10046事件跟蹤開啟等 當前會話
alter session set events '10046 trace name context forever';
alter session set events '10046 trace name context forever, level 8';
alter session set events '10046 trace name context forever, level 12';
alter session set events '10046 trace name context off';


3.對其他使用者session設定
透過DBMS_SYSTEM.SET_EV系統包來實現:



SQL> desc dbms_system
...
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

...

                     
其中的引數SI、SE、 NM對應v$session檢視sid,serial#,username
LE 表示TRACE級別,=0時表示跟蹤結束
EV表示跟蹤的事件型別

查詢獲得需要跟蹤的session資訊:
SQL> select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE


執行跟蹤:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');

結束跟蹤:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');



(c) 獲取跟蹤檔案
方法1 以上生成的跟蹤檔案位於user_dump_dest目錄中,位置及檔名可以透過以下SQL查詢獲得:


SQL> select
  d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
  from
    ( select p.spid
       from sys.v$mystat m,sys.v$session s,sys.v$process p
      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
    ( select t.instance from sys.v$thread  t,sys.v$parameter  v
        where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
   ( select value from sys.v$parameter where name = 'user_dump_dest') d



方法2
在日常工作中,我們經常需要對一些session進行跟蹤,如何快速獲取對應的trace檔案。方法很多。今天向大家推薦一個Oracle undocumented
alter session command .讓你"隨心所欲"的控制你的trace file檔名稱.

當然了,trace file 還是在引數user_dump_dest對應的目錄下生成。同時,可以在一個session中生成多個trace file

預設的檔名格式為:sid_ora_pid_traceid.trc 注:TRACEID就是你自己定義的識別符號

ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SESSION SET TRACEFILE_IDENTIFIER='TOMS';

Use V$PROCESS.TRACEID to check the setting.

SQL> select username, traceid from v$process where username='STUDY'

USERNAME        TRACEID
--------------- ----------
STUDY           TOMS

示例如下:
SQL> alter session set sql_trace=true;
會話已更改。

SQL> alter session set tracefile_identifier='toms';
會話已更改。

SQL> select sysdate from dual;

SYSDATE
--------------
20060615202501

SQL> alter session set tracefile_identifier='toms_other';
會話已更改。

SQL> select user from dual;

USER
------------------------------
SYS
SQL> alter session set sql_trace=false;

會話已更改。

D:adminstudyudump>dir *toms*.trc
驅動器 D 中的卷是 應用盤
卷的序列號是 F0A8-DF97

D:adminstudyudump 的目錄

2006-06-15 20:31 4,842 study_ora_3652_toms.trc
 

2006-06-15 20:31   702 study_ora_3652_toms_other.trc
2 個檔案 5,544 位元組
0 個目錄 26,398,515,200 可用位元組

D:adminstudyudump>
如果想取消上面的設定,只需要
alter session set tracefile_identifier='';
這樣以後再在這個session中生成的trace file就是傳統規則(sid_ora_pid.trc)的命名了.



(d) 讀取當前session設定的引數
當我們透過alter session的方式設定了sql_trace,這個設定是不能透過show parameter的方式得到的,我們需要透過dbms_system.read_ev來獲取:


SQL> set feedback off
SQL> set serveroutput on
SQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1


或者
declare lev integer;
    begin
   dbms_system.read_ev(10046,lev);
   dbms_output.put_line(lev);
   end;
   /

 
TKPROF 用於格式化trace檔案 ,詳見 tkprof 整理

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

相關文章