【DB筆試面試688】在Oracle中,跟蹤會話執行語句的方法有哪幾種?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

數據庫

題目部分api

在Oracle中,跟蹤會話執行語句的方法有哪幾種?session

     

oracle

答案部分
app

由於TRACE的目標範圍不一樣,因此致使必須使用不一樣的方法。若做用於數據庫全局的,則改初始化參數。若只做用於當前會話的,則就用ALTER SESSION命令。若做用於其它會話的,則就用DBMS_SYSTEM包。ide

① SQL_TRACE參數設置:很是傳統的方法工具

SQL_TRACE能夠做爲初始化參數在全局啓用,也能夠經過命令行方式在具體會話啓用。在參數文件(PFILE/SPFILE)中指定:SQL_TRACE=TRUE或ALTER SYSTEM SET SQL_TRACE=TRUE;。性能

經過在全局啓用SQL_TRACE能夠跟蹤到全部後臺進程及全部用戶進程的活動,經過跟蹤文件的實時變化,能夠清晰地看到各個進程之間的緊密協調。須要注意的是,在全局啓用SQL_TRACE會產生大量trace文件,很容易耗盡磁盤空間,這一般會致使比較嚴重的性能問題,因此在生產環境中要謹慎使用,而且及時關閉。命令行

在大多數時候使用SQL_TRACE跟蹤的都是當前會話的進程。經過跟蹤當前進程能夠發現當前操做的後臺數據庫遞歸活動,這在研究數據庫新特性時尤爲有效,在研究SQL執行,發現後臺錯誤等方面也很是有用。debug

在會話級啓用和中止SQL_TRACE的方式以下所示:

啓用當前SESSION的跟蹤:

1SQL> ALTER SESSION SET SQL_TRACE=TRUE;
2Session altered.

此時的SQL操做將被跟蹤:

1SQL> SELECT COUNT(*) FROM DBA_USERS;
2  COUNT(*)
3----------
4        44

結束跟蹤:

1SQL> ALTER SESSION SET SQL_TRACE=FALSE;
2Session altered.

在不少時候須要跟蹤其餘用戶的進程,而不是當前用戶,這能夠經過Oracle提供的系統包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION來完成。

經過V$SESSION能夠得到SID、SERIAL#等信息,得到進程信息,選擇須要跟蹤的進程:

 1SQL> col spid for a8
 2SQL> col spid for a10
 3SQL> col username for a10
 4SQL> col tracefile for a80
 5SQL> SELECT S.INST_ID, S.SID, S.SERIAL#, P.SPID, S.USERNAME, P.TRACEFILE
 6  2    FROM GV$SESSION S, GV$PROCESS P
 7  3   WHERE P.ADDR = S.PADDR
 8  4     AND S.INST_ID = P.INST_ID
 9  5     AND S.USERNAME IS NOT NULL;
10   INST_ID        SID    SERIAL# SPID       USERNAME   TRACEFILE
11---------- ---------- ---------- ---------- ---------- ---------------------------------------------------------------------------
12         1        144        293 37302      SYS        /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37302_lhr.trc
13         1        146       1557 37340      SYS        /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37340.trc
14         1         26        321 37380      LHR        /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37380.trc
15         1        152       3243 37400      SYS        /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37400.trc

設置跟蹤SID爲26的會話:

1SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(26,321,TRUE);
2PL/SQL procedure successfully completed.

能夠等候片刻,等待SID爲26的會話執行SQL,完成後,中止跟蹤:

1SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(26,321,FALSE);
2PL/SQL procedure successfully completed.

② 使用10046事件

全局設定:參數文件中指定:EVENT="10046 TRACE NAME CONTEXT FOREVER,LEVEL 12"

或者:

1SQL> ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';--啓用
2SQL> ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT OFF';--關閉

當前會話設定:

1SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
2SQL> --執行SQL語句
3SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';

在Oracle 11g中還能夠對單個SQL打開10046事件跟蹤,命令以下所示:

