Oracleデータベースの深層(5)− Enabling Trace with Event 10046

SQLトレースの有効化

いくつの方法でトレースを有効にできます。
・インスタンスレベルのトレース
・トリガーを利用したトレース
・セッションレベルのトレース
・ログイン中のセッショントレース
・その他のセッションのトレース
(1)インスタンスレベルのトレース

下記のパラメータをPFILEに設定することでトレースを有効化できます。
  trace_enabled = TRUE
全てのセッションとバックグラウンドプロセスも含めトレースを有効にします。
このパラメータを設定すると大量なトレースログが生成され、大量なシステム
リソースが消費されます。トレースファイルの保存場所はUSER_DUMP_DESTに依存します。
10046イベントを利用することでインスタンスレベルのトレースも有効化可能です。
例:下記の行をPFILEに追記することで10046イベントのレベル8で有効化可能
  &nbspevent='10046 trace name context forever, level 8'
若しくは下記のコマンドを実行します。
   ALTER SYSTEM SET EVENT '10046 trace name context forever, level 8';
無効にする:
   ALTER SYSTEM SET EVENT '10046 trace name context off';

インスタンス既に実行中の場合、ALTER SYSTEMを使えば直接トレースを有効化できます。
新規セッションのトレースを有効化するが、カレントセッションとバックグラウンド
プロセスには効果がありません。
   ALTER SYSTEM SET trace_enabled = TRUE;
無効にする:
   ALTER SYSTEM SET trace_enabled = FALSE;
(2)トリガーを利用したトレース
システムのトリガーを使ってトレースを有効・無効できます。
例:ユーザhrのトリガー
    CREATE OR REPLACE TRIGGER hr_logon
    AFTER LOGON ON hr.SCHEMA 
    BEGIN
      DBMS_SESSION.set_sql_trace (TRUE);
    END;

    CREATE OR REPLACE TRIGGER hr_logoff 
    BEFORE LOGOFF ON hr.SCHEMA
    BEGIN
      DBMS_SESSION.set_sql_trace (FALSE);
    END;
システム上トリガーの作成を完了し、下記のコールすれば有効・無効可能です。
    ALTER TRIGGER hr_logon ENABLE;
    ALTER TRIGGER hr_logon DISABLE;
(3)セッションレベルのトレース
セッションレベルのトレースを有効にする:
 ALTER SESSION SET sql_trace = TRUE;
セッションレベルのトレースを有効にする:
 ALTER SESSION SET sql_trace = FALSE;

イベント10046を利用したセッショントレースも可能です。
例:
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
ALTER SESSION SET EVENTS '10046 trace name context off';

DBMS_SESSIONを利用してカレントセッションのトレースを有効化可能です。
 EXEC DBMS_SESSION.set_sql_trace (TRUE);
 EXEC DBMS_SESSION.set_sql_trace (FALSE);

DBMS_SESSIONより柔軟性のあるDBMS_SUPPORTを利用してカレントセッションのトレース有効も可能です。
パラメータなしだと既定レベルは1となります:
 EXEC DBMS_SUPPORT.start_trace;   
レベル4のトレースを有効: 
 EXEC DBMS_SUPPORT.start_trace (binds=>true);
レベル8のトレースを有効:
 EXEC DBMS_SUPPORT.start_trace (waits=>true);
レベル12のトレースを有効:
 EXEC DBMS_SUPPORT.start_trace (binds=>true,waits=>true);
無効にする:
 EXEC DBMS_SUPPORT.stop_trace;
(4)ログオフ必要なし、トレースを有効化
その他のセッショントレースを無効にするにはDBMS_MONITOR、V$SESSIONのSIDとSERIAL#を利用します。
例:SID 9 と serial# 29のセッションを有効・無効にする
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id =>9, serial_num =>29, waits => TRUE, binds => TRUE);
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id =>9,serial_num =>29);
(5)その他セッションのトレース
同上DBMS_SUPPORT、SIDとSERIAL#で他セッショントレースの有効・無効が可能です。
Event 10046
レベル1: EXEC DBMS_SUPPORT.start_trace_in_session (9,29);  
レベル4: EXEC DBMS_SUPPORT.start_trace_in_session (9,29,binds=>true);
レベル8: EXEC DBMS_SUPPORT.start_trace_in_session (9,29,waits=>true);
レベル12:EXEC DBMS_SUPPORT.start_trace_in_session (9,29,binds=>true,waits=>true);
無効化: EXEC DBMS_SUPPORT.stop_trace_in_session (9,29);

DBMS_SYSTEMパッケージを使用し、上記の機能も実現できます。
 EXEC DBMS_SYSTEM.set_sql_trace_in_session (9,29,TRUE);
(レベル1相当) 
無効化:
 EXEC DBMS_SYSTEM.set_sql_trace_in_session (9,29,FALSE);
その他レベルを指定する場合:(例:レベル8)
 EXEC DBMS_SYSTEM.set_ev (9,29,10046,8,'');
無効化: EXEC DBMS_SYSTEM.set_ev (9,29,10046,0,'');
それ以外下記のパッケージとツールで実現可能?
DBMS_TRACE
DBMS_UTILITY
DBMS_DEBUG
DBMS_DDL
DBMS_STATS
oradebug