前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试686】在Oracle中,SQL_TRACE是什么?诊断事件是什么?

【DB笔试面试686】在Oracle中,SQL_TRACE是什么?诊断事件是什么?

作者头像
小麦苗DBA宝典
发布2019-11-14 00:31:26
6220
发布2019-11-14 00:31:26
举报

题目部分

在Oracle中,SQL_TRACE是什么?诊断事件是什么?

答案部分

(一)SQL_TRACE

SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具。在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。可以设置SQL_TRACE为TRUE,但是一般不推荐在全局指定为TRUE,只建议在会话级别指定。若在全局设定则对性能会造成较大影响。

(二)诊断事件

Oracle为数据库提供了多种的诊断工具,诊断事件(Event)是其中一种非常实用的方法,它能使DBA可以方便地转储数据库各种结构及跟踪特定事件的发生过程。

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

代码语言:javascript
复制
 1DECLARE
 2  ERR_MSG VARCHAR2(32767);
 3BEGIN
 4  DBMS_OUTPUT.ENABLE('');
 5  FOR ERR_NUM IN 10000 .. 10999 LOOP
 6    ERR_MSG := SQLERRM(-ERR_NUM);
 7    IF ERR_MSG NOT LIKE '%Message ' || ERR_NUM || ' not found%' THEN
 8      DBMS_OUTPUT.PUT_LINE(ERR_MSG);
 9    END IF;
10  END LOOP;
11END;
12/

在Linux系统下诊断事件的消息文件放在目录:$ORACLE_HOME/rdbms/mesg/oraus.msg。oraus.msg文件属于文本文件,可以直接打开查看。

诊断事件可以像普通的ORA错误一样采用oerr命令来查询,如下所示:

代码语言:javascript
复制
 1[oracle@orclalhr ~]$ oerr ora 10046
 210046, 00000, "enable SQL statement timing"
 3// *Cause:
 4// *Action:
 5[oracle@orclalhr ~]$ oerr ora 10053
 610053, 00000, "CBO Enable optimizer trace"
 7// *Cause:
 8// *Action:
 9[oracle@orclalhr ~]$ oerr ora 10704
1010704, 00000, "Print out information about what enqueues are being obtained"
11// *Cause:  When enabled, prints out arguments to calls to ksqcmi and
12//          ksqlrl and the return values.
13// *Action: Level indicates details:
14//   Level: 1-4: print out basic info for ksqlrl, ksqcmi
15//          5-9: also print out stuff in callbacks:  ksqlac, ksqlop
16//          10+: also print out time for each line

设置诊断事件有两种方法,一种是在pfile参数文件中设置事件,这样数据库在OPEN后,将影响到所有的会话。设置格式如下:

代码语言:javascript
复制
1event="eventnumber trace name eventname [forever,] [level levelnumber] : ......."

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

代码语言:javascript
复制
1event = "10248 trace name context forever, level 10:10249 trace name context forever, level 10"

或者分开写,如:

代码语言:javascript
复制
1event="10248 trace name context forever, level 10"
2event="10249 trace name context forever, level 10"

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

代码语言:javascript
复制
1ALTER SESSION|SYSTEM SET EVENTS '[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : .......' 

通过英文冒号(:)符号,可以连续设置多个事件,也可以通过连续使用ALTER SESSION SET EVENTS来设置多个事件,如:

代码语言:javascript
复制
1ALTER SYSTEM SET 
2           EVENTS='10325 trace name context forever, level 10','10015 trace name context forever, level 1' 
3           COMMENT='Debug tracing of control and rollback';

或:

代码语言:javascript
复制
1ALTER SYSTEM SET EVENTS='10325 trace name context forever, level 10:10015 trace name context forever, level 1';

格式说明:

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意味着转储事件所有的信息。例如当转储控制文件时,level 1表示转储控制文件头,而level 10表明转储控制文件全部内容。

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

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

l 移除所有的诊断事件(Event):

代码语言:javascript
复制
1ALTER SYSTEM RESET EVENT SCOPE=SPFILE SID='*' ;

如果设置了诊断事件(Event),那么如何知道在系统中设置了哪些诊断事件(Event)呢?如果事件是在pfile文件中设置的,那么可以用“SHOW PARAMETER EVENT”来查看。如果是通过“ALTER SYSTEM|SESSION”来设置的,那么可以使用如下的SQL来查看:

代码语言:javascript
复制
 1SET SERVEROUTPUT ON SIZE 1000000
 2DECLARE
 3  EVENT_LEVEL NUMBER;
 4BEGIN
 5  FOR I IN 10000 .. 99999 LOOP
 6    SYS.DBMS_SYSTEM.READ_EV(I, EVENT_LEVEL);
 7    IF (EVENT_LEVEL > 0) THEN
 8      DBMS_OUTPUT.PUT_LINE('Event ' || TO_CHAR(I) || ' set at level ' ||TO_CHAR(EVENT_LEVEL));
 9    END IF;
10  END LOOP;
11END;
12/
13

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

代码语言:javascript
复制
1SYS@orclasm > oradebug setmypid
2SYS@orclasm > oradebug eventdump system
3SYS@orclasm > oradebug eventdump session

设置诊断事件需要注意的是,即可以使用“ALTER SYSTEM EVENTS”,也可以使用“ALTER SYSTEM EVENT”,它们的区别在如下2点:

① EVENTS可以动态修改,可以使用“ALTER SESSION”或“ALTER SYSTEM”设置,只影响内存不影响参数文件

② EVENT不能动态修改,只能使用“ALTER SYSTEM”或在参数文件里设置,必须重启库方可生效

另外,“ALTER SYSTEM”会记录到告警日志中,“ALTER SESSION”不会记录在告警日志中。

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档