1ALTER SYSTEM SET EVENTS 'SQL_TRACE [SQL:&&SQL_ID] WAIT=TRUE,BIND=TRUE,PLAN_STAT=ALL_EXECUTIONS,LEVEL=12';

關閉單個SQL的跟蹤命令以下所示:

1ALTER SYSTEM SET EVENTS 'SQL_TRACE [SQL:&&SQL_ID] OFF';

若要針對每一個新鏈接的會話生成10046跟蹤文件,則可使用登陸觸發器。以下的代碼是跟蹤LHR用戶的信息,在用戶LHR登陸數據庫系統時會啓動10046跟蹤。

1CREATE OR REPLACE TRIGGER TRI_SET_TRACE_LHR
2AFTER LOGON ON DATABASE
3WHEN (USER IN ('LHR'))
4DECLARE
5BEGIN
6    EXECUTE IMMEDIATE 'ALTER SESSION SET STATISTICS_LEVEL=ALL';
7    EXECUTE IMMEDIATE 'ALTER SESSION SET MAX_DUMP_FILE_SIZE=UNLIMITED';
8    EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 TRACE NAME CONTEXT FOREVER, LEVEL 12''';
9END TRI_SET_TRACE_LHR;

③ DBMS_SESSION包:只能跟蹤當前會話,不能指定會話

跟蹤當前會話:

1SQL> EXEC DBMS_SESSION.SET_SQL_TRACE(TRUE);
2SQL> 執行SQL
3SQL> 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';」語句:

1SQL> EXEC DBMS_SESSION.SESSION_TRACE_ENABLE(WAITS=>TRUE,BINDS=>TRUE);
2SQL> 執行SQL
3SQL> EXEC DBMS_SESSION.SESSION_TRACE_DISABLE();

④ DBMS_SYSTEM包

使用DBMS_SYSTEM.SET_EV設置10046事件:

1SQL> EXEC DBMS_SYSTEM.SET_EV(SID,SERIAL#,10046,12,'');--啓用跟蹤
2SQL> EXEC DBMS_SYSTEM.SET_EV(SID,SERIAL#,10046,0,'');--結束跟蹤

⑤ DBMS_MONITOR包

該包是從Oracle 10g開始提供的,功能很是強大。可在模塊級別、動做級別、客戶端級別、數據庫級別、會話級別進行跟蹤,Oracle官方支持。

跟蹤當前會話:

1SQL> EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE;
2SQL> --執行SQL
3SQL> EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE;

跟蹤其餘會話:

1SQL>EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(SESSION_ID=>SID,SERIAL_NUM=>SERIAL#,WAITS=>TRUE,BINDS=>TRUE);
2SQL> --執行SQL
3SQL>EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(SESSION_ID=>SID,SERIAL_NUM=>SERIAL#);

⑥ oradebug

這是SQL*Plus的工具,須要提供OSPID或者Oracle PID。

跟蹤當前會話:

 1SQL> oradebug setmypid;
 2Statement processed.
 3SQL> oradebug unlimit;
 4Statement processed.
 5SQL> oradebug event 10046 trace name context forever,level 12;
 6Statement processed.
 7SQL> 執行SQL
 8SQL> oradebug tracefile_name
 9SQL> oradebug event 10046 trace name context off;
10Statement processed.

跟蹤其餘會話:

1SQL> select spid,pid2  from v$process
2  2  where addr in (select paddr from v$session where sid=(select distinct sid from v$mystat));
3SPID                PID
4------------ ----------
51457                 313
6SQL> oradebug setospid 1457;
7Statement processed.

或者:

1SQL> oradebug setorapid 313;
2Statement processed.
3SQL> oradebug unlimit;
4Statement processed.
5SQL> oradebug event 10046 trace name context forever,level 12;
6Statement processed.
7SQL> oradebug tracefile_name
8SQL> oradebug event 10046 trace name context off;
9Statement processed.

使用oradebug help能夠查看oradebug的命令幫助。

相關文章
相關標籤/搜索