Подтвердить что ты не робот

Показать все запросы, поступающие в базу данных Oracle

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Запуск 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\приложение\оракул\диаг\RDBMS\х\х\след где вы найдете несколько журналов трассировки. Файлы .trc - это просто текст

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

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

Там вы идете - счастливая диагностика и обратная инженерия!

Ответ 3

Если вам нужно видеть все запросы из всех сеансов для короткого окна времени, и вам нужно действительно простое решение, это то, что я делаю. (В приведенных выше ответах будет отображаться только то, что SQL запускается за один сеанс, это позволяет легко выполнять все SQL-запросы на всех сеансах).

1). Создайте временную таблицу для хранения всего полученного SQL:

   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(64 BYTE)
   )

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.