一、Event的通常格式及分类
1、 通常格式如下:
跟踪类别
|
事件名称
|
动作 (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 |
本文作者:
可以在init.ora中设置所需的事件,这将对所有会话期打开的会话进行跟踪,也可以用alter session set event 等方法设置事件跟踪,这将打开正在进行会话的事件跟踪。
1、 在init.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:名称
b. 举个例子,以10046为例
SQL> EXECUTE SYS.DBMS_SYSTEM.SET_EV(sid,serial#,10046,12,'');
4、 使用Oradebug来设置诊断事件的方法
同样举个例子大家就明白了:
a. 找到spid
SQL>select username, sid, serial#, paddr from v$session where username='qiuyb';
USERNAME SID SERIAL# PADDR
--------------------------------------------------------
HRB3 265 910 C000000084435AD8
SQL>SELECT ADDR,PID,SPID FROM V$PROCESS WHERE ADDR= C000000084435AD8';
ADDR PID SPID
------------------------------------------
C000000084435AD8 91 4835
b. 设置事件,以10046为例
sqlplus /nolog
SQL>connect / as sysdba;
SQL>oradebug setospid 4835
SQL>oradebug unlimit --不限制转储文件的大小
SQL> oradebug event 10046 trace name context forever,level 12 --设置事件进行sql跟踪
SQL> oradebug event 10046 trace name context off --关闭跟踪
注意不要用oradug去跟踪oracle的smon,pmon等几个进程,操作不当可能会杀掉这几个后台进和引起宕库。
三、你可能的问题
1、 我如何知道在系统中设置了哪些event?
回答:
a. 如果你的事件是在init.ora中设置的可以用
SQL>show parameter event;
来查看
b. Michael R.Ault给的SQL
serveroutput on size 1000000
declare
event_level number;
begin
for i in 10000..10999 loop
sys.dbms_system.read_ev(i,event_level);
if (event_level > 0) then
dbms_output.put_line('Event '||to_char(i)||' set at level '||
to_char(event_level));
end if;
end loop;
end;
/
2、 在oracle9i中使用spfile的那种如何设置诊断事件呢?
回答:
简单,Alter system命令就可以完成
alter system set event='10046 trace name context forever, level 12' scope=spfile;
重启一下就生效了。
3、 坏了,我的9i设置完诊断事件,起不来了,报ORA-02194错怎么办?
回答:
那你一定是在使用Alter system时把某一项写错了,比如把context写成了conetxt了,可以做如下的解决:
a.由spfile生成pfile
SQL>create pfile from spfile;
File created.
b.编辑pfile以修正错误
Change... *.event='10046 trace name conetxt forever, level 12'
-to- *.event='10046 trace name context forever, level 12'
c.用pfile启动
SQL>startup pfile=/.....
d.重新生成 SPFILE.
SQL>create spfile from pfile;
File created.