Oracle - SQLトレースをプロセス単位で取得する

目的

Oracle10gの新機能である、DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE/DISABLEを使って、プロセスレベルでSQLトレースを取得する。
Oracle9iまでは、インスタンスレベルか、セッションレベルでしかSQLトレースを取得できなかった。

Oracle8iまで:
アプリケーション自体にALTER SESSION SET SQL_TRACE = TRUEを組み込むか、
インスタンスレベルで有効にするために、初期化パラメータファイルを書き換えて、インスタンスを再起動するしかなかった。
プロダクションコードにデバッグ用コードを埋め込むことは、テスト無効を意味するので、基本的にはできない。

Oracle9iまで:
初期化パラメータファイルにサーバ・パラメータ・ファイル(SPFILE)を使っていれば、インスタンスの再起動は不要だが、
対象アプリケーション以外のSQLトレースも取れてしまうという問題が残った。

やってみたこと

前提

手順

01. インスタンスレベルでのSQL_TRACEは無効であることを確認する

02. セッションレベルでのSQL_TRACEは無効であることを確認する

03. セッションレベル(このSQL*Plus窓)でのSQL_TRACEを有効にする

04. SQL*Plusで適当なSQLを実行

05. Javaプログラムを実行

import java.sql.*;

public class test2
{
	public static void main(String[] args) throws Exception
	{
		Class.forName("oracle.jdbc.driver.OracleDriver");

		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;

		try
		{
			con = DriverManager.getConnection("jdbc:oracle:oci:@test", "scott", "tiger");
			stmt = con.createStatement();
			rs = stmt.executeQuery("SELECT * FROM EMP WHERE EMPNO = 7900");
		}
		finally
		{
			if(rs != null)
			{
				rs.close();
			}
			if(stmt != null)
			{
				stmt.close();
			}
			if(con != null)
			{
				con.close();
			}
		}
	}
}

06. SQLトレースの出力先を確認

07. 最新のトレースファイル=test_ora_1568.trc

08. tkprofで変換する

09. SQL*Plusで実行したSQLはトレースに入っている

10. Javaで実行したSQLはトレースに入っていない

11. セッションレベル(このSQL*Plus窓)でのSQL_TRACEを無効にする

12. プロセスレベル(java.exe)でのSQL_TRACEを有効にする

13. SQL*Plusで適当なSQLを実行

14. Javaプログラムを実行

15. 最新のトレースファイル=test_ora_3628.trc

16. tkprofで変換する

17. Javaで実行したSQLはトレースに入っている

18. SQL*Plusで実行したSQLはトレースに入っていない

19. プロセスレベル(java.exe)でのSQL_TRACEを無効にする