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

use*_*971 19 oracle monitoring

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

Sat*_*hat 13

启用SQL跟踪,将记录进入数据库的所有查询.

ALTER SESSION SET sql_trace = true;
ALTER SESSION SET tracefile_identifier = mysqltrace;
Run Code Online (Sandbox Code Playgroud)

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

如果要审核数据库,请查看我之前的答案.

  • 我相信应该是`ALTER SYSTEM SET sql_trace = true SCOPE = MEMORY`来记录对数据库的所有活动.OP还应熟悉TKProf以格式化跟踪输出. (2认同)
  • 我的 udump 目录中没有任何内容 (2认同)

mik*_*ike 7

如果您需要在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)
       )
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,您确实希望将 SQL_TEXT 列扩展到比 64 字节大得多...通常,您需要完整的 SQL 文本来确定正在发生的情况,并有机会发现哪段代码发送了该查询... (2认同)

Dan*_*ams 6

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

> SELECT USERNAME, SID, SERIAL# FROM v$session WHERE userName = '<your user>'
Run Code Online (Sandbox Code Playgroud)

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

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, true)
Run Code Online (Sandbox Code Playgroud)

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

> SHOW PARAMETERS user_dump_dest
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:C:\ oraclexe\app\oracle\diag\rdbms\xe\xe\trace,你会在其中找到许多跟踪日志..trc文件只是文本

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

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, false)
Run Code Online (Sandbox Code Playgroud)

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