• 如何跟踪某个session的SQL


    1 oracle自带的sql trace程序可以跟踪本地session

        sys: alter system set sql_trace = true;对所有会话跟踪

        schema: alter session set sql_trace = true; 对某个session 会话跟踪sql语句

       11g可以通过    select * from v$DIAG_INFO;来获取当前trace文件的位置

       10g可用:当前用户:
    SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
    from ( select p.spid from v$mystat m,v$session s, v$process p
          where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
        ( select t.instance from v$thread t,v$parameter v
          where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
        ( select value from v$parameter where name = 'user_dump_dest') d;

    如果是查询其他用户session的跟踪文件,则根据用户的sid和#serial使用如下查询:

    SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name

    from

        ( select p.spid from v$session s, v$process p

          where s.sid=’’ and s. SERIAL#='' and p.addr = s.paddr) p,

        ( select t.instance from v$thread t,v$parameter v

          where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,

        ( select value from v$parameter where name = 'user_dump_dest') d

         用tkprof 来格式化跟踪文件输出

        tkprof 输出内容包括 1 sql 语句 2统计信息 3explain table 执行计划

    2 基于DBMS_MONITOR包来跟踪会话,这种情况一般是

    通过该程序包可以跟踪从客户机到中间层、再到后端数据库的任何用户会话,从而可以较为容易的标识创建大量工作量的特定用户。
    会话:基于会话ID和序列号 DBMS_MONITOR.session_trace_enable(sid,serial#,true);
                             DBMS_MONITOR.session_trace_enable(sid,serial#,false);
    客户端标识符:允许跨越多个会话设置跟踪,基于登录ID指定终端用户。
                  客户端设置的参数:DBMS_SESSION.SET_IDENTIFIER过程设置该值
                  运行语句:dbms_monitor.client_id_trace_enable('identifier',true,false);
                           dbms_monitor.client_id_trace_disable('identifier');
    实例:基于实例名指定给定的实例
                  dbms_monitor.database_trace_enable(instance_name=>'orcl');
    服务名:指定一组相关的应用程序,使用DBMS_SERVICE.CREATE_SERVICE过程设置该值,
    dbms_monitor.serv_mod_act_trace_enable(service_name=>'orcl1',module_name=>'salary_update',action_name=>'insert_item');
    dbms_monitor.serv_mod_act_trace_disable(service_name=>'orcl1',module_name=>'salary_update',action_name=>'insert_item');
    模块名:开发人员在其应用程序代码中使用DBMS_APPLICATION_INFO.SET_MODULE程设置该值
    操作名:开发人员在其应用程序中使用DBMS_APPLICATION_INFO.SET_ACTION过程设置该值  trcsess提取跟踪文件,可以基于会话ID或者模块名称,具体参考trcsess帮助usage

     这个很常用

    3  DBMS_system包也可以跟踪系统中其他session的sql执行语句

      dbms_system.set_sql_trace_in_session(sid,serial#,true);

      dbms_system.set_sql_trace(true)跟踪本地session

    4 使用10046事件来实现

    运用10046进程sql跟踪
    全局或者session范围
    level 1
    level 4 : 1+bind variable
    level 8 : 1+wait events
    level 12 : 1 +4+8
    tkprof 的时候 4,8,12的信息被忽略
    全局设定,修改initial文件
    event='10046 trace name context forever,level12'
    alter system set events
    session设定
    alter session set events='10046 trace name context forever,level 8';
    alter session set events='10046 trace name context off';

    以上4中session跟踪方法,通过dbms_monitor,和dbms_system可以用来跟踪其他指定session的sql,其他两个方法都是本地

    session或者system级别的跟踪

  • 相关阅读:
    Oracle查看锁表并杀死进程
    Oracle查看表空间、是否开启扩展
    Linux日常命令记录
    【转载】LUbuntu,Ubuntu下设置自定义桌面分辨率
    windows下查找端口并杀死进程
    【转载】JAVA中IO流操作的基本规律总结
    【转载】hashCode()、equals()以及compareTo()方法的理解
    RuntimeException、Exception联系区别
    Java内存、数组
    【概念理解】同步异步、阻塞非阻塞
  • 原文地址:https://www.cnblogs.com/bolang100/p/6040585.html
Copyright © 2020-2023  润新知