OracleRDBMS提供了多种的诊断工具,诊断事件(Event)是其中一种常用、好用的方法,它使DBA可以方便的转储数据库各种结构及跟踪特定事件的发生。使用这些事件也不是件很高深的学问,举例来说10046这个Event你也一定用过吧,如下的几篇文章我将围绕Event展开一些讨论
 
 
一、Event的通常格式及分类
1通常格式如下:
EVENT="<事件名称><动作><跟踪项目><范围限定>"
2Event分类
诊断事件大体上可以分为四类:
a转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据文件头等内容。
b捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。
c改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置10269将会使Smon进程不去合并那些Free的空间。
d跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是10046了,将会对Sql进行跟踪。
3Michael R. Ault总结了下表:
 
跟踪类别
事件名称
动作(Action)
Name
跟踪项目
范围限定
转储类事件
immediate
Trace
“name”
blockdump
redohdr
file_hdrs
controlf
systemstate
Level block#
Level 10
Level 10
Level 10
Level 10
捕捉类事件
Error number
Trace
“name”
Error stack
processstate
Heapdump
Foreve
Off
Level nr
改变执行途径类事件
Even code corresponding to path
Trace
“name”
Context
Forever or
Level 10
跟踪类事件
10046
Trace
“name”
Context
Forever
Level n
off
 
4其它说明:
a如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。
btrace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。
clevel通常位于1-10之间(10046有时用到12)10意味着转储事件所有的信息。例如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内容。
d转储所生成的trace文件在user_dump_dest初始化参数指定的位置。
 
 
二、说一说设置的问题了
      可以在init.ora中设置所需的事件,这将对所有会话期打开的会话进行跟踪,也可以用alter session set event等方法设置事件跟踪,这将打开正在进行会话的事件跟踪。
1init.ora中设置跟踪事件的方法
a语法
EVENT=event语法|,level n|event语法|,level n|…”
b举例
event=”10231 trace name context forever,level 10’
c可以这样设置多个事件:
EVENT="
10231 trace name context forever, level 10:
10232 trace name context forever, level 10"
2通过Alter session/system set events这种方法
举个例子大家就明白了
Example:
Alter session set events ‘immediate trace name controlf level 10’;
Alter session set events ‘immediate trace name blockdump level 112511416’; (*)
oracle8x及之上的版本也有这样的语句:
Alter system dump datafile 13 block 15;实现的功能与(*)是类似的。
3、 使用DBMS_SYSTEM.SET_EV的方法
a. 过和定义如下
DBMS_SYSTEM.SET_EV(
SI Binary_integer,
SE Binary_integer,
EV Binary_integer,
LE Binary_integer,
NM Binary_integer);
SI: 即v$session中的sid
SE:即v$session中的serial#
EV:要设置的事件
LE:要设置事件的级别
NM:名称