Home  |  Administration  |  SQL  |  Tuning  |  Miscellaneous  |

5 Способов Включить SQL-trace

Ниже приведены различные способы включения сиквел-трассировки для сессии.

Для своей сессии
SQL> alter session set sql_trace = true;

Или

SQL> alter session set events '10046 trace name context forever, level <Level>';

где Level:

0Выключить трейс (default)
1Включить трейс. Эквивалентна предыдущему способу
4Добавить в трейс информацию о значениях bind-переменных
8Добавить в трейс информацию о wait'ax
12Комбинация уровней 4 и 8

Для любой сессии
SQL> exec sys.dbms_system.set_sql_trace_in_session(<SID>, <serial#>, true);

Или

SQL> exec sys.dbms_system.set_ev(<SID>, <serial#>, 10046, <Level>, '');

Значения SID и serial# сессии Вы можете найти в v$session.

На уровне экземпляра для всех сессий

В файле конфигурации init<SID>.ora необходимо выставить параметр sql_trace = true и перегрузить экземпляр.

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

Бонус !!!

Изначально, я забыл упомянуть еще один ( шестой :-) способ включения трейса. Подсказал коллега, спасибо. Вы можете сделать трассировку любого серверного процесса, используя oradebug. Зная SID процесса можно получить его PID (Oracle Process Identifier) или его SPID (Operating System process identifier)

SQL> 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 <Level>
Еще один вариант

Прислал Андрей Бурмаков (many thanks!). Вариант известный, описан у Кайта и на многих других ресурсах, посвященных Oracle, но был незаслужено обойден моим вниманием. Для включения трассировки на уровне сессии используется logon-тригер. Этот вариант исключительно полезен, когда необходимо получить трейс сессии, которая работает очень непродолжительное время (секунды).

CREATE OR REPLACE TRIGGER trace_login_trigger
  AFTER logon ON DATABASE
  BEGIN
    IF (USER = '<test_user>') THEN
      EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 trace name
      context forever, level ''';
    END IF;
  END;
  /

По завершении сбора данных, можно перевести тригер в состояние 'DISABLE' до тех пор, пока нам не понадобится вновь трассировать сессии данного пользователя.

Last Update: October 11, 2007 18:33:32