oracle 性能優化 07_診斷事件

1、診斷事件
    診斷事件無官方技術文檔支持,使用存在風險,慎用。使用診斷事件能夠獲取問題更多的信息,調整系統運行
特性,啓用某些內部功能。用於系統故障的診斷。跟蹤應用,改變系統運行模式。
1.DUMP分析
    immediate dump:
    alter session set events 'immediate trace name <dump> level <n>' # n標示trace詳細程度
        alter session set events 'immediate trace name controlf level 10';
    on-error dump:一般在參數文件中設置
    event = "<error> trace name errorstack level <n>" # error ORA-XXX,n詳細程度
        event = "60 trace name errorstack level 1" # 發生ORA-60錯誤時,產生1級信息
    變動運行特性:一般參數文件中設置
    event = "<event> trace name context forever, level <level>" #<event>指明要變動的特性
    event = "<event> trace name context forever, level <level>":參數,會話,系統級
    alter {session|system} set events '<event> trace name context forever, level <n>';
    tree dump:分析索引的結構和變化
    ALTER session set events 'immediate trace name treedump level <OBJECT_ID>';  #<OBJECT_ID>索引的ID
    SELECT object_id,object_name FROM user_objects WHERE object_name LIKE 'IDX_%'; 
參考資料:
http://blog.itpub.net/28507395/viewspace-1328056
http://blog.itpub.net/758322/viewspace-683573
2.常見故障
    實例或進程crash
    進程hang住
        分系統級和應用級,進程等待某資源沒法得到,經過等待性能視圖,hanganalyze
    非正常循環loop
    系統性能低
    looping:等待某個事件
    應用性能分析工具:event 10046 tkprof
2、常見事件分析
一、sql_trace: 將SQL執行的整個過程輸出到一個trace文件中,咱們能夠讀這個trace 文件來了解在這個SQL執行過程當中
           Oracle 都作了哪些操做。
使用過程:
a.設置trace文件標識,或使用語句查(如10053)
b.能夠經過語句和參數文件設置
    alter session set sql_trace=true;  #會話級
    alter database set sql_trace=true;  #實例級
    參數文件中配置sql_trace
c.執行相關SQL語句
d.關閉trace
    alter session[database] set sql_trace=false;
    sqlplus退出後自動關閉sql_trace;
e、利用oracle工具TKPROF格式化查看trace文件
    tkprof 工具只能用在處理SQL_TRACE和10046事件產生的trace,其餘事件如10053不能處理。
參數介紹:
    sys #默認值爲yes,輸出文件中是否包含以SYS用戶運行的sql語句。
    record #指定分析輸出記錄全部非遞歸sql文件如:record=c:\test.log,用tkprof格式化後
            大致瞭解跟蹤非遞歸SQL。有助於咱們重演SQL語句(綁定變量的不能夠)。
    aggregate #指定tkprof是否將一樣文本內容的sql聚合處理,參數爲默認爲no。
    sort #用來指定tkprof輸出文件裏sql語句的排序,默認是按照執行的前後順序排序,參數最
          常常用的方式sort=prsela,exeela,fchela,這三個值加起來就是響應時間,即按照響應
          時間排序。
    print #搭配sort一塊兒使用,用來指定tkprof輸出sql語句的數量。如輸出一個跟蹤文件裏響
           應時間排前十的SQL,sort=prsela,exeela,fchela print=10。
    explain #參數是爲每個SQL提供一個執行計劃。使用的方法是explain=用戶名/密碼
    wait #指定輸出文件是否包含等待事件,默認是包含的。通常都取默認值。    
查找Trace文件:
    默認開啓的環境下找會話的Trace文件,找到會話號,經過會話號,找到對應的trace文件
        select sid from v$mystat where rownum=1;
        select username,sid,serial#,paddr from v$session where username='SYSTEM';
        select spid from v$process where addr = (select paddr from v$session where sid=139);
        而後去udump目錄找到對應的Trace文件;
    跟蹤其餘用戶,查到用戶的spid,利用dbms_system.set_sql_trace_in_session(129,55,true)包  
        exec dbms_system.set_sql_trace_in_session(129,55,true);  #129 sid,55 serial#
        會話執行相關SQL
        exec dbms_system.set_sql_trace_in_session(129,55,false);  
TKPROF工具使用過程:
    tkprof  /u01/app/oracle/admin/ipemsdb/udump/ipemsdb_ora_17914.trc   
    /u01/app/17914.trc.txt  aggregate=yes sys=no waits=yes sort=prsela,
    exeela,fchela record=/u01/app/17914.sql
Trace文件結構解析:
    服務器執行的SQL語句;
    語句跟蹤統計信息;
    行源操做過程;
    彙總統計信息
