我们经常会发现某些人会问如下面的这些问题:
“这个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 是什么样子呢?如下:
![](http://img.blog.163.com/photo/wMesvTNT_TlUITDC09N-eA==/5646950982769441622.jpg)
也就是说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 的可如下指定:
这里有必要解释一下<trace_name> ,它就是你需要dump 的“某个对象”的“trace id ”,或者就是你想要做的“某种trace ”。如你想dump 内存中的library cache , 就是想看看内存中library cache 的trace ,那么这里的<trace name> 就是“library_cache ”。
英文的表达是这样的:<trace name > 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 ”,你可以理解成它是一种特殊的<trace name> ,顾名思义,他是dump “内容”。
这里的3 个trace qualifiers 含义分别是:
“forever ”:表示这个trace 一旦设定,每当这个event 发生的时候,就激活这个trace 。
“off ”:表示对这个event 关闭这个trace 。
“level <n> ”:当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 <n> ]
这个里面“| ”表示“或者”,“[] ”表示出现一次或者多次。
上面已经清楚的介绍了event 的结构,回答了event 是什么?它是什么样子?的问题。
那么在oracle 中一共有哪些event 呢?oracle 中的event 有很多个,具体有哪些,在unix 或者类unix 系统中,可在文件“$ORACLE_HOME/rdbms/mesg/oraus.msg ”中查看。在大体上面,event 可以分为四类,,并且如何来设置这四类event 呢? 下面就来说说这个问题。