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