統計信息各列說明:
CALL #每次SQL語句的處理都分紅三個部分。
Parse #這步將SQL語句轉換成執行計劃,檢查是否有正確的受權和所須要的對象是否存在。
Execute #這步是真正的由Oracle來執行語句。包括修改數據,和肯定選擇的記錄。
Fetch #返回查詢語句中所得到的記錄,這步只有select語句會被執行。
COUNT #這個語句被parse、execute、fetch的次數。
CPU  #這個語句對於全部的parse、execute、fetch所消耗的cpu的時間,以秒爲單位。
ELAPSED #這個語句全部消耗在parse、execute、fetch的總的時間。
DISK #物理讀取塊的數量。
QUERY #在一致性讀模式下,全部parse、execute、fetch所得到的buffer的數量。
CURRENT #在current模式下所得到的buffer的數量。
ROWS #全部SQL語句返回的記錄數目,可是不包括子查詢中返回的記錄數目。對於select語句,返
      回記錄是在fetch這步,對於insert、update、delete操做,返回記錄則是在execute這步。    
參考資料:http://ylw6006.blog.51cto.com/470441/895017/    sql

二、10046事件: 跟蹤會話執行的SQL語句,等待事件,經過TDPROF格式化trace
使用過程:
a.事件的4個級別:
    1  - 啓用標準的SQL_TRACE功能,等價於sql_trace
    4  - Level 1 加上綁定值(bind values)
    8  - Level 1 + 等待事件跟蹤
    12 - Level 1 + Level 4 + Level 8
b.啓動10046事件
    alter session[system] set events ‘10046 trace name context forever, level 12’; --當前會話
    exec dbms_monitor.session_trace_enable(267,996,waits=>true,binds=>true); --其餘會話 SID,SERIAL#
c.執行相關SQL
d.關閉10046事件
    alter session set events ‘10046 trace name context off’; --當前會話
    exec dbms_monitor.session_trace_disable(267,996); --其餘會話
對於經過DBLINK執行的SQL語句沒法進行跟蹤和獲取執行計劃。
SID,SERIAL能夠從v$session中查詢
    select SID,SERIAL# from v$session where sid =(select sid from v$mystat where rownum=1);
參考資料:http://blog.csdn.net/tianlesoftware/article/details/5857023
TRCA工具:
http://blog.csdn.net/tianlesoftware/article/details/7246542c#

三、10053事件:跟蹤CBO產生執行計劃,解決執行計劃失真問題,CBO優化器依賴分析數據,適用於特定的SQL
使用過程:
a.肯定當前trace文件
    默認即當前會話的SPID對應trace,能夠手動設置trace文件標識
    alter session set tracefile_identifier='10053_event';
    可經過以下sql查詢trace文件路徑
    SELECT      d.VALUE
             || '/'
             || LOWER (RTRIM (i.INSTANCE, CHR (0)))
             || '_ora_'
             || p.spid
             || '.trc'
                AS "trace_file_name"
      FROM   (SELECT   p.spid
                FROM   v$mystat m, v$session s, v$process p
               WHERE   m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
             (SELECT   t.INSTANCE
                FROM   v$thread t, v$parameter v
               WHERE   v.NAME = 'thread'
                       AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
             (SELECT   VALUE
                FROM   v$parameter
               WHERE   NAME = 'user_dump_dest') d;    
b.啓動10053事件
    ALTER SESSION SET EVENTS='10053 trace name context forever, level 1[2]';
c.執行sql
    select * from all_tables where table_name='T';    
d.關閉10053事件
    ALTER SESSION SET EVENTS '10053 trace name context off';
e.查看trace文件
    在udump目錄下含有tracefile_identifier的trace文件。    
參考資料:http://blog.csdn.net/tianlesoftware/article/details/5859027    
    
四、oradebug:
    oradebug help #查看命令幫助信息
使用過程:
a.追蹤進程
    系統的進程ID,使用oradebug setospid id;
    Oracle ID,使用oradebug setorapid id;
b.查詢進程號
    select a.username,a.sid ,a.serial#,b.spid  from v$session a,v$process b, v$mystat c  
    where a.paddr=b.addr  and a.sid=c.sid and rownum<2;
    select pid,spid,username from v$process; #pid oracle_id,spid os_id
c.得到系統狀態信息,使用spid
   oradebug setospid 27028
   oradebug unlimit
   oradebug dump systemstate 10
   oradebug TRACEFILE_NAME
   oradebug close_trace
d.得到某進程信息
   oradebug dump processstate 10
e.得到進程錯誤信息
   oradebug dump errorstack 3;
參考資料:http://blog.csdn.net/tianlesoftware/article/details/6525628api

五、HANGANALYZE:用於分析hang住而產生嚴重的性能問題
使用過程
a.單實例
    oradebug hanganalyze 3;
b.rac環境使用
    ALTER SESSION SET EVENTS 'immediate trace name HANGANALYZE level <level>';
參考資料:
http://blog.csdn.net/tianlesoftware/article/details/6321961
http://blog.itpub.net/12020513/viewspace-615165服務器

六、10060事件:分析SQL的斷語,用於執行計劃的分析session

七、分析事例:block dump分析段碎片:
set autotrace on;查看consistent gets,比較表中的數據和對象視圖中數據是否一致,block dump查看是否空塊多,
alter system dump datafile 5 block 13;
alter table ...move解決oracle

相關文章
相關標籤/搜索