TraceEvents&DB event(跟蹤事件)總結

0、參考資料

Database Performance Tuning Guide -> Using Application Tracing Tools

Database SQL Tuning Guide -> Performing Application Tracing

Introduction to ORACLE Diagnostic EVENTS (Doc ID 218105.1)

1、event相關查詢&trace信息解讀

1.1、查看當前數據庫設置了哪些event

查看數據庫級別設置的events

show parameter event

或查詢語句:

set serveroutput on
declare
event_level number;
begin
for i in 10000..30000 loop
sys.dbms_system.read_ev(i,event_level);
 if (event_level > 0) then
 dbms_output.put_line('Event '||to_char(i)||' set at level '||
     to_char(event_level));
end if;
 end loop;
end;

查詢數據庫設置了哪些session級別的事件:

select * from v$ses_optimizer_env where   name like '%parallel%' and ISDEFAULT='NO' and sid=27;

1.2、查看當前trc文件

建議在跟蹤會話前設置tracefile_identifier,alter session set tracefile_identifier = my_session_tracefile;
然後執行dump命令,這樣我們可以在udump目錄下看到一個含有MY_SESSION_TRACEFILE的文件。這是最簡單直觀的方式找到相應的trace文件。

11g+版本 方法:

–方法1 11g:最好用

SQL> select * from v$diag_info where name='Default Trace File';

–方法2 11g:

SQL> select spid,tracefile from V$process where addr in(select paddr from v$session where sid=sys_context('userenv','sid'));

–方法3:10g/11g

SQL> oradebug setmypid 
SQL> oradebug tracefile_name 

–方法4:11g老方法

-------------a------------
SQL> select d.value
     ||'/'
     ||lower(rtrim(i.instance,chr(0)))
     ||'_ora_'
     ||p.spid
     ||'.trc' 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------------
SQL> select 
u_dump.value || '/' || 
db_name.value || '_ora_' || 
v$process.spid || 
nvl2(v$process.traceid, '_' || v$process.traceid, null ) 
|| '.trc' ""Trace File"" 
from 
v$parameter u_dump 
cross join v$parameter db_name 
cross join v$process 
join v$session 
on v$process.addr = v$session.paddr 
where 
u_dump.name = 'user_dump_dest' and 
db_name.name = 'db_name' and 
v$session.audsid=sys_context('userenv','sessionid'); "

10G及以前版本:

select 
  u_dump.value   || '/'     || 
  db_name.value  || '_ora_' || 
  v$process.spid || 
  nvl2(v$process.traceid,  '_' || v$process.traceid, null ) 
  || '.trc'  ""Trace File""
from 
             v$parameter u_dump 
  cross join v$parameter db_name
  cross join v$process 
        join v$session 
          on v$process.addr = v$session.paddr
where 
 u_dump.name   = 'user_dump_dest' and 
 db_name.name  = 'db_name'        and
 v$session.audsid=sys_context('userenv','sessionid');
 
C.VALUE||'/'||'ORA_'||LTRIM(TO_CHAR(A.SPID,'FM99999'))||'.TRC'
--------------------------------------------------------------------------------
/u01/oracle/app/admin/som/udump/ora_22025.trc"

1.3、SQL Trace文件格式信息解讀

一些解釋說明,在跟蹤文件的開頭部分都有說明的。

在Secrets of Oracle database一書中 第24章詳細說明了SQL跟蹤文件格式

Parsing in Cursor部分

len: 被分析SQL的長度
dep: 產生遞歸SQL的深度
uid: user id 
otc: Oracle command type 命令的類型
lid: 私有的用戶id
tim: 時間戳
hv:  hash value
ad:  SQL address 

PARSE,EXEC,FETCH 部分

c:  消耗的CPU time
e:  elapsed time 操作的用時
p:  physical reads 物理讀的次數
cr: consistent reads 一致性方式讀取的數據塊
cu: current方式讀取的數據塊
mis:cursor miss in cache 應分析次數
r:  -rows 處理的行數
dep:depth 遞歸SQL的深度
og: optimizer goal 優化器模式
tim:timstamp 時間戳

