dump oracle events(轉)

xiayulai發表於2009-02-03

轉自:http://chenzs19850728.blog.163.com/blog/static/7629609200812475646182/

我們經常會發現某些人會問如下面的這些問題:

“這個oracle塊裡面到底是怎麼存這些資料的?”

“死鎖發生的時候,我怎麼知道是哪幾個物件發生的死鎖?”

oracle是怎麼執行這個操作的?”

oraclelibrary cache是什麼個樣子?”

……

這個時候,可能就有人會如下的回答這樣的問題:

“你dump一下這個塊吧!”

“你可以設定60事件跟蹤一下吧。”

“你做一個10046事件跟蹤一下吧。”

“你可以dump一下記憶體的library cache啊。”

……

等等如上問題,其實都只是需要dump某個oracleevent的問題。dump是一個動詞,它代表一種操作,說的簡單一點,拿記憶體舉例,就是原封不動的把某一片記憶體給展現出來;拿跟蹤舉例,就是它原始的展示了oracle處理某個問題的過程等等。很顯然,各位這裡就有幾個關鍵問題出現了。第一當然就是event,它是什麼樣子的?一共有哪些event?知道了這些event過後,那麼第二我們就會問,如果來dump這些oracleevent?再之後就是,dump出來的東西以後,我們怎麼來看懂這些東西?或者說這些東西是什麼個含義?本文會回答第一和第二個問題,至於第三個問題,各位看官需要程式研究metalink,相信會有不少收穫的。

首先,我們就來說說event,它是什麼樣子的?

event的定義

event的定義很簡單,可以簡單的如下面這個圖表示:

dump oracle events(轉)

event = event_name + action。這裡分別來解釋一下它的兩個組成要素。

首先,這裡的event name是一個event的名字或者是event的程式碼。如果event name不是“immediate”,那麼oracle解析器會在event name table中找到這個event。關於immediate event,它是一個特殊的event,它顯示一個立即的無條件的event,它不會等待其他人去提交它而立即執行。

其次,這裡的action是什麼樣子呢?如下:

dump oracle events(轉)

也就是說action是由一個action keyword和一個或者多個qualifier(值)組成。於是,我也需要來解釋一下這兩個部分。

這裡的action keyword是如下三個值:

crash:它會引起一個oracle crash,一般是為了測試recovery的時候才用它。

debugger:呼叫一個系統的debugger。(invokes a system debugger if any

traceis context specific or named context-independent ones

因此,我們不打算討論crashdebugger的情況,這兩個值一般是oracle的核心開發人員使用。我們這裡只討論trace的情況。

action keyword是“trace”的時候,這裡的qulifier的可如下指定:

dump oracle events(轉)

這裡有必要解釋一下,它就是你需要dump的“某個物件”的“trace id”,或者就是你想要做的“某種trace”。如你想dump記憶體中的library cache,就是想看看記憶體中library cachetrace,那麼這裡的就是“library_cache”。

英文的表達是這樣的: is a symbolic name associated with an internal trace id that is used to associate a trace with a (context-independent) debug dump operation

這裡的“context”,你可以理解成它是一種特殊的,顧名思義,他是dump“內容”。

這裡的3trace qualifiers含義分別是:

forever”:表示這個trace一旦設定,每當這個event發生的時候,就啟用這個trace

off”:表示對這個event關閉這個trace

level ”:當event發生的時候,你想要trace的級別,每個trace的級別的取值是都是不一樣的,它一個非負整數。通常情況下,它的值越大,就會有更多的內容顯示,但是如果你是做某個塊的dump,這裡的level就是data block addressdba)。

綜上所述,event可大概的如下表示為:

event_name CRASH ....

event_name DEBUGGER ....

event_name TRACE NAME trace_name|CONTEXT [ FOREVER|OFF|LEVEL ]

這個裡面“|”表示“或者”,“[]”表示出現一次或者多次。

上面已經清楚的介紹了event的結構,回答了event是什麼?它是什麼樣子?的問題。

那麼在oracle中一共有哪些event呢?oracle中的event有很多個,具體有哪些,在unix或者類unix系統中,可在檔案“$ORACLE_HOME/rdbms/mesg/oraus.msg”中檢視。在大體上面,event可以分為四類,,並且如何來設定這四類event呢?下面就來說說這個問題。

[@more@] event的分類dump

oracle中的event根據它們的用途,可以分為如下四類,分別是:

1. immediate dump

2. on-error dump

3. change behavior

4. trace

這四類event,分別對應下面四種不同的用途:

1. dump diagnostic information on request

2. dump diagnostic information when an error occurs

3. change database behavior

