如何收集用来诊断性能问题的10046 Trace

  注:本文参见MOS(my oracle support) 文档Document:376442.1- * How To Collect 10046 Trace (SQL_TRACE)        

    Event 10046是为Oracle session收集扩展sql_trace信息的标准方法。通常为了诊断 SQL调优类问题,我们需要记录下这些语句在执行过程中产生的等待以及bind variables(绑定变量)的信息。 这些信息可以通过级别为12的10046 trace获得。
    本文列举了几种有效地收集10046 Trace的方法,用于诊断查询性能方面的问题。
    本文适用于Oracle Server Enterprise Edition  Version: 8.1.5.0 to 11.2.0.3,适用于任何平台。
    下面的例子列举了在各种场景下,如何设定10046事件。

1、Trace文件的位置
      11g R1以后:
      从11gR1开始,Oracle引入了新的诊断结构,以参数DIAGNOSTIC_DEST控制存放trace文件与core文件的路径。
     可以用以下命令,获取DIAGNOSTIC_DEST的位置:SQL> show parameter diagnostic_dest
    11gR1以前:
     如果是用户进程,10046 trace文件会被生成在user_dump_dest下;
     如果是后台进程,trace文件会被生成在    background_dump_dest下。
    下面的命令可以显示user_dump_dest:SQL> show parameter user_dump_dest

2、在Session级打开trace
    适用于SQL语句可以在新的session创建后再运行。
    在session级收集10046 trace:
    alter session set tracefile_identifier='10046';
    alter session set timed_statistics = true;
    alter session set statistics_level=all;
    alter session set max_dump_file_size = unlimited;
    alter session set events '10046 trace name context forever,level 12';
    -- 执行需要被trace的SQL --
    select * from dual;
    exit;
    如果不退出当前session, 可以用以下命令关闭trace:
    alter session set events '10046 trace name context off';
    注意,如果session没有被彻底地关闭并且跟踪被停止了,某些重要的trace信息的可能会丢失。

3、跟踪一个已经开始的进程
    如果需要跟踪一个已经存在session,可以用 oradebug连接到session上,并发起10046 trace。
    a. 首先,用某种方法找到需要被跟踪的session.
        例如,在SQL*Plus里,找出目标session的OS的进程ID(spid):
        select p.PID,p.SPID,s.SID from v$process p,v$session s  where s.paddr = p.addr and s.sid = &SESSION_ID
        注:SPID 是操作系统的进程标识符(os pid),PID 是Oracle的进程标识符(ora pid)。
    b. 一旦找到OS PID,就可以用以下命令初始化跟踪:
       假设需要被跟踪的OSPID是9834. 以sysdba的身份登录到SQL*Plus并执行下面的命令:
       connect / as sysdba
       oradebug setospid 9834
       oradebug unlimit
       oradebug event 10046 trace name context forever,level 12
      (记得把例子中的'9834' 替换成真实的os pid.)
       Note: 也可以通过oradebug使用 'setorapid'命令连接到一个session。
     c、下面的例中, 使用PID(Oracle进程标识符)(而不是SPID), oradebug命令将被改为:
        connect / as sysdba
        oradebug setorapid 9834
        oradebug unlimit
        oradebug event 10046 trace name context forever,level 12
      (记得把例子中的9834替换成真实的ora pid).
        跟踪过程完成以后,关闭oradebug跟踪:oradebug event 10046 trace name context off

4、实例层的跟踪
      注意: 在实例层设置跟踪需要非常小心,这是因为整体性能会由于所有session都被跟踪而受到影响。
      这个设置将会跟踪在这个参数设置“以后”创建的每个session。已经存在的session不会被跟踪。
      系统层的10046跟踪适用于当我们知道问题session会出现,但是不能预先识别它的时候。在这种情况下,可以打开系统层跟踪一小段时间,当问题被重现以后立即将其关闭,然后从已经生成的trace中查找需要的信息。
     用以下命令打开系统层的跟踪:
     alter system set events '10046 trace name context forever,level 12';
     用以下命令关闭在所有session中的10046跟踪:
     alter system set events '10046 trace name context off';

     初始化参数设置:
     设置以下参数并重新启动实例后,实例上所有的session都会打开跟踪。
     event="10046 trace name context forever,level 12"
     移除这个参数并且重启实例, 或者使用下面的alter system命令可以关闭跟踪。
     alter system set events '10046 trace name context off';


5、通过logon trigger设置跟踪
     有的时候当需要跟踪某个特定用户的操作时,可以使用logon trigger来打开跟踪,下面是一个例子:
     CREATE OR REPLACE TRIGGER SYS.set_trace
     AFTER LOGON ON DATABASE
     WHEN (USER like '&USERNAME')
     DECLARE
     lcommand varchar(200);
     BEGIN
     EXECUTE IMMEDIATE 'alter session set statistics_level=ALL';
     EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED';
     EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
     END set_trace;
     /
    为了能打开跟踪session, 执行trigger的用户需要被显式地授予'alter session' 权限. 例如,
    grant alter session to <USERNAME> ;

6、获取跟踪文件
    以上生成的跟踪文件位置及文件名可以通过以下SQL查询获得:

    SQL> select
  2    d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
  3  from
  4    ( select p.spid
  5      from sys.v$mystat m,sys.v$session s,sys.v$process p
  6      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
  7    ( select t.instance from sys.v$thread  t,sys.v$parameter  v
  8      where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
  9    ( select value from sys.v$parameter where name = 'user_dump_dest') d
10  /

  TRACE_FILE_NAME
   --------------------------------------------------------------------------------
  /opt/oracle/admin/hsjf/udump/kjdb1_ora_1234.trc      


7、Trace文件解析
     trace文件的详细解析可参见下述文档。
    Document:199081.1 SQL_TRACE (10046), TKProf and Explain Plan - Overview Reference
    Document:39817.1 Interpreting Raw SQL_TRACE and DBMS_SUPPORT.START_TRACE output
    Document:224270.1 Trace Analyzer TRCANLZR - Interpreting Raw SQL Traces with Binds and/or Waits generated by EVENT 10046
    Document:41634.1 - TKProf Basic Overview
    Document:760786.1 - TKProf Interpretation (9i and above)
    Document:214106.1 - Using TKProf to compare actual and predicted row counts

你可能感兴趣的:(如何收集用来诊断性能问题的10046 Trace)