Oracle sql trace用法


sql_trace是oracle提供的一個非常好的跟蹤工具,主要用來檢查數據庫的異常情況,通過跟蹤數據庫的活動,找到有問題的語句。

一、概述:
    SQL_TRACE是Oracle的一個非常強大的工具。打開SQL_TRACE就可以逐步捕獲任何一個會話的數據庫活動,或者捕獲整個數據庫的活動,並將數據庫活動記錄成跟蹤文件。每次使用完之后需要關閉跟蹤,否則會降低系統的性能。
    SQL_TRACE可以幫助診斷許多問題,其中包括:

二、用法:
   1、文件跟蹤的分類:
      跟蹤DBA可以采用兩種方式進行跟蹤:
    . 跟蹤整個數據庫實例。只需要簡單的修改參數文件(pfile/spfile)參數 SQL_TRACE = TRUE ,然后重新啟動數據庫即可。在全局啟用SQL_TRACE會導致所有進程的活動被跟蹤,包括后台進程及所有用戶進程,這樣也會數據庫導致性能下降比較明顯。
    . 會話級跟蹤。SQL_TRACE的通常使用方式是僅跟蹤一個會話。被跟蹤的會話可以是您自己的,也可以是其它用戶的會話。如果是自己的會話,只需要在SQL*PLUS中運行一下命令即可:
      SQL> alter session set sql_trace = true;
      類似的如果取消對會話的跟蹤,運行一下命令:
      SQL> alter session set sql_trace = false;
     
      如果需要跟蹤一個特定的會話,首先需要獲取會話的SID和Serial#,這些信息可以在視圖V$SESSION中獲得,一旦知道了這兩個參數,就可以運行一下命令:
      SQL> execute SYS.dbms_system.set_sql_trace_in_session(13,9,true);
      同樣也可以使用這個過程關閉會話跟蹤:
    SQL> execute SYS.dbms_system.set_sql_trace_in_session(13,9,false);
 
  2、跟蹤文件的位置:
     一旦為會話激活了SQL_TRACE,ORACLE就會在udump管理區創建跟蹤文件,文件的目標位置由參數user_dump_dest來確定。每個 操作都不會覆蓋原來的文件,新的跟蹤記錄將會被追加到文件末尾。通常情況下,可以根據文件的修改時間判斷目錄下哪個文件是最新的文件。
   SQL> show parameter user_dump_dest;
  
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- ------------------------------
   user_dump_dest                       string      d:oracleadminora9iudump
  
   也可以通過以下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 ;

   TRACE_FILE_NAME
   --------------------------------------------------------------------------------
  
   d:oracleadminora9iudumpora9i_ora_2060.trc  
 
 3、計時信息:
    為了最大限度的利用跟蹤文件,應該打開計時標志,通過參數TIMED_STATISTICTS=TRUE進行設置,這樣可以對每個SQL語句的執行時間等進行記錄,這個功能對系統性能的負擔很小。
    打開會話的計時信息:
    SQL> alter session set timed_statistics = true ;
    打開數據庫系統的計時信息
    SQL> alter system set timed_statistics = true ;
 
 4、TKPROF:
    通過前三步的設置已經知道如何生成SQL跟蹤文件了,ORACLE生成的跟蹤文件閱讀起來很困難(也就是易讀性很差),可以看跟蹤文件的一部分,執行以下SQL語句:
   SQL> select count(*) from sys_dept;
  
    COUNT(*)
   ----------
          16   
   執行完后,查看跟蹤文件中這個語句的內容如下:
   
    PARSING IN CURSOR #1 len=31 dep=0 uid=62 oct=3 lid=62 tim=14727407741 hv=2200985491 ad='128e3820'
   select count(*) from sys_dept
   END OF STMT
   PARSE #1:c=0,e=16348,p=1,cr=31,cu=0,mis=1,r=0,dep=0,og=4,tim=14727407735
   EXEC #1:c=0,e=24,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727407814
   FETCH #1:c=0,e=15641,p=5,cr=7,cu=0,mis=0,r=1,dep=0,og=4,tim=14727423807
   =====================
   PARSING IN CURSOR #2 len=61 dep=0 uid=62 oct=47 lid=62 tim=14727508742 hv=3517412409 ad='12bbcff4'
   begin :id := sys.dbms_transaction.local_transaction_id; end;
   END OF STMT
   PARSE #2:c=0,e=122,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727508735
   EXEC #2:c=0,e=144,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=14727508945
   =====================
   PARSING IN CURSOR #2 len=61 dep=0 uid=62 oct=47 lid=62 tim=14727587562 hv=3517412409 ad='12bbcff4'
   begin :id := sys.dbms_transaction.local_transaction_id; end;
   END OF STMT
   PARSE #2:c=0,e=121,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727587556
   EXEC #2:c=0,e=97,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=14727587721
  
   這樣不僅閱讀麻煩,並且也有很多內容難以理解。ORACLE提供了一個格式化跟蹤文件的工具 - TKPROF( Transient Kernel Profiler ),通過這個工具能將SQL文件轉化為分析人員容易理解的格式。
   
    一般TKPROF工具的使用的簡單方法,只用到了兩個關鍵字:跟蹤文件名和輸出文件名 (TKPROF的具體請參閱其他資料):
    TKPROF <trace file> <output file>
   
    在命令行模式下運行(數據庫在window2000下安裝的)
    C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt
   
    執行完后,在reprot.txt中查詢剛才的語句內容如下:
    select count(*)
   from
   sys_dept
 
 
   call     count       cpu    elapsed       disk      query    current        rows
   ------- ------  -------- ---------- ---------- ---------- ----------  ----------
   Parse        1      0.00       0.01          1         31          0           0
   Execute      1      0.00       0.00          0          0          0           0
   Fetch        1      0.00       0.01          5          7          0           1
   ------- ------  -------- ---------- ---------- ---------- ----------  ----------
   total        3      0.00       0.03          6         38          0           1
  
   Misses in library cache during parse: 1
   Optimizer goal: CHOOSE
   Parsing user id: 62     
 
   通過設置tkprof的關鍵字[EXPLAIN = <username/password>],也可以在跟蹤文件中增加SQL語句的執行計划:
  C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt explain=test/test;  
  
  ********************************************************************************
 
  select count(*)
  from
   sys_dept
 
 
  call     count       cpu    elapsed       disk      query    current        rows
  ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  Parse        2      0.00       0.01          1         31          0           0
  Execute      2      0.00       0.00          0          0          0           0
  Fetch        2      0.00       0.01          5         14          0           2
  ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  total        6      0.00       0.03          6         45          0           2
 
  Misses in library cache during parse: 1
  Optimizer goal: CHOOSE
  Parsing user id: 62 
 
  Rows     Row Source Operation
  -------  ---------------------------------------------------
        1  SORT AGGREGATE
       16   TABLE ACCESS FULL SYS_DEPT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM