Мне нужно увидеть все запросы, поступающие в базу данных. Как это сделать? Я не смог получить правильные результаты поиска Google.
Показать все запросы, поступающие в базу данных Oracle
Ответ 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.