Показать все запросы, поступающие в базу данных Oracle - PullRequest
16 голосов
/ 03 февраля 2012

Мне нужно увидеть все запросы, поступающие в базу данных.Как это сделать?Я не смог получить правильные результаты поиска Google.

Ответы [ 3 ]

13 голосов
/ 03 февраля 2012

Включить SQL Trace и все запросы, поступающие в базу данных, будут регистрироваться.

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

Файл трассировки будет находиться в каталоге udump.

Если вы хотите проверить базу данных, посмотрите на мой предыдущий ответ.

6 голосов
/ 27 апреля 2016

Если вам нужно просмотреть все запросы из всех сеансов в течение КРАТКОГО окна времени, и вам нужно действительно простое решение, это то, что я делаю. (Приведенные выше ответы покажут, что 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, когда вы находитесь в состоянии "что, черт возьми, происходит здесь?" ситуации, и у вас нет инструментов графического интерфейса.

6 голосов
/ 23 августа 2015

Запуск XE в Windows, вот как я делаю это, чтобы найти то, что делает пользователь.Запустите 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 \ app \ oracle \ diag \ rdbms \ xe \ xe \ trace, где вы найдете несколько журналов трассировки.Файлы .trc представляют собой просто текст

Когда закончите, отключите ведение журнала, чтобы не заполнять файлы и не замедлять работу вашей базы данных.

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

Вот и все - счастливой диагностики иобратный инжиниринг!

...