合 Oracle中的SQL_TRACE是什么?诊断事件event是什么?常用的events有哪些?常用的10046及10053诊断事件的区别是什么?
Tags: Oracle诊断events1004610053SQL_TRACE诊断事件
SQL_TRACE
SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具。在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。可以设置SQL_TRACE为TRUE,但是一般不推荐在全局指定为TRUE,只建议在会话级别指定。若在全局设定则对性能会造成较大影响。
诊断事件
Oracle为数据库提供了多种的诊断工具,诊断事件(Event)是其中一种非常实用的方法,它能使DBA可以方便地转储数据库各种结构及跟踪特定事件的发生过程。
通过如下的脚本可以获取所有的诊断事件列表:
1 2 3 4 5 6 7 8 9 10 11 12 | 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; / |
在Linux系统下诊断事件的消息文件放在目录:$ORACLE_HOME/rdbms/mesg/oraus.msg
。oraus.msg文件属于文本文件,可以直接打开查看。
诊断事件可以像普通的ORA错误一样采用oerr命令来查询,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [oracle@orclalhr ~]$ oerr ora 10046 10046, 00000, "enable SQL statement timing" // *Cause: // *Action: [oracle@orclalhr ~]$ oerr ora 10053 10053, 00000, "CBO Enable optimizer trace" // *Cause: // *Action: [oracle@orclalhr ~]$ oerr ora 10704 10704, 00000, "Print out information about what enqueues are being obtained" // *Cause: When enabled, prints out arguments to calls to ksqcmi and // ksqlrl and the return values. // *Action: Level indicates details: // Level: 1-4: print out basic info for ksqlrl, ksqcmi // 5-9: also print out stuff in callbacks: ksqlac, ksqlop // 10+: also print out time for each line |
设置诊断事件有两种方法,一种是在pfile参数文件中设置事件,这样数据库在OPEN后,将影响到所有的会话。设置格式如下:
1 | event="eventnumber trace name eventname [forever,] [level levelnumber] : ......." |
通过冒号(:)符号,可以连续设置多个事件,也可以通过连续使用event来设置多个事件。如:
1 | event = "10248 trace name context forever, level 10:10249 trace name context forever, level 10" |
或者分开写,如:
1 2 | event="10248 trace name context forever, level 10" event="10249 trace name context forever, level 10" |
另一种方法是在会话过程中使用ALTER SESSION SET EVENTS命令,只对当前会话有影响。设置格式如下:
1 | ALTER SESSION|SYSTEM SET EVENTS '[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : .......' |
通过英文冒号(:)符号,可以连续设置多个事件,也可以通过连续使用ALTER SESSION SET EVENTS来设置多个事件,如:
1 2 3 4 5 6 | ALTER SYSTEM SET EVENTS='10325 trace name context forever, level 10','10015 trace name context forever, level 1' COMMENT='Debug tracing of control and rollback'; -- 或: ALTER SYSTEM SET EVENTS='10325 trace name context forever, level 10:10015 trace name context forever, level 1'; |
格式说明:
eventnumber指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或Oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用。
immediate关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在ALTER SESSION语句中,并且不能与eventnumber、forever关键字同用。
trace name是关键词,trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。
eventname指事件名称,即要进行dump的实际结构名。若eventname为context,则指根据内部事件号进行跟踪。
forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。
level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例如当转储控制文件时,level 1表示转储控制文件头,而level 10表明转储控制文件全部内容。
levelnumber表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。
转储所生成的trace文件在user_dump_dest初始化参数指定的位置。
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!