<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 310, comments - 6939, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    轉載:使用SQL_TRACE進行數據庫診斷

    Posted on 2008-06-10 20:20 詩特林 閱讀(394) 評論(0)  編輯  收藏 所屬分類: Oracle

    使用SQL_TRACE進行數據庫診斷

    鏈接:http://www.eygle.com/archives/2004/10/use_sql_trace_to_diagnose_database.html
    --------------------------------------------------------------------------------

    SQL_TRACE是Oracle提供的用于進行SQL跟蹤的手段,是強有力的輔助診斷工具.在日常的數據庫問題診斷和解決中,SQL_TRACE是非常常用的方法。
    本文就SQL_TRACE的使用作簡單探討,并通過具體案例對sql_trace的使用進行說明.

     

    一、 基礎介紹

    (a) SQL_TRACE說明

    SQL_TRACE可以作為初始化參數在全局啟用,也可以通過命令行方式在具體session啟用。
    1. 在全局啟用
    在參數文件(pfile/spfile)中指定:


    sql_trace =true

    在全局啟用SQL_TRACE會導致所有進程的活動被跟蹤,包括后臺進程及所有用戶進程,這通常會導致比較嚴重的性能問題,所以在生產環(huán)境
    中要謹慎使用.
    提示: 通過在全局啟用sql_trace,我們可以跟蹤到所有后臺進程的活動,很多在文檔中的抽象說明,通過跟蹤文件的實時變化,我們可以清晰
    的看到各個進程之間的緊密協(xié)調.

    2. 在當前session級設置
    大多數時候我們使用sql_trace跟蹤當前進程.通過跟蹤當前進程可以發(fā)現當前操作的后臺數據庫遞歸活動(這在研究數據庫新特性時尤其有效),
    研究SQL執(zhí)行,發(fā)現后臺錯誤等.
    在session級啟用和停止sql_trace方式如下:


     

    啟用當前session的跟蹤:
    SQL> alter session set sql_trace=true;

    Session altered.

    此時的SQL操作將被跟蹤:
    SQL> select count(*) from dba_users;

      COUNT(*)
    ----------
            34
    結束跟蹤:
    SQL> alter session set sql_trace=false;

    Session altered.
           


    3. 跟蹤其他用戶進程
    在很多時候我們需要跟蹤其他用戶的進程,而不是當前用戶,這可以通過Oracle提供的系統(tǒng)包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
    來完成

    SET_SQL_TRACE_IN_SESSION過程序要提供三個參數:


    SQL> desc dbms_system

    PROCEDURE SET_SQL_TRACE_IN_SESSION
     Argument Name                     Type                    In/Out Default?
     ------------------------------           -----------------------   ------ --------
     SID                               NUMBER                  IN
     SERIAL#                          NUMBER                  IN
     SQL_TRACE                        BOOLEAN                 IN

     

    通過v$session我們可以獲得sid、serial#等信息:

    獲得進程信息,選擇需要跟蹤的進程:

    SQL> select sid,serial#,username from v$session
      2  where username is not null;

           SID    SERIAL#  USERNAME
    ---------- ---------- ------------------------------
             8       2041  SYS
             9        437  EYGLE

    設置跟著:
    SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)

    PL/SQL procedure successfully completed.

    ….
    可以等候片刻,跟蹤session執(zhí)行任務,捕獲sql操作…
    ….

    停止跟蹤:
    SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)

    PL/SQL procedure successfully completed.
          
     


    (b) 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級設置。
    1. 在全局設置
    在參數文件中增加:


     

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

     
     

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

    2. 對當前session設置
    通過alter session的方式修改,需要alter session的系統(tǒng)權限:


     

    SQL> alter session set events '10046 trace name context forever';

    Session altered.

    SQL> alter session set events '10046 trace name context forever, level 8';

    Session altered.

    SQL> alter session set events '10046 trace name context off';

    Session altered.

          

    3. 對其他用戶session設置
    通過DBMS_SYSTEM.SET_EV系統(tǒng)包來實現:

     


    SQL> desc dbms_system
    ...
    PROCEDURE SET_EV
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     SI                             BINARY_INTEGER          IN
     SE                             BINARY_INTEGER          IN
     EV                             BINARY_INTEGER          IN
     LE                             BINARY_INTEGER          IN
     NM                             VARCHAR2                IN

    ...

                          

    其中的參數SI、SE來自v$session視圖:


    查詢獲得需要跟蹤的session信息:SQL> select sid,serial#,username from v$session where username is not null;SID SERIAL# USERNAME
    ---------- ---------- ------------------------------
    8 2041 SYS
    9 437 EYGLE


    執(zhí)行跟蹤:
    SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');

    PL/SQL procedure successfully completed.

    結束跟蹤:
    SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');

    PL/SQL procedure successfully completed.

     

    (c) 獲取跟蹤文件
    以上生成的跟蹤文件位于user_dump_dest目錄中,位置及文件名可以通過以下SQL查詢獲得:

     

    SQL> select  2    d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name  3  from  4    ( select p.spid  5      from sys.v$mystat m,sys.v$session s,sys.v$process p  6      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,  7    ( select t.instance from sys.v$thread  t,sys.v$parameter  v  8      where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,  9    ( select value from sys.v$parameter where name = 'user_dump_dest') d 10  /

    TRACE_FILE_NAME
    --------------------------------------------------------------------------------
    /opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc


     
                            


    (d) 讀取當前session設置的參數
    當我們通過alter session的方式設置了sql_trace,這個設置是不能通過show parameter的方式得到的,我們需要通過dbms_system.read_ev來獲取:

     

    SQL> set feedback offSQL> set serveroutput on SQL> declare
    2 event_level number;
    3 begin
    4 for event_number in 10000..10999 loop
    5 sys.dbms_system.read_ev(event_number, event_level);
    6 if (event_level > 0) then
    7 sys.dbms_output.put_line(
    8 'Event ' ||
    9 to_char(event_number) ||
    10 ' is set at level ' ||
    11 to_char(event_level)
    12 );
    13 end if;
    14 end loop;
    15 end;
    16 /
    Event 10046 is set at level 1


     
                            

    主站蜘蛛池模板: 亚洲国产成人综合| 亚洲国产精品成人综合久久久| 亚洲一区二区三区丝袜| 国产免费的野战视频| 亚洲最大视频网站| 国产无人区码卡二卡三卡免费| 亚洲日韩乱码久久久久久| 亚洲国产精品免费在线观看| 亚洲高清中文字幕| 美女网站免费福利视频| 亚洲一区二区三区成人网站 | 久久久久久久99精品免费观看| 国产精品亚洲片在线观看不卡 | 亚洲精品国产成人片| 一级毛片免费毛片一级毛片免费 | 暖暖在线日本免费中文| 免费国产a理论片| 亚洲精品夜夜夜妓女网 | 日韩高清免费在线观看| 日本视频免费观看| 亚洲精品~无码抽插| 久久国产精品成人片免费| 亚洲久悠悠色悠在线播放| 国产免费观看网站| 3344在线看片免费| 久久精品国产亚洲AV忘忧草18| 在线观看亚洲免费| 国产午夜无码精品免费看动漫| 亚洲性色成人av天堂| 国产免费观看网站| 国产高清不卡免费视频| 亚洲日韩国产AV无码无码精品 | 亚洲中文字幕无码中文字在线| 1000部拍拍拍18勿入免费视频下载| 精品亚洲456在线播放| 亚洲色图综合在线| 3344免费播放观看视频| 美女裸免费观看网站| 久久精品国产亚洲AV无码偷窥| 美女被免费视频网站a国产| a级毛片免费播放|