如果对数据库audit,就可以查到了。

解决方案 »

  1.   

    你的数据库模式是归档模式的话,并且所有归档日志均完整,可以用Loginer分析出来。
      

  2.   

    把我查到都贴出来吧1.用sqltrace工具2。
    Alter session set sql_trace true|false 
    Or         
    Exec dbms_session.set_sql_trace(TRUE);3用oracle的trace功能,
    这是跟踪某个session的语句:1.设置参数
    sys.dbms_system.set_bool_param_in_session(
       sid     => 42,
       serial# => 1215,
       parnam  => 'timed_statistics',
       bval    => true)sys.dbms_system.set_int_param_in_session(
       sid     => 42,
       serial# => 1215,
       parnam  => 'max_dump_file_size',
       intval  => 2147483647)
    如果上面的存储过程不运行,将其合并成一行。-- 可以不用设置该参数
    'user_dump_dest',2.开始收集
    exec sys.dbms_system.set_sql_trace_in_session(8,121,true);
    注意,只有跟踪的session再次发出sql语句后,才会产生trc文件
    3.等待一段时间,让其收集sql语句4.停止收集
    exec sys.dbms_system.set_sql_trace_in_session(8,121,false);5.对产生的trace文件进行收集
    tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER
    (a)        tkprof tracefile.trc sort_1.prf explain=apps/your_apps_password print=10 sort='(prsqry,exeqry,fchqry,prscu,execu,fchcu)' 
    (b) tkprof tracefile.trc sort_2.prf explain=apps/your_apps_password print=10 sort='(prsela,exeela,fchela)' 
    (c) tkprof tracefile.trc sort_3.prf explain=apps/your_apps_password print=10 sort='(prscnt,execnt,fchcnt)' 
    (d) tkprof tracefile.trc normal.prf explain=apps/your_apps_password你可以使用oracle审计功能 
    你还可以访问v$sql,v$sqlarea,里面都是最近访问的sql。回复: 在oracle 8.1.7中,如何象sql的事件跟踪器一样实时跟踪应用程序对库的操作?要跟踪全部,最好在应用程序中实现 
    也可以用审计,logminer 
    审计只能跟踪sql对数据库对象的访问类型. 
    要跟踪实时的信息,可以查询v$session,v$sqlarea
    Event 10065 - Restrict Library Cache Dump Output for State Object Dumps 
    The amount of library cache dump output for state object dumps can be limited using event 10065  
      
         ALTER SESSION SET EVENTS '10065 trace name context forever, level level'; 
      
    where level is one of the following  
      
      Level Description  
    1 Address of library object only  
    2 As level 1 plus library object lock details  
    3 As level 2 plus library object handle and library object  
       
      
    Level 3 is the default  
      
    Event 10704 - Trace Enqueues 
    This event dumps information about which enqueues are being obtained  
      
    When enabled it prints out arguments to calls to ksqcmi and ksqlrl and the return values  
      
         ALTER SESSION SET EVENTS 
         '10704 trace name context forever, level 1'; 
      
    Event 10706 - Trace Global Enqueue Manipulation 
    This event allows RAC global enqueue manipulation to be trace  
      
         ALTER SESSION SET EVENTS 
         '10706 trace name context forever, level 1'; 
      
    The amount of output can be limited using the unsupported parameter '_ksi_trace'.  
      
    This parameter specifies the lock types that should be included e.g. TM, TX etc. They are specified as a string e.g. 'TMTX'  
      
    The parameter '_ksi_trace' can only be set in the initialisation file.  
      
    Event 10053 - Dump Optimizer Decisions 
    This event can be used to dump the decisions made by the optimizer when parsing a statement. Level 1 is the most detailed  
      
    For example  
      
         ALTER SESSION SET EVENTS 
         '10053 trace name context forever, level 1'; 
      
    Levels are  
      
      Level Action  
    1 Print statistics and computations  
    2 Print computations only  
       
      
    ORA-10005: trace latch operations for debugging 
      
    你可以用 
    SET SERVEROUTPUT ON 
          
         DECLARE  
           err_msg VARCHAR2(120); 
         BEGIN 
           dbms_output.enable (1000000); 
           FOR err_num IN 10000..10999 
           LOOP 
             err_msg := SQLERRM (-err_num); 
             IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN 
               dbms_output.put_line (err_msg); 
             END IF; 
           END LOOP; 
         END; 
         / 
    来看所有的events,oracle提供了强大的跟踪工具,如果要深入了解内部机制,这些events会有帮助
    You can analyze the redo log (online and archived) by using the LogMiner. 
      
    1. Create a LogMiner Dictory File 
       1. Create DBMS_logmnr_d & DBMS_logmnr package  
         using $ORACLE_HOME/rdbms/admin/DBMSLOGMNRD.sql & $ORACLE_HOME/rdbms/admin/DBMSLOGMNRD.sql 
      
       2. Shutdown Database 
      
       3. set UTL_FILE_DIR parameter into initSID.ora file 
      
       4. Startup Database 
      
       5. Create LogMiner File using 
         begin dbms_logmnr_d.build( 
           dictionary_filename => 'DB01Dict.ora', 
           dictionary_location => 'E:\ORANT\logminer'); 
         end; 
      
    2. Specifying Log Files 
       1. New Log File 
         begin dbms_logmnr.add_logfile( 
           logfilename => 'E:\ORANT\logminer\s24.arc' , 
           Options => dbms_logmnr.New); 
         end; 
       2. Add Log Files 
         begin dbms_logmnr.add_logfile( 
           logfilename => 'E:\ORANT\logminer\s24.arc' , 
           Options => dbms_logmnr.AddFile); 
         end; 
       3. Remove log Files 
         begin dbms_logmnr.add_logfile( 
           logfilename => 'E:\ORANT\logminer\s24.arc', 
           Options => dbms_logmnr.RemoveFile); 
         end;   
      
    3. Start LogMiner 
       begin dbms_logmnr.start_logmnr(dictfilename => 'E:\ORANT\logminer\DB01Dict.ora'); end; 
      
    4. Release resource 
       begin dbms_logmnr.end_logmnr; end; 
      
    5. Get Result 
       Select * from v$logmnr_contents;
    回复: 关于PL/SQL语句的跟踪!Run 
    \\\oracle\RDBMS\ADMIN\utlxplan.sql    first  
      
    then  
    sql>set autotrace on 
      

  3.   

    我转帖一篇关于sqltrace的使用使用SQL_TRACE进行数据库诊断作者:eygleSQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
    本文就SQL_TRACE的使用作简单探讨,并通过具体案例对sql_trace的使用进行说明.一、 基础介绍(a) SQL_TRACE说明SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体session启用。
    1. 在全局启用
    在参数文件(pfile/spfile)中指定:
    sql_trace =true
     在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境
    中要谨慎使用.
    提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰
    的看到各个进程之间的紧密协调.2. 在当前session级设置
    大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),
    研究SQL执行,发现后台错误等.
    在session级启用和停止sql_trace方式如下:
     启用当前session的跟踪:
    SQL> alter session set sql_trace=true;Session altered.此时的SQL操作将被跟踪:
    SQL> select count(*) from dba_users;  COUNT(*)
    ----------
            34
    结束跟踪:
    SQL> alter session set sql_trace=false;Session altered.
      
     
    3. 跟踪其他用户进程
    在很多时候我们需要跟踪其他用户的进程,而不是当前用户,这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
    来完成SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:SQL> desc dbms_system

    PROCEDURE SET_SQL_TRACE_IN_SESSION
     Argument Name                   Type                    In/Out Default?
     ------------------------------           -----------------------   ------ --------
     SID                             NUMBER                  IN
     SERIAL#                        NUMBER                  IN
     SQL_TRACE                     BOOLEAN                 IN

     
     通过v$session我们可以获得sid、serial#等信息:
    获得进程信息,选择需要跟踪的进程:SQL> select sid,serial#,username from v$session
      2  where username is not null;       SID    SERIAL#  USERNAME
    ---------- ---------- ------------------------------
             8       2041  SYS
             9        437  EYGLE设置跟着:
    SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)PL/SQL procedure successfully completed.….
    可以等候片刻,跟踪session执行任务,捕获sql操作…
    ….停止跟踪:
    SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)PL/SQL procedure successfully completed.

     
     
    (b) 10046事件说明
    10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
    10046事件可以设置以下四个级别:
    1 - 启用标准的SQL_TRACE功能,等价于sql_trace
    4 - Level 1 加上绑定值(bind values)
    8 - Level 1 + 等待事件跟踪
    12 - Level 1 + Level 4 + Level 8
    类似sql_trace,10046事件可以在全局设置,也可以在session级设置。
    1. 在全局设置
    在参数文件中增加:
     event="10046 trace name context forever,level 12" 
     此设置对所有用户的所有进程生效、包括后台进程.2. 对当前session设置
    通过alter session的方式修改,需要alter session的系统权限:
     
    SQL> alter session set events '10046 trace name context forever';Session altered.SQL> alter session set events '10046 trace name context forever, level 8';Session altered.SQL> alter session set events '10046 trace name context off';Session altered.
     3. 对其他用户session设置
    通过DBMS_SYSTEM.SET_EV系统包来实现: 
    SQL> desc dbms_system
    ...
    PROCEDURE SET_EV
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     SI                             BINARY_INTEGER          IN
     SE                             BINARY_INTEGER          IN
     EV                             BINARY_INTEGER          IN
     LE                             BINARY_INTEGER          IN
     NM                             VARCHAR2                IN...                      
     其中的参数SI、SE来自v$session视图:
    查询获得需要跟踪的session信息:SQL> select sid,serial#,username from v$session where username is not null;
    SID SERIAL# USERNAME
    ---------- ---------- ------------------------------
    8 2041 SYS
    9 437 EYGLE
    执行跟踪:
    SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');PL/SQL procedure successfully completed.结束跟踪:
    SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');PL/SQL procedure successfully completed. (c) 获取跟踪文件
    以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下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/hsjf_ora_1026.trc
     
                            
     
    (d) 读取当前session设置的参数
    当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:SQL> set feedback offSQL> set serveroutput on 
    SQL> declare 
    2 event_level number; 
    3 begin 
    4 for event_number in 10000..10999 loop 
    5 sys.dbms_system.read_ev(event_number, event_level); 
    6 if (event_level > 0) then 
    7 sys.dbms_output.put_line(
    8 'Event ' ||
    9 to_char(event_number) ||
    10 ' is set at level ' || 
    11 to_char(event_level)
    12 ); 
    13 end if; 
    14 end loop; 
    15 end; 
    16 /
    Event 10046 is set at level 1