В статье пойдет речь о различных способах включения отладки SQL.
Включение отладки для своей сессии, выполняется командой:
ALTER SESSION SET sql_trace=TRUE;
или
ALTER SESSION SET EVENTS '10046 trace name context forever, level <уровень_отладки>';
где, уровень отладки:
0 - Выключить отладку (значение по умолчанию)
1 - Включить отладку.
4 - Добавить в отладку информацию о значениях связанных переменных
8 - Добавить в отладку информацию об ожиданиях
12 - Комбинация уровней 4 и 8
В итоге команда может выглядеть так:
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
Чтобы включить отладку для выбранной сессии, выполняем SQL команду:
EXEC sys.dbms_system.set_sql_trace_in_session([SID],[serial#], TRUE);
или
EXEC sys.dbms_system.set_ev([SID], [serial#], 10046, уровень_отладки, '');
Значения SID и serial# сессии можно найти в v$session:
SELECT SID, SERIAL# FROM V$SESSION;
SID SERIAL#
---------- ----------
133 46
136 4
137 6
138 8
140 22905
Если требуется включить отладку для всех сессий экзмемпляра, то в файле конфигурации init.ora необходимо выставить параметр sql_trace=true и перегрузить экземпляр. Выставлять отладку для всех сессий рекомендуется только в экстренных случаях, поскольку это создаст значительную нагрузку на сервер.
Кроме того, вы можете сделать трассировку любого серверного процесса, используя oradebug. Зная SID процесса можно получить его PID (Oracle Process Identifier) или его SPID (Operating System process identifier):
SELECT P.SPID, P.PID
2 FROM V$PROCESS P, V$SESSION S
3 WHERE P.ADDR = S.PADDR
4 AND S.SID = SID;
Затем выполняем любую из команд, для указания процесса:
SVRMGR> ORADEBUG SETOSPID [SPID]
либо
SVRMGR> ORADEBUG SETORAPID [PID]
И включаем отладку командой:
SVRMGR> ORADEBUG EVENT 10046 trace name context forever, level уровень_отладки
Еще один вариант включения отладки, описан у Тома Кайта. Для включения отладки на уровне сессии используется logon-тригер. Этот вариант исключительно полезен, когда необходимо получить отладочную информацию о сессии, которая работает очень непродолжительное время (секунды).
CREATE OR REPLACE TRIGGER trace_login_trigger
AFTER logon ON DATABASE
BEGIN
IF (USER = '') THEN
EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 trace name
context forever, level ''';
END IF;
END;
По завершении сбора данных, триггер переводится в состояние 'DISABLE'. Для отключение триггера выполните команду SQL:
ALTER TRIGGER trace_login_trigger DISABLE;
Когда триггер снова потребуется собрать отладочную информацию, включаете триггер командой:
ALTER TRIGGER trace_login_trigger ENABLE;