2019獨角獸企業重金招聘Python工程師標準>>>
一、診斷事件
? ? 診斷事件無官方技術文檔支持,使用存在風險,慎用。使用診斷事件可以獲取問題更多的信息,調整系統運行
特性,啟用某些內部功能。用于系統故障的診斷。跟蹤應用,改變系統運行模式。
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
二、常見事件分析
1、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/?? ?
2、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/7246542
3、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?? ?
?? ?
4、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/6525628
5、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
6、10060事件:分析SQL的斷語,用于執行計劃的分析
7、分析事例:block dump分析段碎片:
set autotrace on;查看consistent gets,比較表中的數據和對象視圖中數據是否一致,block dump查看是否空塊多,
alter system dump datafile 5 block 13;
alter table ...move解決