STATS部分

id:  執行計劃的行源號
cnt:當前行源返回的行數
pid:當前行源號的父號
pos:執行計劃中的位置
obj:當前操作對象id(如果當前行原始一個對象的話)
op: 當前行源的數據訪問操作

WAIT 部分

2、會話跟蹤方式

會話跟蹤是最有用的跟蹤方式。還有實例級別的跟蹤,測試還可以,生產系統不可取。

10046相關MOS文檔:

Interpreting Raw SQL_TRACE output (Doc ID 39817.1) --10046信息解讀
How to Enable SQL_TRACE for Another Session or in MTS Using Oradebug (Doc ID 1058210.6)
How To Collect 10046 Trace (SQL_TRACE) Diagnostics for Performance Issues (Doc ID 376442.1) --使用10046分析問題思路

實例級別event設置:

How To Set EVENTS In The SPFILE (Doc ID 160178.1)
How to Set Multiple Events in INIT.ORA (Doc ID 1051056.6)

2.1、跟蹤當前會話

方法1:設置10046 event方式跟蹤sql(最常用)

alter session set tracefile_identifier='10046'; 
alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
alter session set events '10046 trace name context forever,level 12';

-- Execute the queries or operations to be traced here --
select * from v$diag_info;   --11g

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

方法2:oradebug方式(次常用)

SQL> oradebug setmypid
Statement processed.
SQL> oradebug event 10046 trace name context forever, level 8;
Statement processed.
SQL> set serveroutput on;
SQL> declare 
  event_level number; 
  begin 
  dbms_system.read_ev(10046,event_level); 
dbms_output.put_line('event_level:'||to_char(event_level)); 
end;  
  /
event_level:8----11g讀取不管設置哪一個級別,讀取處理都是0

PL/SQL procedure successfully completed.

SQL> oradebug tracefile_name;
/u01/app/oracle/admin/sms/udump/sms1_ora_9339.trc
SQL> oradebug event 10046 trace name context off;
Statement processed

方法3:改會話級別參數

alter session set sql_trace=true;

方法4:dbms_support包(運行$ORACLE_HOME/rdbms/admin/dbmssupp.sql)

包含等待事件(默認級別)
exec sys.dbms_support.start_trace;
包含綁定變量,等待事件
exec sys.dbms_support.start_trace(waits=>TRUE,binds=>TRUE)
運行sql腳本或者程序追蹤等待事件信息
......
關閉追蹤信息
exec sys.dbms_support.stop_trace;

2.2、跟蹤他人會話

方法1:oradebug方式(常用)

alter session set timed_statistics=true;
oradebug setospid 12345;
oradebug unlimit;
oradebug event 10046 trace name context forever,level 8;
在追蹤會話中執行sql或程序
......
--關閉追蹤
oradebug event 10046 trace name context off;
--獲取追蹤文件
oradebug setmypid
oradebug tracefile_name

方法2:dbms_support包方式

