For FAQ - как включить трассировку сессии?

Barkovsky
Дата: 27.09.2004 16:54:54
оттрассировать можно произвольную сессию в базе. "оттрасировать" - означает записать в файл операционной системы SQL-стейтменты, которые выполняются в сессии.

перед включением трассировки - необходимо включить сбор временной статистики, иначе трассировочные файлы будут появляться с нулевыми временами. делается это так:
alter system set timed_statistics=true

если трассировка включается в текущей сессии, тогда эта команда выглядит так:
alter session set timed_statistics=true

далее необходимо уникально идентифицировать сессию, которую есть желание оттрассировать, а для этого надо узнать значения столбцов sid и serial# этой сессии:

select sid,serial# from v$session
where ...мои_критерии_отбора...

трассировка сессии включается через установку события 10046 для соответствующей сессии. для этого надо запустить следующую процедуру и передать ей, полученные значения sid и serial, в качестве целочисленных параметров:

begin
sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
end;
(качестве примера, устанавливается максимальный, 12ый уровень, трассировки)


выключить трассировку можно аналогично - установкой события 10046 в нулевой уровень.
begin
sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

и то же самое в случае трассировки текущей сессии (без указания sid и serial#):
--включить:
alter session set events '10046 trace name context forever, level 12'

--выключить:
alter session set events '10046 trace name context forever, level 0' 

трассировочный файл с накопленной "сырой" информацией появится в следующей директории:
SQL> select value from v$parameter p
2 where name='user_dump_dest'
3 /

VALUE
-------------------------------
C:\ORACLE\admin\My_Sid\udump

SQL> 

а имя этого файла будет в себе содержать идентификатор процесса операционной системы, в котором была установлена трассировка и иметь расширение *.trc. идентификатор процесса можно узнать так:

select p.spid from v$session s, v$process p
where s.paddr=p.addr
where ...мои_критерии_отбора...

точный алгоритм формирования названия зависит от операционной системы. но, к примеру, называться этот файл может так:

databaseSID_ora_2890.trc

и наконец. для того, чтобы преобразовать "сырую" информацию в пригодный для чтения человеком вид - трассировочный файл необходимо обработать утилитой tkprof.

C:\ORACLE\admin\My_Sid\udump>tkprof my_trace_file.trc output=my_file.prf

TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

C:\ORACLE\admin\Yan9\udump>


в файле my_file.prf будут тексты практически всех команд, которые выполнялись в трассируемой сессии. а также много другой интересной информации:)


ЗЫ. конструктивная критика темы приветствуется.
Oracle newbie
Дата: 27.09.2004 17:08:50
Привет, все классно
только не

alter session set events '10046 trace name context forever, level 0';

а

alter session set events '10046 trace name context off';

Также я бы добавил, что перед этими всеми манипуляцими надо бы выставить параметр max_dump_file_size который можно выставлять на уровне сессии . Не выставив этот параметр , можно натнуться на ситуевину, когда масса информации останеться неотрассированной по причине лимита этого пар-ра.

Regards.
MA_D
Дата: 27.09.2004 17:09:58
Способы трассировки:
+ DBMS_SUPPORT($ORACLE_HOME/rdbms/admin/dbmssupp.sql) start_trace_in_session/stop_trace_in_session...
+ trigger на логон
+ DBMS_MONITOR в 10g
MA_D
Дата: 27.09.2004 17:12:53
+ oradebug
olek
Дата: 27.09.2004 17:20:08
кажется и проще можно вкл/выкл
alter session set sql_trace = true/false
Barkovsky
Дата: 27.09.2004 17:26:33
спасибо.

to Oracle newbie
ок, учту оба замечания.

to MA_D, olek
про способы:
я тогда лучше ссылку впишу на сайт Эдварда Шевцова.
http://oradba.com.ru/tuning/optimizer/tips/t2_sqltrace.shtml
потому что излишняя информация может просто запутать.

завтра днем перепишу окончательный вариант.
Alex_D
Дата: 27.09.2004 17:32:31
Barkovsky

begin
sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
end;
(качестве примера, устанавливается максимальный, 12ый уровень, трассировки)


