RDBMS提供了多種的診斷工具(轉)

Aminiy發表於2013-08-06
Oracle為RDBMS提供了多種的診斷工具,診斷事件(Event)是其中一種常用、好用的方法,它使DBA可以方便的轉儲資料庫各種結構及跟蹤特定事件的發生.
一、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初始化引數指定的位置。
二、說一說設定的問題了

可以在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/24492954/viewspace-767908/,如需轉載,請註明出處,否則將追究法律責任。

相關文章