最近项目需要,让小弟跟踪进程调用的SQL,在网上浏览了一下,有几个工具,发现有几个问题,还是无法解答我的问题,列举一下:
1、Tord For Oracle中的 SQL Monitor。
    大部分的进程都可以跟踪到,但是也有一部分无法跟踪,SQL Monitor跟踪调用,是在哪里访问到SQL文件的,数据库连接池中吗?2、Qracle Enterprise Management Packs 中的 TopSessions。
    怎样跟踪生命周期只有几秒的进程?调整了刷新速率也不行,还没有等我继续操作,进程就在列表中消失了,有什么解决方法?
3、SQL_TRACE。
    AUTOTRACE功能,我按照网上的方法配置以后获取不到跟踪文件,有没有实际的使用例子可以教导一下?
4、总结一下,哪个方法比较好?为什么?能否说明一下跟踪SQL文件的工作原理?本人比较白痴,问的问题有些不靠谱,大家没看明白可以跟帖提问,需要我贴截图或代码也请提出。
很需要解决这个问题,我一直在等,大家多多包涵以上,多谢多谢

解决方案 »

  1.   

    set trace 也有好几种的,不知道你是哪种,跟踪文件在$ORACLE_BASE/admin/$ORACLE_SID/udump下
      

  2.   

    你的跟踪具体是什么要求,实时跟踪,在服务器上跟踪,还是远程Tord For Oracle中的 SQL Monitor
    这个没有用过,估计这个应该是用oracle里的v$sql动态视图来进行监控的。这里可以查看运行的sql。但是有一定的局限,share词小的话,会没有了,实例重启也会没有了。SQL_TRACE
    sql trace有直接在sqlplus环境里用的,这样只能看到自己session的。也可以通过全局设置的,但是都需要服务器里的udump文件,这个方法,没有上面的局限,但是有本地文件的局限。方法没有最好,最有最合适。
      

  3.   

    你所谓的auto_trace应该是dbms_system.set_sql_trace_in_session完全满足你需求。
      

  4.   

    默认的路径下找不到,很郁闷,我贴上我配置的代码,是不是没有配置完全
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 9月 8 09:44:07 2009Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    连接到: 
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - ProductionSQL> set autotrace trace
    SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色
    SP2-0611: 启用STATISTICS报告时出错
    SQL> conn system/manager
    ERROR:
    ORA-01017: invalid username/password; logon denied
    警告: 您不再连接到 ORACLE。
    SQL> conn tj_mis/ok
    已连接。
    SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql;
    SP2-0310: 无法打开文件"$ORACLE_HOME/sqlplus/admin/plustrce.sql"
    SQL> drop roleplustrace;
    drop roleplustrace
         *
    ERROR 位于第 1 行:
    ORA-00950: 无效 DROP 选项
    SQL> select sid,serial#,username from v$session;
    select sid,serial#,username from v$session
                                     *
    ERROR 位于第 1 行:
    ORA-00942: 表或视图不存在
    SQL> select sid,serial#,program,user,osuser from v$session;
    select sid,serial#,program,user,osuser from v$session
                                                *
    ERROR 位于第 1 行:
    ORA-00942: 表或视图不存在
    SQL> exec dbms_system.set_sql_trace_in_session(16,1281,true);
    BEGIN dbms_system.set_sql_trace_in_session(16,1281,true); END;      *
    ERROR 位于第 1 行:
    ORA-06550: 第 1 行, 第 7 列:
    PLS-00201: 必须说明标识符 'DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION'
    ORA-06550: 第 1 行, 第 7 列:
    PL/SQL: Statement ignored
    SQL> conn system/system
    已连接。
    SQL> select sid,serial#,program,user,osuser from v$session;       SID    SERIAL#
    ---------- ----------
    PROGRAM
    ----------------------------------------------------------------
    USER                           OSUSER
    ------------------------------ ------------------------------        16       1281
    GateCtrl.exe
    SYSTEM                         YANGJIN\YanGin        17        183
    sqlplusw.exe已选择14行。SQL> grant  execute  on  dbms_system to  system;授权成功。SQL> exec sys.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(16,1281,true);PL/SQL 过程已成功完成。SQL> select sid,serial#  from v$session where username ='GateCtrl.exe'
      2  
    SQL> /未选定行SQL> exec sys.dbms_system.set_sql_trace_in_session(21,777,true);PL/SQL 过程已成功完成。SQL> grant select on v_$sesstat to plustrace;授权成功。SQL> grant select on v_$statname to plustrace;授权成功。SQL> grant select on v_$mystat to plustrace;授权成功。SQL> grant plustrace to dba with admin option;授权成功。
      

  5.   


    我也觉得用auto_trace比较好
      

  6.   

    sys连接上去,show parameter user_dump出来的就是trace文件路径
      

  7.   

    我需要实时跟踪,Oracle直接在本地安装配置的我运行下面的SQL语句也试图查询当前运行的SQL,但是查询出来的结果很奇怪
    select
        b.sql_text
    from
        v$session a,
        v$sqltext b,
        v$sqlarea c
    where
        a.sql_address = b.address 
        and b.address = c.address 
        and a.username ='TJ_PLAN' 
        and a.program ='GateCtrl.exe'v$sqltext.sql_text 也有字段长度限制,要怎么解决呢?
    查询结果:
      SQL_TEXT
    1.banner like 'Oracle%'
    2.select '00.00.0000 '||banner, user, 99/100 from v$version where 感觉好像没有抓到因为什么都不懂,所以找不到最好的方法
      

  8.   

    有没有关于介绍SQL_TRACE的资料呢,我需要扫盲
      

  9.   

    看你的需求,就是想跟踪由前台应用程序调用或者别的oracle session直接执行的SQL。
    就是我说的方法:
    1.exec sys.dbms_system.set_sql_trace_in_session(21,777,true);
    2.exec sys.dbms_system.set_sql_trace_in_session(21,777,false);
    3.执行:
    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 p.addr = s.paddr and s.sid=&sid) 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;
    执行时输入跟踪的sid,如这里的21以上都是sys执行。
      

  10.   


    这样做实时监控,消耗太大了哟,执行一个sql,就去trc文件你查一把,好像不是一个好方法。你是实时的可以用通过v$sql动态表的数据监控来查看。
      

  11.   

    这个是什么意思?怎么会执行一个sql,就要去trc文件里查一下。