Достаточно часто необходимо понять, что же такое делает та или иная программка в базе. Да и с точки зрения мониторинга производительности иногда полезно отследить выполняемые в базе команды и их последствия.
Выполняется это достаточно просто.
Во-первых, помните про параметр sql_trace=true и, на всякий, tracefile_identifier. Первый, соответственно, может задаваться для своей сессии или глобально.
Если Вы собираетесь трассировать свою сессию, то выполняйте команду:
alter session set events '10046 trace name context forever, level N';
Цифра в level указывает на уровень трассировки.
level 1 -- в trace файл пишется статистика вида ***, APPNAME, PARSING IN CURSOR, PARSE ERROR, PARSE, EXEC, FETCH, UNMAP, SORT UNMAP, ERROR, STAT и XCTEND
level 4 -- то же, что и в level 1 плюс BINDS секции
level 8 -- то же, что и в level 1 плюс WAIT строки
level 12 -- level 1 плюс level 4 плюс level 8
Выключается трассировка своей сессии так:
alter session set events '10046 trace name context off';
например
SQL код:
alter session set tracefile_identifier='olegon';
--включить:
alter session set events '10046 trace name context forever, level 12';
--выключить:
alter session set events '10046 trace name context off';
Если Вы собираетесь трассировать чужую сессию, то вызывайте процедуру set_ev из пакета dbms_system:
exec dbms_system.set_ev(sid,serial,10046,N,'');
где sid, serial -- это понятно что, а N -- требуемый level.
Выключается трассировка чужой сессии так:
exec dbms_system.set_ev(sid,serial,10046,0,'');
обычно включается либо 8, либо 12-я, полная трассировка
В случаях, когда сессия резко всплывает и схлопывается, можно ловить ее по имени пользователя, например, через триггер на подключение:
Код:
CREATE OR REPLACE TRIGGER debug_olegon AFTER LOGON ON DATABASE WHEN (SYS_CONTEXT ('USERENV', 'SESSION_USER') in ('ИМЯ_ПОЛЬЗОВАТЕЛЯ'))
BEGIN
EXECUTE IMMEDIATE 'alter session set tracefile_identifier=''MyTraceIdentifier''';
EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
END debug_olegon;
ну или так
Код:
CREATE OR REPLACE TRIGGER debug_olegon
AFTER LOGON ON DATABASE
BEGIN
if (SYS_CONTEXT('userenv','session_user')='OLEGON')
then
execute immediate 'ALTER SESSION SET trace_enabled=TRUE';
execute immediate 'ALTER SESSION SET tracefile_identifier=''olegon''';
end if;
end;
Естественно, что требуется потом этот триггер снять командой
Код:
DROP TRIGGER debug_olegon;
в результате трассировки создается трассировочный файл, который затем можно обработать утилитой tkprof. В примере с триггером трассировочный файл будет с суффиксом MyTraceIdentifier, что облегчает задачу поиска трассировочного файла среди кучи других.