oracle events

lemonlili發表於2009-10-01
oracle 的事件可以分2種:1是等待事件,2診斷事件.我們在下面學習下ORACLE的診斷事件.
ORACLE 的診斷事件大概分成4個主要的類別
1 .Dump diagnostic information on request(即IMMEDIATE 轉儲事件)通常用來轉儲系統狀態,程式狀態,和檔案頭部等等(CONTROLF,REDOHDR,FILE_HDRS)
alter session set events 'immediate trace name controlf level 10';(通常IMMEDIATE 用ALTER SESSION 來執行,這類事件不能放到INIT.ORA中,就算設定此引數也不會生效)
ORADEBUG SETMYPID
ORADEBUG DUMP CONTROLF 10
2 . Dump diagnostic information when an error occurs(即ON ERROR轉儲事件)
alter system set events '4031 trace name errorstack level 1'; 當發生ORA-04031的時候系統會把錯誤的堆疊DUMP出來.一般等級為3個等級,1級錯誤堆疊和函式呼叫堆疊.2級級別1加上程式狀態.3級在級別2上加上了上下文區域.當然我們通常是在INIT.ORA中設定EVENT='***'
3. Change database behavior(即是改變資料庫的行為)
EVENT='10269 TRACE NAME CONTEXT FOREVER'次時間就是禁止PMON 對空間空間的合併
4. Produce trace diagnostics as the database runs(即PROCESS TRACE 獲得額外的資訊)
EXEC DBMS_SYSTEM.EV(142,7,10046,10,'');
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER LEVEL 12';

EVENT的語法:
{: }*
::=
::= "trace"|"debugger"|"crash"
::= {,}*

For "trace" action:
::= {;}*
::= "name"
{,}*
::= ""|"off"|
"after times"|
"forever"|
"lifetime "|
"level "|
"type "
::= "increment"|"decrement"|"constant"

從以上語法不難看出
如果我們開啟一個EVENTS
alter system set events '4031 trace name errorstack level 1';
可以透過
alter system set events '4031 trace name errorstack off;
來關閉他.
如何設定EVENT 呢?
有4種方法
1.在PFILE或SPFILE 中指定 EVENT 引數
例如:ALTER SYSTEM SET EVNT='60 TRACE NAME ERRORSTACK' SCOPE=SPFILE;
2.透過ALTER SESSION/SYSTEM 來設定
例如:ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME SYSTEMSTATE LEVEL 10'
ALTER SYSTEM SET EVNETS '604 TRACE NAME ERRORSTACK'
3.透過DBMS_SYSTEM.SET_EV 這個儲存過程
例如:EXEC DBMS_SYSTEM.SET_EV(142,7,10046,10,'')
4.透過ORADEBUG 工具設定
例如:ORADEBUG SETMYPID
ORADEBUG UNLIMIT
ORADEBUG DUMP CONTROLF 10

如果你想設定多個EVENT呢?
有2種方法
1.在PFILE 中指定EVENT時候 可以連續設定2個EVENT 引數(2個EVENT 必須上下在一起 如果分開第一個EVENT 將失效)
例如:EVENT='10015 TRACE NAME CONTEXT FOREVER'
EVENT='10046 TRACE NAME CONTEXT FOREVER ,LEVEL 10'
必須2個連在一起.
2.在EVENT 中 每個EVENT 用:隔離.
例如:EVENT='10015 TRACE NAME CONTEXT FOREVER:10046 TRACE NAME CONTEXT FOREVER ,LEVEL 10'

在使用DBMS_SYSTEM.SET_EV時候有幾點注意下.
DBMS_SYSTEM.SET_EV(SID,SERIAL#,EVENT,LEVEL,ACTION)
LEVEL 是在是指DUMP的等級,如果是在BLOCK DUMP 的時候是指DBA
ACTION 是在TRACE NAME(65535 EVENT 時候指定此引數如CONTROLF,SYSTEMSTATE,PROCESSSTATE.

我們如何來檢視1個SESSEN開了那些EVENT呢?
DBMS_SYSTEM.READ_EV
來檢視
declare
event_level number;
begin
for i in 10000..10999 loop
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;
/
[@more@]

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

相關文章