<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


     
                            

    主站蜘蛛池模板: 无码永久免费AV网站| 三级黄色片免费看| 曰批视频免费40分钟试看天天| 亚洲七七久久精品中文国产| 日本亚洲高清乱码中文在线观看| 免费鲁丝片一级观看| 亚洲精品日韩一区二区小说| 精品国产免费一区二区| 国产精品亚洲五月天高清| 亚洲成a人片在线观看日本麻豆| 香蕉视频免费在线| 亚洲天堂免费在线视频| 黄色网页在线免费观看| 久久久久亚洲av无码专区蜜芽| 91精品国产免费久久国语麻豆| 亚洲最大免费视频网| 成人a视频片在线观看免费| 亚洲GV天堂无码男同在线观看| 亚洲国产成人久久精品99| 好湿好大好紧好爽免费视频| 亚洲AV第一页国产精品| 国产成人精品免费视| 亚洲精品乱码久久久久久蜜桃图片 | 国产成人免费高清激情视频| 亚洲乱码一区二区三区国产精品| 韩国18福利视频免费观看| 成年大片免费视频播放一级| 亚洲AV永久无码区成人网站| 免费观看黄色的网站| 国产成人综合亚洲| 国产精品亚洲一区二区三区在线 | 亚洲电影在线免费观看| 女性无套免费网站在线看| 一级片在线免费看| 亚洲国产精品热久久| 黄a大片av永久免费| 波多野结衣免费一区视频 | 亚洲av永久无码精品秋霞电影秋 | 美腿丝袜亚洲综合| 99久久久国产精品免费无卡顿| 国产精品亚洲专区在线播放|