ORACLE診斷事件

zyb200發表於2008-01-14
Oracle為RDBMS提供了多種的診斷工具,診斷事件(Event)是其中一種常用、好用的方法,它使DBA可以方便的轉儲資料庫各種結構及跟蹤特定事件的發生.[@more@]一、Event的通常格式及分類  
  1、 通常格式如下:
  EVENT=""
  
  2、 Event分類
  診斷事件大體上可以分為四類:
  a. 轉儲類事件:它們主要用於轉儲Oracle的一些結構,例如轉儲一下控制檔案、資料檔案頭等內容。
  b. 捕捉類事件:它們用於捕捉一些Error事件的發生,例如捕捉一下ORA-04031發生時一些Rdbms資訊,以判斷是Bug還是其它原因引起的這方面的問題。
  c. 改變執行途徑類事件:它們用於改主一些Oracle內部程式碼的執行途徑,例如設定10269將會使Smon程式不去合併那些Free的空間。
  d. 跟蹤類事件:這們用於獲取一些跟蹤資訊以用於Sql調優等方面,最典型的便是10046了,將會對Sql進行跟蹤。
  3、 說明:
  a. 如果immediate放在第一個說明是無條件事件,即命令發出即轉儲到跟蹤檔案。
  b. trace name位於第二、三項,除它們外的其它限定詞是供Oracle內部開發組用的。
  c. level通常位於1-10之間(10046有時用到12),10意味著轉儲事件所有的資訊。例如當轉儲控制檔案時,level1表示轉儲控制檔案頭,而level 10表明轉儲控制檔案全部內容。
  d. 轉儲所生成的trace檔案在user_dump_dest初始化引數指定的位置。

跟蹤類別

事件名稱

動作(Action)

Name

跟蹤專案

範圍限定

轉儲類事件

immediate

Trace

“name”

blockdump

redohdr

file_hdrs

controlf

systemstate

Level block#

Level 10

Level 10

Level 10

Level 10

捕捉類事件

Error number

Trace

“name”

Error stack

processstate

Heapdump

Foreve

Off

Level nr

改變執行途徑類事件

Even code corresponding to path

Trace

“name”

Context

Forever or

Level 10

跟蹤類事件

10046

Trace

“name”

Context

Forever

Level n

off



  二、說一說設定的問題了  
  可以在init.ora中設定所需的事件,這將對所有會話期開啟的會話進行跟蹤,也可以用alter session set event 等方法設定事件跟蹤,這將開啟正在進行會話的事件跟蹤。
  
  1、 在init.ora中設定跟蹤事件的方法
  a. 語法
  EVENT=”event 語法|,level n|:event 語法|,level n|…”
  b. 舉例
  event=”10231 trace name context forever,level 10’
  c. 可以這樣設定多個事件:
  EVENT="
  10231 trace name context forever, level 10:
  10232 trace name context forever, level 10"
  
  2、 透過Alter session/system set events這種方法
  舉個例子大家就明白了
  Example:
  Alter session set events ‘immediate trace name controlf level 10’;
  Alter session set events ‘immediate trace name blockdump level 112511416’; (*)
  在oracle8x及之上的版本也有這樣的語句:
  Alter system dump datafile 13 block 15;實現的功能與(*)是類似的。
  
  3、 使用DBMS_SYSTEM.SET_EV的方法
  a. 過和定義如下
  DBMS_SYSTEM.SET_EV(
  SI Binary_integer,
  SE Binary_integer,
  EV Binary_integer,
  LE Binary_integer,
  NM Binary_integer);
  
  SI: 即v$session中的sid
  SE:即v$session中的serial#
  EV:要設定的事件
  LE:要設定事件的級別
  NM:名稱
  b. 舉個例子,以10046為例
  SQL> EXECUTE SYS.DBMS_SYSTEM.SET_EV(sid,serial#,10046,12,'');
  
  4、 使用Oradebug來設定診斷事件的方法
  同樣舉個例子大家就明白了:
  a. 找到spid
  SQL>select username, sid, serial#, paddr from v$session where username='qiuyb';
  
  USERNAME SID SERIAL# PADDR
  --------------------------------------------------------
  HRB3 265 910 C000000084435AD8
  
  SQL>SELECT ADDR,PID,SPID FROM V$PROCESS WHERE ADDR= C000000084435AD8';
  ADDR PID SPID
  ------------------------------------------
  C000000084435AD8 91 4835
  
  b. 設定事件,以10046為例
  sqlplus /nolog
  SQL>connect / as sysdba;
  SQL>oradebug setospid 4835
  SQL>oradebug unlimit   --不限制轉儲檔案的大小
  SQL> oradebug event 10046 trace name context forever,level 12 --設定事件進行sql跟蹤
  
  SQL> oradebug event 10046 trace name context off --關閉跟蹤
  
  注意不要用oradug去跟蹤oracle的smon,pmon等幾個程式,操作不當可能會殺掉這幾個後臺進和引起宕庫。
  
  三、你可能的問題  
  1、 我如何知道在系統中設定了哪些event?
  回答:
  a. 如果你的事件是在init.ora中設定的可以用
  SQL>show parameter event;
  來檢視
  b. Michael R.Ault給的SQL
  serveroutput on size 1000000
  declare
  event_level number;
  begin
  for i in 10000..10999 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;
  /
  
  2、 在oracle9i中使用spfile的那種如何設定診斷事件呢?
  回答:
  簡單,Alter system命令就可以完成
  alter system set event='10046 trace name context forever, level 12' scope=spfile;
  重啟一下就生效了。
  
  3、 壞了,我的9i設定完診斷事件,起不來了,報ORA-02194錯怎麼辦?
  回答:
  那你一定是在使用Alter system時把某一項寫錯了,比如把context寫成了conetxt了,可以做如下的解決:
  a.由spfile生成pfile
  SQL>create pfile from spfile;
  File created.
  
  b.編輯pfile以修正錯誤
  Change... *.event='10046 trace name conetxt forever, level 12'
  -to- *.event='10046 trace name context forever, level 12'
  c.用pfile啟動
  SQL>startup pfile=/.....
  d.重新生成 SPFILE.
  SQL>create spfile from pfile;
  File created.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/64429/viewspace-997322/,如需轉載,請註明出處,否則將追究法律責任。

相關文章