Можно добавить перечисление уровней трасировки (цитата из книги Тома Кайта):
1 - включает стандартные средства SQL_TRACE. Результат не отличается от установки SQL_TRACE=TRUE
4 - включает стандартные средства SQL_TRACE и добавляет в трасировочный файл значения связаных переменных.
8 - включает стандартные средства SQL_TRACE и добавляет в трасировочный файл информацию об ожидании событий на уровне запросов
12 - включает стандартные средства SQL_TRACE и добавляет как значения связаных переменных, так и информацию об ожиданиях событий.
Markelenkov
Дата: 27.09.2004 20:40:42
В 9-ке есть полезная фича, которую тоже можно упомянуть:

alter session set tracefile_identifier='...'
Тестер-51
Дата: 27.09.2004 21:07:13
Barkovsky
Дата: 28.09.2004 12:35:46
исправленный вариант.
если больше замечаний нет, можно его переносить в FAQ.
------------------

оттрассировать можно произвольную сессию в базе. "оттрасировать" - означает записать в файл операционной системы SQL-стейтменты (и также некоторую сопутствующую им информацию - планы запросов, ожидания событий), которые выполняются в сессии.

перед включением трассировки - необходимо включить сбор временной статистики, иначе трассировочные файлы будут появляться с нулевыми временами. делается это так:
alter system set timed_statistics=true


если трассировка включается в текущей сессии, тогда эта команда выглядит так:
alter session set timed_statistics=true


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

SQL> select value from v$parameter p
  2  where name='max_dump_file_size'
  3  /

VALUE
-----------
UNLIMITED
параметр можно динамически менять выставлять как на уровне сессии (alter session), так и на уровне базы данных (alter system).


далее необходимо уникально идентифицировать сессию, которую есть желание оттрассировать, а для этого надо узнать значения столбцов sid и serial# этой сессии:

SQL> select sid,serial# from v$session
  2  where ...мои_критерии_отбора...
  3  /

трассировка сессии включается через установку события 10046 для соответствующей сессии. для этого надо запустить следующую процедуру и передать ей, полученные значения sid и serial#, в качестве целочисленных параметров:

SQL> begin
  2  sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
  3  end;
  4  /


в качестве примера, устанавливается максимальный, 12ый уровень, трассировки. возможные уровни трассировки:

0 - трассировка выключена.
1 - минимальный уровень. результат не отличается от установки параметра sql_trace=true
4 - в трасировочный файл добавляются значения связанных переменных.
8 - в трасировочный файл добавляются значения ожидании событий на уровне запросов.
12 - добавляется как значения связанных переменных, так и информация об ожиданиях событий.

выключается трассировка аналогично - установкой события 10046 в нулевой уровень:

SQL> begin
  2  sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
  3  end;
  4  /


и то же самое в случае трассировки текущей сессии (без указания sid и serial#):

--включить:
alter session set events '10046 trace name context forever, level 12';
--выключить:
alter session set events '10046 trace name context off';

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

далее. трассировочный файл с накопленной "сырой" информацией появится в следующей директории:

SQL> select value from v$parameter p
  2 where name='user_dump_dest'
  3 /

VALUE
-------------------------------
C:\ORACLE\admin\databaseSID\udump

SQL> 


а имя этого файла будет в себе содержать идентификатор процесса операционной системы, в котором была установлена трассировка и иметь расширение *.trc, идентификатор процесса можно узнать так:

SQL> select p.spid from v$session s, v$process p
  2 where s.paddr=p.addr
  3 and ...мои_критерии_отбора...
  4 / 


точный алгоритм формирования названия зависит от операционной системы. но, к примеру, называться этот файл может так:

databaseSID_ora_2890.trc

в Oracle8i появилась возможность установить формат имени трассировочного файла для текущей сессии, через параметр tracefile_identifier.
alter session set tracefile_identifier='UniqueString'; 

и наконец. для того, чтобы преобразовать "сырую" информацию в пригодный для чтения человеком вид - трассировочный файл необходимо обработать утилитой tkprof.

C:\ORACLE\admin\databaseSID\udump>
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\ORACLE\admin\databaseSID\udump>

в файле my_file.prf будут тексты практически всех команд, которые выполнялись в трассируемой сессии. а также много другой интересной информации:)