23.07.2011 11:58
OlegON
 
Достаточно часто необходимо понять, что же такое делает та или иная программка в базе. Да и с точки зрения мониторинга производительности иногда полезно отследить выполняемые в базе команды и их последствия.
Выполняется это достаточно просто.
Во-первых, помните про параметр 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
OlegON
 
Код:
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.pidp.spids.username from v$process pv$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_linesqlerrm(-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(ievent_level); 
      if (
event_level 0then
        dbms_output
.put_line('Event ' || to_char(i) || ' set at level ' || to_char(event_level));
        
counter := counter 1;
      
end if;
    
end loop;
    if (
counter 0then
      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
(30path '@type',
        
info_value varchar2(30path '/info'
  
t
where v
.sql_id '&sql_id'
  
and v.child_number = &child_number
  
and other_xml is not null
Часовой пояс GMT +3, время: 14:23.

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