23.07.2011 11:58
Достаточно часто необходимо понять, что же такое делает та или иная программка в базе. Да и с точки зрения мониторинга производительности иногда полезно отследить выполняемые в базе команды и их последствия.
Выполняется это достаточно просто.
Во-первых, помните про параметр 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, что облегчает задачу поиска трассировочного файла среди кучи других.
17.08.2011 17:14
Код:
DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id   IN  BINARY_INTEGER DEFAULT NULL,
    serial_num   IN  BINARY_INTEGER DEFAULT NULL,
    waits        IN  BOOLEAN DEFAULT TRUE,
    binds        IN  BOOLEAN DEFAULT FALSE);
Код:
DBMS_MONITOR.SESSION_TRACE_DISABLE(
   session_id      IN     BINARY_INTEGER DEFAULT NULL,
   serial_num      IN     BINARY_INTEGER DEFAULT NULL);
SQL код:
select p.pid, p.spid, s.username from v$process p, v$session s where p.addr = s.paddr and s.sid=580;
oradebug setorapid 40
или
oradebug setospid 28390 
или
oradebug setmypid
oradebug event 10046 trace name context forever , level 12
oradebug eventdump session
942 trace name ERRORSTACK level 3
oradebug tracefile_name 
Список событий
SQL код:
set serveroutput on
exec for event in 10000..10999 loop dbms_output.put_line( sqlerrm(-event) ); end loop; 
SQL код:
set serveroutput on
alter session set events '10053 trace name context forever, level 1';
alter session set events '10046 trace name context forever, level 4';
oradebug setmypid
oradebug eventdump session 
Цитата:
sql_trace level=4
trace [RDBMS.SQL_OPTIMIZER]
trace [RDBMS.SQL_Transform]
trace [RDBMS.SQL_MVRW]
trace [RDBMS.SQL_VMerge]
trace [RDBMS.SQL_Virtual]
trace [RDBMS.SQL_APA]
trace [RDBMS.SQL_Costing]
trace [RDBMS.SQL_Parallel_Optimization]
trace [RDBMS.SQL_Plan_Management]
SQL>
SQL код:
declare
    event_level number;
    counter     number;
  begin
    counter := 0;
    for i in 10000 .. 10999 loop
      sys.dbms_system.read_ev(i, event_level); 
      if (event_level > 0) then
        dbms_output.put_line('Event ' || to_char(i) || ' set at level ' || to_char(event_level));
        counter := counter + 1;
      end if;
    end loop;
    if (counter = 0) then
      dbms_output.put_line('No events set for this session');
    end if;
  end;
  / 
Выключить все события для всех инстансов бд:
SQL код:
ALTER SYSTEM RESET EVENT SCOPE=SPFILE SID='*' ; 
Код:
EXEC #139988089003064:c=245963,e=29695833,p=683,cr=265,cu=3207,mis=0,r=1000,dep=0,og=1,plh=0,tim=1323439589795819
Brevis 	Description
c 	CPU time (9i+ microseconds)
e 	Elapsed time (9i+ microseconds)
p 	# of Physical reads
cr 	# of buffers retrieved for CR reads — соответствует статистике consistent gets
cu 	Number of buffers retrieved in current mode — соответствует статистике db block gets
mis 	Cursor missed in library cache, если > 0 — при выполнении запроса поребовался разбор курсора — hard parse
r 	# of rows processed — кол-во обработанных строк, в этом случае 1000
dep 	Recursive call depth (0 = user SQL, >0 = recursive)
og 	Optimizer Goal: 1=All_Rows, 2=First_Rows, 3=Rule, 4=Choose
tim 	Timestamp (9i+ microseconds) — может быть использован для определения времени между операциями в трейс файле, к реальному времени можно привязать через обзор v$timer
plh 	sql PLan Hash
Начиная с Oracle 11.2 можно получить трейс оптимизатора для запроса, находящегося в shared pool (v$sql), без повторного выполнения запроса:
SQL код:
begin
dbms_sqldiag.dump_trace(
   p_sql_id=>'d9m84krtg4yg1',
   p_child_number => 2,
   p_component=>'Optimizer',    --Valid values are "Optimizer" and "Compiler"
   p_file_id=>'My_CBO_Trace');
end;
/ 
информация о блокировках (locks/enqueues), используемых сессией, включая время ожидания
SQL код:
alter session set events '10704 trace name context forever, level 10'; 
Можно посмотреть и без трассировки полезную информацию по выполненному SQL
SQL код:
select t.*
 from v$sql_plan v,
  xmltable(
    '/other_xml/info'
    passing xmltype(v.other_xml)
    columns
        info_type varchar2(30) path '@type',
        info_value varchar2(30) path '/info'
  ) t
where v.sql_id = '&sql_id'
  and v.child_number = &child_number
  and other_xml is not null; 
26.11.2024 19:07
Можно включить трассировку по идентификатору сессии, например, так: выставляем идентификатор сессии:
SQL код:
begin DBMS_SESSION.SET_IDENTIFIER ('OLEGON');end; 
Убедимся, что сессия получила идентификатор
SQL код:
select * from v$session where client_identifier='OLEGON'; 
Включаем и выключаем трассировку
SQL код:
begin dbms_monitor.client_id_trace_enable (client_id=>'OLEGON');end;
begin dbms_monitor.client_id_trace_disable (client_id=>'OLEGON');end; 
И немного о вьюшках, где можно посмотреть состояние трассировок в базе.
SQL код:
select * from DBA_ENABLED_TRACES;
select * from SYS.WRI$_TRACING_ENABLED; 
Часовой пояс GMT +3, время: 20:24.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.