通过如下的脚本可以获取所有的诊断事件列表:

SET SERVEROUTPUT ON

SET LINE 9999

DECLARE

  ERR_MSG VARCHAR2(32767);

BEGIN

  DBMS_OUTPUT.ENABLE('');

  FOR ERR_NUM IN 10000 .. 10999 LOOP

    ERR_MSG := SQLERRM(-ERR_NUM);

    IF ERR_MSG NOT LIKE '%Message ' || ERR_NUM || ' not found%' THEN

      DBMS_OUTPUT.PUT_LINE(ERR_MSG);

    END IF;

 

 END LOOP;

END;

/

在UNIX系统下message文件在目录$ORACLE_HOME/rdbms/mesg/oraus.msg,oraus.msg文件属于文本文件,可以直接打开查看。

诊断事件可以像普通的错误一样采用命令oerr来查询。


一、Oracle跟踪文件 

  Oracle跟踪文件分为三种类型:


  一种是后台报警日志文件,记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、错误消息等。在数据库出现故障时,应首先查看该文件,但文件中的信息与任何错误状态没有必然的联系。后台报警日志文件保存BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为SIDALRT.LOG。


  另一种类型是DBWR、LGWR、SMON等后台进程创建的后台跟踪文件。后台跟踪文件根据后台进程运行情况产生,后台跟踪文件也保存在BACKGROUND_DUMP_DEST参数指定的目录中,文件格式为siddbwr.trc、sidsmon.trc等。


  还有一种类型是由连接到Oracle的用户进程(Server Processes)生成的用户跟踪文件。这些文件仅在用户会话期间遇到错误时产生。此外,用户可以通过执行oracle跟踪事件(见后面)来生成该类文件,用户跟踪文件保存在USER_DUMP_DEST参数指定的目录中,文件格式为oraxxxxx.trc,xxxxx为创建文件的进程号(或线程号)。


二、Oracle跟踪事件 

  


Events事件是Oracle的重要诊断工具及问题解决办法,很多时候需要通过Events设置来屏蔽或者更改Oracle的行为。

诊断事件大体上可以分为四类:

① 转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据文件头等内容。

② 捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。

③ 改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置10269将会使Smon进程不去合并那些Free的空间。

④ 跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是10046了,将会对Sql进行跟踪。


Oracle提供了一类命令,可以将Oracle各类内部结构中所包含的信息转储(dump)到跟踪文件中,以便用户能根据文件内容来解决各种故障。

设置跟踪事件有两种方法,

一种是在init.ora文件中设置事件,这样open数据库后,将影响到所有的会话。设置格式如下:

EVENT="eventnumber trace name eventname [forever,] [level levelnumber] : ......."

通过冒号(:)符号,可以连续设置多个事件,也可以通过连续使用event来设置多个事件。如:


event = "10248 trace name context forever, level 10:10249 trace name context forever, level 10"

或者分开写,如:

event="10248 trace name context forever, level 10"

event="10249 trace name context forever, level 10"

另一种方法是在会话过程中使用alter session set events命令,只对当前会话有影响。设置格式如下:

alter session|system set events '[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : .......'

通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set events 来设置多个事件。

 ALTER SYSTEM SET

           EVENT='10325 trace name context forever, level 10','10015 trace name context forever, level 1'

           COMMENT='Debug tracing of control and rollback' SCOPE=SPFILE;  

或:

alter system set event='10325 trace name context forever, level 10:10015 trace name context forever, level 1' scope=spfile;

格式说明:

l eventnumber指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用。

l immediate关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与eventnumber、forever关键字同用。

l trace name 是关键字,trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。

l eventname指事件名称,即要进行dump的实际结构名。若eventname为context,则指根据内部事件号进行跟踪。

l forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。

l level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内容。

l levelnumber表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。

l 转储所生成的trace文件在user_dump_dest初始化参数指定的位置。

l 移除所有的events:

ALTER SYSTEM RESET EVENT SCOPE=SPFILE SID='*' ;


  如何知道在系统中设置了哪些event?

a.如果你的事件是在init.ora中设置的可以用show parameter event;来查看

b.可以使用如下的SQL:



set serveroutput on size 1000000

DECLARE

  EVENT_LEVEL NUMBER;

BEGIN

  FOR I IN 10000 .. 99999 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;

/


但是,10046和10053事件不能通过这种方式查询,只能通过oradebug来查询。

SYS@orclasm > oradebug setmypid

SYS@orclasm > oradebug eventdump system

SYS@orclasm > oradebug eventdump session


2.6 alter system events与alter system event的区别

结论:

1、events可以动态修改,可以使用alter session或alter system设置,只影响内里不影响参数文件

2、event不能动态修改,只能使用alter system或在参数文件里设置,必须重启库方可生效


alter system会记录到告警日志中,alter session不会记录在告警日志中。


四. 示例 


4.1  查看当前trc 文件 

select 

  u_dump.value || '/' || 

  db_name.value || '_ora_' || 

  v$process.spid || 

  nvl2(v$process.traceid, '_' || v$process.traceid, null ) 

  || '.trc' "Trace File" 

from 

v$parameter u_dump 

cross join v$parameter db_name 

cross join v$process 

join v$session 

on v$process.addr = v$session.paddr 

where 

  u_dump.name = 'user_dump_dest' and 

  db_name.name = 'db_name' and 

  v$session.audsid=sys_context('userenv','sessionid'); 

eg: 

/oracle/product/10.2.0/admin/dw/udump\dw_ora_389530.trc 


4.2  执行event 


alter session set events '10046 trace name context forever, level 1'; 

select count(1) from all_tables; 

alter session set events '10046 trace name context off' ; 


4.3 在查看dw_ora_389530.trc


$dw_ora_389530.trc


常用跟踪事件见下表:


【事件】Oracle所有诊断事件列表events--总结_Oracle

【事件】Oracle所有诊断事件列表events--总结_Oracle_02

注:点击图片可查看清晰大图。