自分のセッションをトレースする方法
ALTER SESSION SET timed_statistics = TRUE; ALTER SESSION SET statistics_level=ALL; ALTER SESSION SET EVENTS '10046 trace name context forever,level 12'; # セッションを抜けると自動的にトレースは停止する ALTER SESSION SET EVENTS '10046 trace name context off'; # トレースファイルの場所を確認する SHOW PARAMETER user_dump_dest # トレースファイルをフォーマットする。 tkprof *.trc
別のセッションについてトレースする方法-1
select sid,serial#,username,machine,program from v$session where owner='&app_owner'; # sidがsession_id, serial#がserial_numになる。 EXEC DBMS_MONITOR.session_trace_enable(session_id =>1234, serial_num=>1234, waits=>TRUE, binds=>TRUE); # アプリケーションが終了するか、5分ほど程度経過したらトレースを停止する。 EXEC DBMS_MONITOR.session_trace_disable(session_id=>1234, serial_num=>1234); # トレースファイルが生成されたディレクトリに移動する tkprof xxxx.trc xxxxx.txt
別のセッションについてトレースする方法-2
# oradebugを用いてトレースする方法もある。ただしOS process IDが必要 SELECT p.PID, p.SPID, s.SID,s.program,s.module,s.username FROM v$process p, v$session WHERE s.paddr = p.addr AND s.SID = &session_id; # process idが明らかになったらoradebugのsetospidに指定 CONNECT / AS SYSDBA ORADEBUG SETOSPID 29716 ORADEBUG UNLIMIT ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER,LEVEL 12; --->enable trace ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF; --->Disable trace;
トレースファイルが生成された場所を確認
SET LINESIZE 100
COLUMN trace_file FORMAT A60
SELECT s.sid,
s.serial#,
pa.value || '/' || LOWER(SYS_CONTEXT('userenv','instance_name')) ||
'_ora_' || p.spid || '.trc' AS trace_file
FROM v$session s,
v$process p,
v$parameter pa
WHERE pa.name = 'user_dump_dest'
AND s.paddr = p.addr
AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
11gでのクエリ
SELECT p.tracefile FROM v$session s JOIN v$process p ON s.paddr = p.addr WHERE s.sid = &sid; --enter session_id to be traced
OracleでSQL+でのトレースについては下記のページにまとまっている。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05784-01/ch8.htm
各試行の前にはあらかじめキャッシュをクリアしておく
ALTER SYSTEM FLUSH BUFFER_CACHE; ALTER SYSTEM FLUSH SHARED_POOL;