在oracle中跟蹤會話執行語句的幾種方法
生成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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 後臺執行SQL語句(oracle)SQLOracle
- Oracle:select 或 inactive 會話語句產生鎖?Oracle會話
- java連線oracle執行sql語句JavaOracleSQL
- 在Oracle裡提高SQL執行效率的三種方法NQOracleSQL
- Linux 技巧:讓程式在後臺可靠執行的幾種方法Linux
- 四種會話追蹤技術會話
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- ThinkPHP 列印 sql 語句的幾種方式PHPSQL
- python:return之後的語句還會執行嗎Python
- 在本地執行 LLMs 的 6 種方法
- finally語句在return執行之後,return返回之前執行
- 一條SQL語句在MySQL中如何執行的MySql
- oracle常用後臺程序及sql語句執行流程OracleSQL
- sql語句如何執行的SQL
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- PostgreSQL 原始碼解讀(15)- Insert語句(執行過程跟蹤)SQL原始碼
- 【Java】面試官靈魂拷問:if語句執行完else語句真的不會再執行嗎?Java面試
- 如何制定專案執行計劃的幾種方法
- mySQL 執行語句執行順序MySql
- 一條sql語句在mysql中是如何執行的MySql
- 一條 SQL 語句在 MySQL 中是如何執行的?MySql
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- php有幾種流程控制語句PHP
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- 怎樣在sqlite3上執行SQL語句SQLite
- 檢視SQL執行計劃的幾種常用方法YQSQL
- Python中執行系統命令常見的幾種方法Python
- 在 Ruby 中執行 Shell 命令的 6 種方法
- 在 Windows 中執行 Linux 命令的 4 種方法WindowsLinux
- Oracle中獲取TABLE的DDL語句的方法Oracle
- 會話中,如何將訪客轉化為客戶的幾種方法會話
- [oracle] 查詢歷史會話、歷史執行計劃Oracle會話