追蹤 sid 1234 serial# 56789
exec dbms_support_start_trace_in_session(sid=>1234,serial#=>56789,waits=>true,binds=true);
在sid 1234 serial# 56789會話中執行sql或程序
......
--關閉追蹤
exec dbms_support_start_trace_in_session(sid=>1234,serial#=>56789);

方法3:dbms_monitor包方式

exec dbms_monitor.session_trace_enable(session_id=>1234,serial_num=>56789,waits=>true,binds=>true);
在追蹤會話中執行sql或程序
......
--關閉追蹤
exec dbms_monitor.session_trace_disable(session_id=>1234,serial_num=>56789);

2.3、實例級別跟蹤

參數文件中設置,不建議方式

timed_statistics=true
EVENT="10046 trace name context forever,level 8"
或
sql_trace=true

2.4、利用服務、模塊動作去跟蹤

exec dbms_monitor.client_id_trace_enable(client_id=>'app1');
exec dbms_monitor.client_id_trace_enable(client_id=>'app1', waits=>true, binds=>false);
exec dbms_monitor.client_id_trace_disable(client_id=>'app1');

注意:必須在dbms_application_info程序包中有應用程序使用OCI調用或者過程設置模塊名和動作名
exec dbms_monitor.serv_mod_act_trace_enable(service_name=>'APPS1',module_name=>'GLEDGER',action_name=>'DEBIT_ENTRY',waits=>true,binds=>true,instance_name=>null);
在追蹤會話中執行sql或程序
......
--關閉追蹤
exec dbms_monitor.serv_mod_act_trace_enable(service_name=>'APPS1',module_name=>'GLEDGER',action_name=>'DEBIT_ENTRY');

3、常用的events

3.1、關閉密碼延遲驗證

11g有個密碼錯誤延時驗證,當應用以錯誤的密碼連接上來時,會持續的CPU自旋等待,同時伴隨library cache lock。可以設置event 28401來禁用這個特性。

alter system set event='28401 trace name context forever,level 1';
或
alter system set event='28401 trace name context forever,level 1' sid ='*' scope=spfile;

3.2、10053 跟蹤sql執行計劃產生過程

【使用場景】CBO 一定是選擇代價最低的數據訪問路徑作爲SQL 的執行計劃。 如果覺得CBO做出的執行計劃不是最優的,就應該去分析。 這時就用到了10053事件。 我們需要關注CBO選擇的每一個代價最低的數據訪問方式,以及提供給CBO的分析信息是否真實。

啓用10053事件:

ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
或
ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';
然後執行sql語句或者explain for 

關閉10053事件:

ALTER SESSION SET EVENTS '10053 trace name context off';

10053事件有兩個級別:一般使用level 2

Level 2:2級是1級的一個子集,它包含以下內容:

Column statistics
ingle Access Paths
Join Costs
Table Joins Considered
Join Methods Considered (NL/MS/HA)

Level 1: 1級比2級更詳細,它包含2級的所有內容,在加如下內容:

Parameters used by the optimizer
Index statistics

3.3、10231 跳過壞塊

mos參考資料:

Extracting Data from a Corrupt Table using DBMS_REPAIR or Event 10231 (Doc ID 33405.1)

–啓用10231內部事件

alter system set events='10231 trace name context forever,level 10';

開啓10231事件後,查詢表的時候就不會報ORA-01578錯誤。然後就可以把表重建或者導出。
–關閉10231內部事件

alter system set events='10231 trace name context off';

4、Trace Listener

如果是監聽沒有密碼的情況下:

1.在listener.ora文件中加入參數TRACE_LEVEL_LISTENER=16,或者在命令行輸入lsnrctl trace 16(默認監聽) 或 lsnrctl trace listener_name 16

[oracle@db ~]$lsnrctl trace listener_name 16

注:TRACE_LEVEL_LISTENER的取值範圍爲0~16,當然級別越高,收集的信息就相對越全面,系統默認是0,即不生成trace信息。

2.此時,客戶端通過listener連接到服務器的關於監聽相關的信息都會記錄到trace文件中,trace文件默認是存放在$ORACLE_HOME/network/trace目錄下。

3.關閉Listener Trace。可通過將listener.ora文件中的TRACE_LEVEL_LISTENER設置爲0,或者直接在命令行執行lsnrctl trace OFF

[oracle@db ~]$lsnrctl trace OFF

4.進入ORACLEHOME/network/tracetrace[oracle@dbtrace]ORACLE_HOME/network/trace目錄,格式化trace文件,如: [oracle@db trace]trcasst listener.trc > abc.log

下面是官方文檔的監聽跟蹤的一種方法:

Listener and sqlnet trace
Posted by decipherinfosys on June 5, 2007
At times, when troubleshooting connectivity issues or performance issues, you might need to run listener trace (server side) and/or a sqlnet trace (client side trace).  Oracle support staff will also ask for these files when you enlist their help in troubleshooting these issues.  Here are the steps on how you can do that:
To enable sqlnet trace (client side trace):
Add the following to the sqlnet.ora file on the application server(s) from where the connections are being made to the Oracle database:
Trace_level_client=16
Trace_directory_client=<path_to_the_trace_directory> # use the full path to the trace directory
Trace_unique_client=on
Trace_timestamp_client=on
To enable listener trace (server side):
Add the following to the listener.ora file on the db server before starting the listener:
TRACE_TIMESTAMP_<listener_name>=on
TRACE_DIRECTORY_< listener_name>=<path_to_the_trace_directory>
Here <listener_name> is the name of the listener. Then run lsnrctl to turn on the listener trace:
lsnrctl> set current_listener <listener_name>
lsnrctl> set trc_level support
You can run both trace at the same time for 15 minutes or so in order to get some meaningful data set.
To stop the sqlnet trace:
Remove the following entries from sqlnet.ora or comment them out by using the # sign:
Trace_level_client=16
Trace_directory_client=<path_to_the_trace_directory> # use the full path to the trace directory
Trace_unique_client=on
Trace_timestamp_client=on
To stop the listener trace:
lsnrctl> set trc_level off
For getting more information on the trace levels and the different parameters for these traces, please refer metalink or otn.

4、Trace Data Pump

MOS文檔參考:

Export/Import DataPump Parameter TRACE - How to Diagnose Oracle Data Pump (文檔 ID 286496.1)
How To Use The New 11g Events++ Syntax For Easier SQL Tracing Of Datapump Operations? [ID 813737.1]

To enable 10046 level 12 tracing for e.g. the Datapump Master (DM) and Worker (DW) processes the following event can be set:

alter system set events 'sql_trace {process : pname = dw | pname = dm} level=12';

Disabling of the tracing can be done in a similar fashion:

alter system set events 'sql_trace {process : pname = dw | pname = dm} off';
The new event syntax can also be used to enable an event for a specific process, like in:

alter system set events 'sql_trace {process : ospid = 2345} level=12';

Note: the Event++ syntax is only available in Oracle11g and higher releases. It does not work in lower releases of Oracle.

以下補充內容來自互聯網:

補充1:Oracle跟蹤文件說明

Oracle跟蹤文件分爲三種類型,一種是後臺報警日誌文件,記錄數據庫在啓動、關閉和運行期間後臺進程的活動情況,如表空間創建、回滾段創建、某些alter命令、日誌切換、錯誤消息等。在數據庫出現故障時,應首先查看該文件,但文件中的信息與任何錯誤狀態沒有必然的聯繫。後臺報警日誌文件保存BACKGROUND_DUMP_DEST參數指定的目錄中,文件格式爲SIDALRT.LOG。另一種類型是DBWR、LGWR、SMON等後臺進程創建的後臺跟蹤文件。後臺跟蹤文件根據後臺進程運行情況產生,後臺跟蹤文件也保存在BACKGROUND_DUMP_DEST參數指定的目錄中,文件格式爲siddbwr.trc、sidsmon.trc等。還有一種類型是由連接到Oracle的用戶進程(Server Processes)生成的用戶跟蹤文件。這些文件僅在用戶會話期間遇到錯誤時產生。此外,用戶可以通過執行oracle跟蹤事件(見後面)來生成該類文件,用戶跟蹤文件保存在USER_DUMP_DEST參數指定的目錄中,文件格式爲oraxxxxx.trc,xxxxx爲創建文件的進程號(或線程號)。

補充2:Oracle跟蹤事件說明

Oracle提供了一類命令,可以將Oracle各類內部結構中所包含的信息轉儲(dump)到跟蹤文件中,以便用戶能根據文件內容來解決各種故障。設置跟蹤事件有兩種方法,一種是在init.ora文件中設置事件,這樣open數據庫後,將影響到所有的會話。設置格式如下:

EVENT=“eventnumber trace name eventname [forever,] [level levelnumber] : …”

通過:符號,可以連續設置多個事件,也可以通過連續使用event來設置多個事件。

另一種方法是在會話過程中使用alter session set events命令,只對當前會話有影響。設置格式如下:

alter session set events ‘[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : …’

通過:符號,可以連續設置多個事件,也可以通過連續使用alter session set events 來設置多個事件。

格式說明:eventnumber指觸發dump的事件號,事件號可以是Oracle錯誤號(出現相應錯誤時跟蹤指定的事件)或oralce內部事件號,內部事件號在10000到10999之間,不能與immediate關鍵字同用。

immediate關鍵字表示命令發出後,立即將指定的結構dump到跟蹤文件中,這個關鍵字只用在alter session語句中,並且不能與 eventnumber、forever關鍵字同用。

trace name 是關鍵字。

eventname指事件名稱(見後面),即要進行dump的實際結構名。若eventname爲context,則指根據內部事件號進行跟蹤。

forever關鍵字表示事件在實例或會話的週期內保持有效狀態,不能與immediate同用。

level爲事件級別關鍵字。但在dump錯誤棧(errorstack)時不存在級別。

levelnumber表示事件級別號,一般從1到10,1表示只dump結構頭部信息,10表示dump結構的所有信息。

補充3:跟蹤事件概述

1、buffers事件:dump SGA緩衝區中的db buffer結構

alter session set events ‘immediate trace name buffers level 1’; --表示dump緩衝區的頭部。

2、blockdump事件:dump數據文件、索引文件、回滾段文件結構

alter session set events ‘immediate trace name blockdump level 66666’; --表示dump塊地址爲6666的數據塊。

在Oracle 8以後該命令已改爲:

alter system dump datafile 11 block 9; --表示dump數據文件號爲11中的第9個數據塊。

3、controlf事件:dump控制文件結構

alter session set events ‘immediate trace name controlf level 10’; --表示dump控制文件的所有內容。

4、locks事件:dump LCK進程的鎖信息

alter session set events ‘immediate trace name locks level 5’;

5、redohdr事件:dump redo日誌的頭部信息

alter session set events 'immediate trace name redohdr level 1'; --表示dump redo日誌頭部的控制文件項。 
alter session set events 'immediate trace name redohdr level 2'; --表示dump redo日誌的通用文件頭。 
alter session set events 'immediate trace name redohdr level 10'; --表示dump redo日誌的完整文件頭。

注意:redo日誌的內容dump可以採用下面的語句:

alter system dump logfile ‘logfilename’;

6、loghist事件:dump控制文件中的日誌歷史項

alter session set events 'immediate trace name loghist level 1'; --表示只dump最早和最遲的日誌歷史項。 
levelnumber大於等於2時,表示2的levelnumber次方個日誌歷史項。 
alter session set events 'immediate trace name loghist level 4'; --表示dump 16個日誌歷史項。

7、file_hdrs事件:dump 所有數據文件的頭部信息

alter session set events 'immediate trace name file_hdrs level 1'; --表示dump 所有數據文件頭部的控制文件項。 
alter session set events 'immediate trace name file_hdrs level 2'; --表示dump 所有數據文件的通用文件頭。 
alter session set events 'immediate trace name file_hdrs level 10'; --表示dump 所有數據文件的完整文件頭。 

8、errorstack事件:dump 錯誤棧信息,通常Oracle發生錯誤時前臺進程將得到一條錯誤信息,但某些情況下得不到錯誤信息,可以採用這種方式得到Oracle錯誤。

alter session set events ‘604 trace name errorstack forever’; --表示當出現604錯誤時,dump 錯誤棧和進程棧。

9、systemstate事件:dump所有系統狀態和進程狀態

alter session set events ‘immediate trace name systemstate level 10’; --表示dump 所有系統狀態和進程狀態。

10、coalesec事件:dump指定表空間中的自由區間

levelnumber以十六進制表示時,兩個高位字節表示自由區間數目,兩個低位字節表示表空間號,如0x00050000表示dump系統表空間中的5個自由區間,轉換成十進制就是327680,即:

alter session set events ‘immediate trace name coalesec level 327680’;

11、processsate事件:dump進程狀態

alter session set events ‘immediate trace name processsate level 10’;

12、library_cache事件:dump library cache信息

alter session set events ‘immediate trace name library_cache level 10’;

13、heapdump事件:dump PGA、SGA、UGA中的信息

alter session set events ‘immediate trace name heapdump level 1’;

14、row_cache事件:dump數據字典緩衝區中的信息

alter session set events ‘immediate trace name row_cache level 1’;

補充4:內部事件號概述;可能有出入,以官方說明和實際爲準

1、10013:用於監視事務恢復

2、10015:轉儲UNDO SEGMENT頭部

event = “10015 trace name context forever”

3、10029:用於給出會話期間的登陸信息

4、10030:用於給出會話期間的註銷信息

5、10032:轉儲排序的統計信息

6、10033:轉儲排序增長的統計信息

7、10045:跟蹤Freelist管理操作

8、10046:跟蹤SQL語句

alter session set events '10046 trace name context forever, level 4'; --跟蹤SQL語句並顯示綁定變量 
alter session set events '10046 trace name context forever, level 8'; --跟蹤SQL語句並顯示等待事件 

9、10053:轉儲優化策略

10、10059:模擬redo日誌中的創建和清除錯誤

11、10061:阻止SMON進程在啓動時清除臨時段

12、10079:轉儲 SQL*NET統計信息

13、10081:轉儲高水標記變化

14、10104:轉儲Hash連接統計信息

15、10128:轉儲分區休整信息

16、10200:轉儲一致性讀信息

17、10201:轉儲一致性讀中Undo應用

18、10209:允許在控制文件中模擬錯誤

19、10210:觸發數據塊檢查事件

event = “10210 trace name context forever, level 10”

20、10211:觸發索引檢查事件

21、10213:模擬在寫控制文件後崩潰

22、10214:模擬在控制文件中的寫錯誤

levelnumber從1-9表示產生錯誤的塊號,大於等於10則每個控制文件將出錯

23、10215:模擬在控制文件中的讀錯誤

24、10220:轉儲Undo頭部變化

25、10221;轉儲Undo變化

26、10224:轉儲索引的分隔與刪除

27、10225:轉儲基於字典管理的區間的變化

28、10229:模擬在數據文件上的I/O錯誤

29、10231:設置在全表掃描時忽略損壞的數據塊

alter session set events '10231 trace name context off'; -- 關閉會話期間的數據塊檢查 
event = "10231 trace name context forever, level 10" -- 對任何進程讀入SGA的數據塊進行檢查 

30、10232:將設置爲軟損壞(DBMS_REPAIR包設置或DB_BLOCK_CHECKING爲TRUE時設置)的數據塊dump到跟蹤文件

31、10235:用於內存堆檢查

alter session set events ‘10235 trace name context forever, level 1’;

32、10241:轉儲遠程SQL執行

33、10246:跟蹤PMON進程

34、10248:跟蹤dispatch進程

35、10249:跟蹤MTS進程

36、10252:模擬寫數據文件頭部錯誤

37、10253:模擬寫redo日誌文件錯誤

38、10262:允許連接時存在內存泄漏

alter session set events ‘10262 trace name context forever, level 300’; – 允許存在300個字節的內存泄漏

39、10270:轉儲共享遊標

40、10285:模擬控制文件頭部損壞

41、10286:模擬控制文件打開錯誤

42、10287:模擬歸檔出錯

43、10357:調試直接路徑機制

44、10500:跟蹤SMON進程

45、10608:跟蹤位圖索引的創建

46、10704:跟蹤enqueues

47、10706:跟蹤全局enqueues

48、10708:跟蹤RAC的buffer cache

49、10710:跟蹤對位圖索引的訪問

50、10711:跟蹤位圖索引合併操作

51、10712:跟蹤位圖索引OR操作

52、10713:跟蹤位圖索引AND操作

53、10714:跟蹤位圖索引MINUS操作

54、10715:跟蹤位圖索引向ROWID的轉化

55、10716:跟蹤位圖索引的壓縮與解壓

56、10719:跟蹤位圖索引的修改

57、10731:跟蹤遊標聲明

58、10928:跟蹤PL/SQL執行

59、10938:轉儲PL/SQL執行統計信息

最後要說明的是,由於版本不同以上語法可能有些變化,但大多數還是可用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章