dump oracle events(转)

本文详细介绍了 Oracle 数据库中的 Event 机制,包括 Event 的定义、类型及如何设置 Event 来诊断问题。Event 可用于即时转储、错误转储、行为变更及追踪等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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的定义很简单,可以简单的如下面这个图表示:

2271503062055384886.jpg

event = event_name + action。这里分别来解释一下它的两个组成要素。

首先,这里的event name是一个event的名字或者是event的代码。如果event name不是“immediate”,那么oracle解析器会在event name table中找到这个event。关于immediate event,它是一个特殊的event,它显示一个立即的无条件的event,它不会等待其他人去提交它而立即执行。

其次,这里的action是什么样子呢?如下:

5646950982769441622.jpg

也就是说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的可如下指定:

3387551344713286939.jpg

这里有必要解释一下,它就是你需要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呢?请看下图:

1762596304162722511.jpg

此图反应了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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值