• sql跟踪方法相关介绍



    oracle sql跟踪方法:

    1、sql_trace
    打开跟踪:alter session set sql_trace=true;
    为跟踪文件做标记:alter session set tracefile_identifier='look_for_me';
    停止跟踪:alter session set sql_trace=false;
    最后生成的跟踪文件可以采用tkprof工具生成来查看。

    2、10046跟踪代码
    跟踪界别介绍:
    Level 0   停用SQL跟踪,相当于SQL_TRACE=FALSE
    Level 1   标准SQL跟踪,相当于SQL_TRACE=TRUE
    Level 4   在level 1的基础上增加绑定变量的信息
    Level 8   在level 1的基础上增加等待事件的信息
    Level 12 在level 1的基础上增加绑定变量和等待事件的信息

    打开跟踪:
    GRANT ALTER SESSION TO lttfm; --必须具有alter session权限
    alter session set events '10046 trace name context forever,level 12';--当前用户设置
    或者在init.ora文件中插入下面的行:event = 10046 trace name context forever,level 12;--为全局设置

    关闭跟踪:
    alter session set events '10046 trace name context off';--关闭用户跟踪

    注:sql_trace和10046设置代码跟踪只能针对本会话或者系统级进行会话跟踪,具体设置某个非本会话的跟踪需要采用oradebug或者
    dbms_system.set_ev或者dbms_monitor.session_trace_enable。

    3、使用oradebug
    --用如下语句找出要跟踪的spid
    select * from v$session a where audsid = userenv('sessionid'); --查询当前的sessionid
    select s.USERNAME,
           s.OSUSER,
           s.SID,
           s.PADDR,
           s.PROCESS,
           p.spid     os_process_id,
           p.pid      oracle_process_id
      from v$session s, v$process p
     where s.paddr = p.addr
       and s.username = upper('LTWEBGIS')
       and s.SID = 145;

    --设置跟踪进程id。
    SQL> connect / as sysdba
    SQL> oradebug setospid 5672;该语句为跟踪其他会话(5672为v$process的spid),

    若跟踪本会话,执行 oradebug setmypid。

    SQL> connect / as sysdba
    SQL> oradebug setorapid 15 --输入的15为v$process的pid

    --设置跟踪文件大小无限制
    SQL> oradebug unlimit;
    --设置跟踪,级别8
    SQL> oradebug event 10046 trace name context forever,level 8;
    已处理的语句

    --关闭跟踪
    SQL> oradebug event 10046 trace name context off;


    执行该语句(SQL> oradebug setospid 5672;)时,提示“ORA-01031: 权限不足”,
    原因:oradebug是sysdba的命令(一般用户执行提示权限不足),而且是sqlplus特有的命令,不能在plsql工具中执行(否则提示无效sql)。
    可以用oradebug help命令查看oradebug工具说明。


    4、dbms_system(必须用sys用户执行)
     exec dbms_system.set_ev(si => 159,se => 254,ev => 10046,le =>8 ,nm => '');--会话id等参数必须设置正确,否则trace无法生成
     生成后可用sql语句查看trace文件位置。

    --停止跟踪       
     exec dbms_system.set_ev(si => 159,se => 254,ev => 10046,le =>0 ,nm => '');

    5、dbms_monitor
    exec dbms_monitor.session_trace_enable(session_id => 136,serial_num => 4,waits => true,binds => true);
    exec dbms_monitor.session_trace_disable(session_id => 136,serial_num => 4);
    如果不设置session_id或者设置为null,则跟踪当前会话

    6、dbms_support
    exec dbms_support.start_trace_in_session(sid => 1234,serial# => 56789,waits => true,binds => true);
    exec dbms_support.stop_trace_in_session(sid => 1234,serial# => 56789);
    dbms_support默认情况下,系统不安装这个包。如果需要使用的话,需进行单独设置。在$ORACLE_HOME/rdbms/admin/目录下应该存在
    dbmssupp.sql,prvtsupp.plb这两个文件,执行这两个文件后才可使用,如果别的用户要使用,需要进行相应的授权,并创建同义词。

    注:3,4,5,6这几种跟踪方法都是在sys的用户下才能执行,可对任意会话进行跟踪。

    获取跟踪文件:
    1)oradebug获取跟踪文件
    --使用oradebug获取本会话跟踪文件位置
    SQL> oradebug setmypid
    SQL> oradebug tracefile_name

    --获取任意会话跟踪文件位置
    SQL> oradebug setospid 5392
    已处理的语句
    SQL> oradebug tracefile_name
    d:\oracle\product\10.2.0\admin\fgisdb\udump\fgisdb_ora_5600.trc


    2)sql获取跟踪文件

    --sql查看当前session跟踪文件位置
     SELECT d.value || '\' || lower(rtrim(i.instance_name, 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 instance_name FROM v$instance) i,
            (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d;

    --以下sql为查询输入的spid的会话跟踪文件
     select d.value || '\' || lower(rtrim(i.instance_name, chr(0))) || '_ora_' ||
           &spid || '.trc' trace_file_name
      from (SELECT instance_name FROM v$instance) i,
           (select value from v$parameter where name = 'user_dump_dest') d;

    查看跟踪级别
    1)查看当前session的跟踪级别(必须在sys用户下执行)
    declare
      event_level number;
    begin
      dbms_system.read_ev(10046,event_level);
      dbms_output.put_line(to_char(event_level));
    end;

    2)执行如下语句查看跟踪事件的跟踪级别

    SQL> oradebug setospid spid --先指定要查看跟踪级别的spid
    SQL> oradebug eventdump session
    10046 trace name CONTEXT level 8, forever

    注:如果开启了跟踪会话,但之后数据库关闭,那么跟踪自动关闭。

  • 相关阅读:
    微服务的优缺点及实践反思
    写在18点39分
    JDK并发包
    AI图1
    梦 周六
    高并发响应时间
    TLS~
    wait与sleep区别
    计算机领域的阿姆达尔定律(Amdahl’s law)
    看界面控件DevExpress WinForms——如何自定义辅助功能属性(下)
  • 原文地址:https://www.cnblogs.com/lanzi/p/2616606.html
Copyright © 2020-2023  润新知