通过如下的脚本可以获取所有的诊断事件列表:
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
常用跟踪事件见下表:
注:点击图片可查看清晰大图。