转自:http://chenzs19850728.blog.163.com/blog/static/7629609200812475646182/
我们经常会发现某些人会问如下面的这些问题:
“这个oracle块里面到底是怎么存这些数据的?”
“死锁发生的时候,我怎么知道是哪几个对象发生的死锁?”
“oracle是怎么执行这个操作的?”
“oracle的library cache是什么个样子?”
……
这个时候,可能就有人会如下的回答这样的问题:
“你dump一下这个块吧!”
“你可以设置60事件跟踪一下吧。”
“你做一个10046事件跟踪一下吧。”
“你可以dump一下内存的library cache啊。”
……
等等如上问题,其实都只是需要dump某个oracle的event的问题。dump是一个动词,它代表一种操作,说的简单一点,拿内存举例,就是原封不动的把某一片内存给展现出来;拿跟踪举例,就是它原始的展示了oracle处理某个问题的过程等等。很显然,各位这里就有几个关键问题出现了。第一当然就是event,它是什么样子的?一共有哪些event?知道了这些event过后,那么第二我们就会问,如果来dump这些oracle的event?再之后就是,dump出来的东西以后,我们怎么来看懂这些东西?或者说这些东西是什么个含义?本文会回答第一和第二个问题,至于第三个问题,各位看官需要进程研究metalink,相信会有不少收获的。
首先,我们就来说说event,它是什么样子的?
event的定义
event的定义很简单,可以简单的如下面这个图表示:
即event = event_name + action。这里分别来解释一下它的两个组成要素。
首先,这里的event name是一个event的名字或者是event的代码。如果event name不是“immediate”,那么oracle解析器会在event name table中找到这个event。关于immediate event,它是一个特殊的event,它显示一个立即的无条件的event,它不会等待其他人去提交它而立即执行。
其次,这里的action是什么样子呢?如下:

也就是说action是由一个action keyword和一个或者多个qualifier(值)组成。于是,我也需要来解释一下这两个部分。
这里的action keyword是如下三个值:
crash:它会引起一个oracle crash,一般是为了测试recovery的时候才用它。
debugger:调用一个系统的debugger。(invokes a system debugger if any)
trace:is context specific or named context-independent ones。
因此,我们不打算讨论crash和debugger的情况,这两个值一般是oracle的核心开发人员使用。我们这里只讨论trace的情况。
当action keyword是“trace”的时候,这里的qulifier的可如下指定:
这里有必要解释一下,它就是你需要dump的“某个对象”的“trace id”,或者就是你想要做的“某种trace”。如你想dump内存中的library cache,就是想看看内存中library cache的trace,那么这里的就是“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“内容”。
这里的3个trace qualifiers含义分别是:
“forever”:表示这个trace一旦设定,每当这个event发生的时候,就激活这个trace。
“off”:表示对这个event关闭这个trace。
“level ”:当event发生的时候,你想要trace的级别,每个trace的级别的取值是都是不一样的,它一个非负整数。通常情况下,它的值越大,就会有更多的内容显示,但是如果你是做某个块的dump,这里的level就是data block address(dba)。
综上所述,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 的分类 和 dumporacle中的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(如controlf,redohdr,file_hdrs),系统状态的dump(systemstate),进程的状态的dump(processtate)。
这类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
这类dump和immdiate dumps很类似,只不过它发生的时间是前面的错误event发生的时候。event name就是oracle的ORA-nnn错误代码,如死锁的错误代码是ORA-00060
常见的一种on-error dump是dump出出错时候的进程的调用栈,trace name是errorstack。下面我就对这种常见的on-error dump的level说明一下:
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
这类event的dump,就是dump出event的trace内容,方便解决与跟踪问题。这类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’;
下面对各类event的dump设置语法做一个总结,如下表:
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呢?请看下图:
此图反应了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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7312700/viewspace-1016641/