显示进入Oracle数据库的所有查询

时间:2012-02-03 07:37:47

标签: oracle monitoring

我需要查看所有查询到数据库。怎么做?我无法从Google搜索中获得正确的结果。

3 个答案:

答案 0 :(得分:12)

启用SQL Trace&将记录所有进入数据库的查询。

ALTER SESSION SET sql_trace = true;
ALTER SESSION SET tracefile_identifier = mysqltrace;

跟踪文件将出现在udump目录中。

如果您想审核数据库,look at my previous answer.

答案 1 :(得分:6)

在Windows中运行XE是我如何找到用户正在做的事情。 启动SQLPlus并运行:

> SELECT USERNAME, SID, SERIAL# FROM v$session WHERE userName = '<your user>'

这将为您的用户提供两个整数值SID和SERIAL#。您的用户可能打开了多个会话。 运行此命令以打开日志记录:

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, true)

接下来让你的应用做一些工作...... 找出数据的使用位置:

> SHOW PARAMETERS user_dump_dest

你会得到类似的东西: C:\ oraclexe \程序\ ORACLE \诊断\ RDBMS \ XE \ XE \跟踪 在哪里可以找到许多跟踪日志。 .trc文件只是文本

完成后,请关闭日志记录,这样您就不会填写文件或减慢数据库速度。

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, false)

你去了 - 快乐的诊断和逆向工程!

答案 2 :(得分:5)

如果您需要查看来自所有会话的所有查询的SHORT窗口时间,并且您需要一个非常简单的解决方案,这就是我的工作。 (以上答案仅显示SQL在一个会话中运行,这样可以轻松地在所有会话中提供所有SQL。)

1)。创建临时表以存储所有检索到的SQL:

-- Fabien pointed out out that 'port may be inaccessible on 10.2 
       CREATE TABLE "MIKE"."TMP" 
       (    "LOOP_NO" NUMBER(10,0), 
        "SID" NUMBER, 
        "SERIAL#" NUMBER, 
        "PROCESS" VARCHAR2(24 BYTE), 
        "PROGRAM" VARCHAR2(48 BYTE), 
        "MODULE" VARCHAR2(64 BYTE), 
        "OSUSER" VARCHAR2(30 BYTE), 
        "SCHEMANAME" VARCHAR2(30 BYTE), 
        "ACTION" VARCHAR2(64 BYTE), 
        "MACHINE" VARCHAR2(64 BYTE), 
        "PORT" NUMBER, 
        "TERMINAL" VARCHAR2(30 BYTE), 
        "ADDRESS" RAW(8), 
        "PIECE" NUMBER, 
        "SQL_TEXT" VARCHAR2(4000)
       )

2)。只要块正在运行,就在匿名块中运行一个讨厌的轮询循环来收集系统上运行的所有SQL:

declare
begin 
  for j in 1.. 1000 loop 

     insert into  mike.tmp
     SELECT j, b.sid, b.serial#, b.process, b.program, b.module, b.osuser, b.schemaname, b.action, b.machine, b.port, b.terminal,a.address,  a.piece, a.sql_text
            FROM V$sqltext_With_Newlines a
            join V$Session b  on a.address = b.sql_address
           WHERE A.ADDRESS NOT IN (select address FROM mike.tmp)
        ORDER BY b.sid, a.piece;

    commit;

  end loop;
end;

3)。查询以检索SQL:

select distinct osuser, a.address, a.sid, a.piece, a.sql_text 
          from mike.tmp a
          join (select loop_no, sid from mike.tmp where sql_text like '%anytexthere%') b 
            on a.loop_no = b.loop_no
           and a.sid = b.sid 
           order by a.sid, a.address, a.piece

...请注意,这只是一个快速的方法来捕获SQL,当你在“这里发生了什么?”情况,你没有GUI工具。