SQL_Trace/10046事件

    SQL_TRACE是Oracle提供的用於進行SQL跟蹤的手段。在日常的數據庫問題診斷和解決中,SQL_TRACE是非常常用的方法。

    當某個應用比較慢時,可以使用SQL_TRACE或者10046事件對其應用跟蹤。然後可以通過對此跟蹤信息的分析,找出應用比較慢的原因。


SQL_TRACE:


    SQL_TRACE可以作爲初始化參數在整個數據庫啓用,也可以通過命令行方式在具體session啓用。

    

    數據庫級別:

        在整個數據庫啓用SQL_TRACE會導致所有進程的活動被跟蹤,包括後臺進程及所有用戶進程。效率緩慢,慎用。

--第1種
sql_trace =true

--第2種
alter system set sql_trace =true scope=spfile;

    

    Session級別:

        跟蹤當前session。

--開始session級trace跟蹤
alter session set sql_trace=true;

SELECT to_number('asdf') FROM dual;

--結束trace跟蹤
alter session set sql_trace=false;


    使用存儲過程:

        可以跟蹤其他用戶的進程,而並非當前用戶。

--DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION
--用以查詢sid,serial#
SELECT Sid, Serial#, Username
  FROM V$session
 WHERE Username IS NOT NULL;
 
--開始
Sys.Dbms_System.Set_Sql_Trace_In_Session(Sid       => &Sid,
                                         Serial#   => &Serial#,
                                         Sql_Trace => TRUE);

--結束
Sys.Dbms_System.Set_Sql_Trace_In_Session(Sid       => &Sid,
                                         Serial#   => &Serial#,
                                         Sql_Trace => FALSE);


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

    類似sql_trace,10046事件可以在全局設置,也可以在session級設置。


    數據庫級:

        此設置對所有用戶的所有進程生效、包括後臺進程。

        在參數文件中增加:

Event="10046 trace name context forever, level 12"

    

    Session級:

        通過alter session的方式修改,需要alter session的系統權限。

--開始
alter session set events '10046 trace name context forever, level 12';

--結束
alter session set events '10046 trace name context off';


    

    使用存儲過程:

        可以跟蹤其他用戶的進程,而並非當前用戶。

        

--Dbms_System.Set_Ev

--用以查詢sid,serial#
SELECT Sid, Serial#, Username
  FROM V$session
 WHERE Username IS NOT NULL;
 
 --開始
Sys.Dbms_System.Set_Ev(Si => &Sid,
                       Se => &Serial#,
                       Ev => &Event, --10046
                       Le => &Level, --1,4,8,12
                       Nm => &Name --隨便取名
                       );

--結束
Sys.Dbms_System.Set_Ev(Si => &Sid,
                       Se => &Serial#,
                       Ev => &Event, --10046
                       Le => 0, --0爲不跟蹤
                       Nm => &Nm);

        

獲取trace文件名:

    獲取默認文件名SQL如下:

--第1種
SELECT u_Dump.Value || '/' || Lower(Db_Name.Value) || '_ora_' ||
       V$process.Spid ||
       Nvl2(V$process.Traceid, '_' || V$process.Traceid, NULL) || '.trc' "Trace File"
  FROM V$parameter u_Dump
 CROSS JOIN V$parameter Db_Name
 CROSS JOIN V$process
  JOIN V$session
    ON V$process.Addr = V$session.Paddr
 WHERE u_Dump.Name = 'user_dump_dest'
   AND Db_Name.Name = 'db_name'
   AND V$session.Audsid = Sys_Context('userenv', 'sessionid');

--第2種
SELECT d.Value || '/' || Lower(Rtrim(i.Instance, Chr(0))) || '_ora_' ||
       p.Spid || '.trc' AS "trace_file_name"
  FROM (SELECT p.Spid
          FROM V$mystat m, V$session s, V$process p
         WHERE m.Statistic# = 1
           AND s.Sid = m.Sid
           AND p.Addr = s.Paddr) p,
       (SELECT t.Instance
          FROM V$thread t, V$parameter v
         WHERE v.Name = 'thread'
           AND (v.Value = 0 OR t.Thread# = To_Number(v.Value))) i,
       (SELECT VALUE
          FROM V$parameter
         WHERE NAME = 'user_dump_dest') d;

eg:

/data03/DEV4/db/9.2.0/admin/DEV4_mistest/udump/dev4_ora_9359834.trc


讀取當前session設置的參數:

    當通過alter session的方式設置了sql_trace,這個設置需要通過dbms_system.read_ev來獲取:

DBMS_SYSTEM.READ_EV(
iev IN BINARY INTEGER, --Event number; usually between 10000 and 10999
oev OUT BINARY INTEGER --Level at which the event is set; level=0 means the event is disabled
);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章