在oracle中跟蹤會話執行語句的幾種方法

達芬奇的夢發表於2018-05-10

生成sql trace可以有以下幾種方式:
1、引數設定:非常傳統的方法。
系統級別:
引數檔案中指定: sql_trace=true
SQL> alter system set sql_trace=true;
注意:系統級別啟用sql_trace,會產生大量trace檔案,很容易耗盡磁碟空間,因此一般設定會話級別,並且及時關閉。
會話級別:
SQL> alter session set sql_trace=true;
SQL> 執行sql
SQL> alter session set sql_trace=false;
啟用跟蹤後,跟蹤檔案儲存在user_dump_dest下
可以使用下面的查詢來找到生成的跟蹤檔案
SQL> select
  2  d.value||'/'||lower(rtrim(i.instance,
  3  chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
  4  from ( select p.spid
  5  from v$mystat m,
  6  v$session s,v$process p
  7  where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
  8  ( select t.instance from v$thread  t,v$parameter v
  9  where v.name = 'thread' and
 10  (v.value = 0 or t.thread# = to_number(v.value))) i,
 11  ( select value from v$parameter
 12  where name = 'user_dump_dest') d
 13  /
 
 
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/oracle/admin/RLZY/udump/rlzy_ora_721532.trc
 
也可以給要生成的跟蹤檔案指定識別符號來讓你更容易的找到跟檔案
SQL> alter session set tracefile_identifier='jingyong';

2、使用10046事件:
10046事件級別:
Lv0  - 禁用sql_trace,等價於sql_trace=false
Lv1  - 啟用標準的sql_trace功能,等價於sql_trace=true
Lv4  - Level 1 + 繫結變數值(bind values)
Lv8  - Level 1 + 等待事件跟蹤(waits)
Lv12 - Level 1 + Level 4 + Level 8

全域性設定:
引數檔案中指定: event="10046 trace name context forever,level 12"
或者
SQL> alter system set events '10046 trace name context forever, level 12';
SQL> alter system set events '10046 trace name context off';
注意:系統級別啟用sql_trace,會產生大量trace檔案,很容易耗盡磁碟空間,因此一般設定會話級別,並且及時關閉。

當前session設定:
SQL> alter session set events '10046 trace name context forever, level 12';
SQL> 執行sql
SQL> alter session set events '10046 trace name context off';

3、dbms_session包:只能跟蹤當前會話,不能指定會話。
跟蹤當前會話:
SQL> exec dbms_session.set_sql_trace(true);
SQL> 執行sql
SQL> exec dbms_session.set_sql_trace(false);
dbms_session.set_sql_trace相當於alter session set sql_trace,從生成的trace檔案可以明確地看
alter session set sql_trace語句。
使用dbms_session.session_trace_enable過程,不僅可以看到等待事件資訊還可以看到繫結變數資訊,
相當於alter session set events '10046 trace name context forever, level 12';語句從生成的trace檔案可以確認。
SQL> exec dbms_session.session_trace_enable(waits=>true,binds=>true);
SQL> 執行sql
SQL> exec dbms_session.session_trace_enable(); 


4、dbms_support包:不應該使用這種方法,非官方支援。
系統預設沒有安裝這個包,可以手動執行$ORACLE_HOME/rdbms/admin/bmssupp.sql指令碼來建立該包
跟蹤當前會話:
SQL> exec dbms_support.start_trace
SQL> 執行sql
SQL> exec dbms_support.stop_trace
跟蹤其他會話:等待事件+繫結變數,相當於level 12的10046事件。
SQL> select sid,serial#,username from v$session where ...;
SQL> exec dbms_support.start_trace_in_session(sid=>sid,serial=>serial#,waits=>true,binds=>true);
SQL> exec dbms_support.stop_trace_in_session(sid=>sid,serial=>serial#);

5、dbms_system包:
跟蹤其他會話:
使用dbms_system.set_ev設定10046事件
SQL> select sid,serial#,username from v$session where ...;
SQL> exec dbms_system.set_ev(sid,serial#,10046,12,'');
SQL> exec dbms_system.set_ev(sid,serial#,10046,0,'');
但經過測試在10g中使用級別為8,12的跟蹤並沒有在跟蹤檔案中生產等待事件資訊

6、dbms_monitor包:10g提供,功能非常強大。可在模組級別、動作級別、客戶端級別、資料庫級別、會話級別進行跟蹤。oracle官方支援。
跟蹤當前會話:
SQL> exec dbms_monitor.session_trace_enable;
SQL> 執行sql
SQL> exec dbms_monitor.session_trace_disable;
跟蹤其他會話:
SQL> exec dbms_monitor.session_trace_enable(session_id=>sid,serial_num=>serial#,waits=>true,binds=>true);
SQL> exec dbms_monitor.session_trace_disable(session_id=>sid,serial_num=>serial#);

7、oradebug
這是sqlplus的工具,需要提供OSPID或者oracle PID。
跟蹤當前會話:
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug event 10046 trace name context forever,level 12;
Statement processed.
SQL> 執行sql
SQL> oradebug tracefile_name
SQL> oradebug event 10046 trace name context off;
Statement processed.
跟蹤其他會話:
SQL> select spid,pid2  from v$process
  2  where addr in (select paddr from v$session where sid=(select distinct sid from v$mystat));
SPID                PID
------------ ----------
1457                 313
SQL> oradebug setospid 1457;
Statement processed.
或者
SQL> oradebug setorapid 313;
Statement processed.
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug event 10046 trace name context forever,level 12;
Statement processed.
SQL> oradebug tracefile_name
SQL> oradebug event 10046 trace name context off;
Statement processed.

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

相關文章