4. produce trace diagnostics as the database runs

那麼,如何設定這四類event呢?或者說如果dump這四類event呢?可以有四種方法來dump

1、 parameter file中使用event initialization parameter

2、 alter session|system set events

3、 sys.dbms_system.set_ev()

4、 oradebug

下面來分別解釋一下這四類event

immediate dumps

這類event都是根據要求隨時dump相應的內容到一個trace file中。常見的immediate dumps包括有:檔案頭部的dump(如controlfredohdrfile_hdrs),系統狀態的dumpsystemstate),程式的狀態的dumpprocesstate)。

這類dump,很顯然不能在parameter file中使用event initialization parameter。其他三種方法都可以使用,其中alter session最常用:

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

2. oradebug dump ;

3. sys.dbms_system.set_ev(sid,serial#,65535,,’’);

這裡的實際上就是某種

舉例如下:

1. alter session set events ‘immediate trace name controlf level 10’;

2. execute sys.dbms_system.set_ev(7,10,65535,10,’controlf’);

3. oradebug setospid 4081;

oradebug dump controlf 10;

on-error dumps

這類dumpimmdiate dumps很類似,只不過它發生的時間是前面的錯誤event發生的時候。event name就是oracleORA-nnn錯誤程式碼,如死鎖的錯誤程式碼是ORA-00060

常見的一種on-error dumpdump出出錯時候的程式的呼叫棧,trace nameerrorstack。下面我就對這種常見的on-error dumplevel說明一下:

level description

0 error stack only

1 error stack and function call stack (if implemented)

2 as 1 plus process state

3 as 2 plus the context area (all cursors and current cursor highlighted).

這類event該如何dump能,它可以使用下面的三種方法:

1. parameter file中設定event = “ trace name errorstack level ”;

2. alter session set events ‘ trace name errorstack level ’;

3. 在繫結一個程式以後,oradebug session_event trace name errorstack level ,這個命令對執行這個繫結的程式的session設定了這個event;而oradebug event trace name errorstack level ,這個命令是對當前繫結這個程式的session以及之後在程式上執行的session設定了這個session,因此這個命令在shared server模式中很有作用。

舉例如下:

如當死鎖發生的時候,dump出的呼叫棧資訊的event是:

1. parameter file中設定event = “60 trace name errorstack level 1”;這樣每當死鎖發生的時候,它的相關資訊就被dump到相應的trace file中。

2. alter session set events ‘60 trace name errorstack level 1’;

3. > oradebug setospid 4018;

> oradebug unlimit;

> oradebug dump errorstack 1;

change behavior dumps

當這類事件發生的時候,你可以透過dump做如下的操作:

1. change the oracle server’s behavior

2. enable hidden features

3. work around problems

4. perform specialized tuning

這類事件的dump設定一般都是在parameter file中設定:

event = “ trace name context forever,level ”;

如阻止SMON合併空閒空間事件如下設定:

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

trace events dumps

這類eventdump,就是dumpeventtrace內容,方便解決與跟蹤問題。這類event的常用的dump設定方法是在parameter file中或者使用alter session

1. event = “ trace name context forever,level

2. alter session|system set events ‘ trace name context forever,level ’;

alter session set events ‘10046 trace name context forever,level 12’;

下面對各類eventdump設定語法做一個總結,如下表:

uses of diagnostic dumps and events

event name

trace name

immediate dump

IMMEDIATE

on-error dump

error#

ERRORSTACK

change behavior

event#

CONTEXT

trace

event#

CONTEXT

這裡需要注意的一點是,不要給這個表格的表象所矇蔽,如on-error dump的trace name就只能是ERRORSTACK,它只是大多數的情況下是這個trace name(大部分的情況下,我們把一種trace name稱為一種dump),實際上on-error dump也可以和其他的dump相聯絡在一起,如event = '60 trace name processstate level 10',這個就是說在60錯誤事件(即死鎖)發生的時候,以級別10去dump這個process的state。因此event='event_name TRACE NAME dump_name,level'是說明當某個event發生的時候,以級別level去dump某個trace name(即某種dump)。這點是一定要注意的。

oracle是如何處理各種event的呢?或者說是按照什麼順利來處理那麼多的設定的event呢?請看下圖:

dump oracle events(轉)

此圖反應了oracle的執行event的內部順序,從途中可以看到先執行session event,後執行process event。那麼什麼是session event,什麼又是process event呢?

Pocess events are initialized at process startup with the “event” initialization parameter.即在parameter file中設定的那些event

Session events are modified dynamically with an ALTER SESSION or ALTER SYSTEM command.即使用alter session 或者alter system設定的那些event

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

相關文章