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 (如controlf ,redohdr ,file_hdrs ),系统状态的dump (systemstate ),进程的状态的dump (processtate )。
这类dump ,很显然不能在parameter file 中使用event initialization parameter 。其他三种方法都可以使用,其中alter session 最常用:
1. alter session set events ‘immediate trace name <dump> level <level>’;
2. oradebug dump <dump> <level>;
3. sys.dbms_system.set_ev(sid,serial#,65535,<level>,’<dump>’);
这里的<dump> 实际上就是某种<trace_name> 。
举例如下:
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 = “<erro> trace name errorstack level <level>”;
2. alter session set events ‘<error> trace name errorstack level <level>’;
3. 在绑定一个进程以后,oradebug session_event <error> trace name errorstack level <level> ,这个命令对运行这个绑定的进程的session 设置了这个event ;而oradebug event <error> trace name errorstack level <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 = “<event> trace name context forever,level <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 = “<event> trace name context forever,level <level>”
2. alter session|system set events ‘<event> trace name context forever,level <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 | <dump> |
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 。