ドキュメントには記載されていませんが、EVENTと呼ばれるデバッグ用の機能により、SQLトレースで取得できる情報に加えて、より詳細な情報を取得することも可能です。EVENT 10046には表3のようなレベルがあり、通常のSQLトレースによって作成されるトレースファイルには含まれない、バインド変数の値や待機イベントを確認できます。通常のSQLトレースに比べ、非常に多くの情報がファイルに出力されるため、ディスクの空き容量に十分注意してください。
なお、EVENTはOracleの内部動作変更や、デバッグなどに使用されるものであり、正式にサポートされるものではありません。使用する場合は、自己責任において使用してください。
レベル | 内容 |
---|---|
LEVEL 1 | SQL_TRACE機能と同等 |
LEVEL 4 | LEVEL 1の情報に追加して、バインド変数情報が出力される |
LEVEL 8 | LEVEL 1の情報に追加して、待機イベント情報が出力される |
LEVEL 12 | LEVEL 1の情報に追加して、バインド変数情報、待機イベント情報が出力される |
表3 EVENT 10046のレベル |
SQL> ALTER SESSION SET EVENTS '10046 trace name context |
EVENT 10046の使用例 (注:
記号は表示の都合で折り返していることを表します)
|
デフォルトのSQLトレースには含まれないバインド変数の値を確認する場合、LEVEL 4もしくはLEVEL 12で取得したSQLトレースをTKPROFユーティリティで整形せずに、直接参照します。以下の例は、LEVEL4でバインド変数を確認した結果です。
PARSING IN CURSOR #2 len=57 dep=1 uid=35 oct=3 lid=35 |
リスト1 EVENT
10046 LEVEL 4の出力例(クリックすると別ウィンドウで表示します) (注:
記号は表示の都合で折り返していることを表します)
|
今回のSQLは、「CURSOR #2」で実行されていることから、バインド変数の値は、その直後にある「BINDS #2」になります。ここでは、「value=1」「value="Clerk#000000951"」が指定されていたことが確認できます。
別セッションのSQLトレース、EVENT 10046のSQLトレース取得手順
先ほどは自セッションのSQLトレースを取得する方法を説明しましたが、アプリケーションを変更できない場合や、すでに実行中のアプリケーションのSQLトレースを取得したい場合も多いかと思います。そのような場合、ほかのセッションに対して、SQLトレースやEVENT10046をセットすることも可能です。
ただし、取得できるのは、トレース取得開始時点以降の情報となります。そのため、すでに実行中であったSQLに関しては、読み取りブロック数などの値が不正確となりますので、注意してください。以下に別セッションのSQLトレースを取得する例を示します。
1. sysdba権限を持つユーザーでログインする
$ sqlplus '/ as sysdba' |
2. トレース取得対象セッションのSID、SERIAL#をV$SESSION動的パフォーマンスビューで確認する(クリックすると別ウィンドウで表示します)
SQL> SELECT sid,serial#,username,program,machine,status, |
(注:
記号は表示の都合で折り返していることを表します)
|
ここでは、SCOTTユーザーを指定しています。
3. SQLトレースを設定する
SQL> EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(10,12, |
(注:
記号は表示の都合で折り返していることを表します)
|
ここでは、SID、SERIAL#、TRUEを指定して、上記のプロシージャを実行します。
4. SQLトレースの設定を解除する
SQL> EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(10,12, |
(注:
記号は表示の都合で折り返していることを表します)
|
なおトレースファイルは、自セッションのSQLトレースを取得したときと同じディレクトリ下に作成されます。
別セッションに対して、EVENT 10046のSQLトレースを設定する場合には、手順の3.と4.で以下のプロシージャを実行します。
3. EVENT 10046をLEVEL 12に設定する
SQL> EXECUTE DBMS_SYSTEM.SET_EV(10,12,10046,12,''); |
4. EVENT 10046の設定を解除する
SQL> EXECUTE DBMS_SYSTEM.SET_EV(10,12,10046,0,''); |
Copyright © ITmedia, Inc. All Rights Reserved.