簡要說來,跟蹤一個客戶程序發出的SQL主要分成下面幾步:
1) 識別要跟蹤的客戶端程序到數據庫的連接(後面都用session代替),主要找出能唯一識別一個session的sid與serial#.
2) 設定相應的參數,如打開時間開關(可以知道一個sql執行了多長時間),存放跟蹤數據的文件的位置、最大值。
3) 啟動跟蹤功能
4) 讓系統運行一段時間,以便可以收集到跟蹤數據
5) 關閉跟蹤功能
6) 格式化跟蹤數據,得到我們易於理解的跟蹤結果。
現在就每一步,給出詳細的說明:
1) 識別要跟蹤的客戶端程序到數據庫的數據庫連接
查詢session信息(在sql*plus中運行):
set linesize 190
col Machine format a30 wrap
col program for a40
col username format a15 wrap
set pagesize 500
select s.sid sid, s.SERIAL# "serial#", s.username, s.Machine, s.program,
p.spid ServPID, s.server
from v$session s, v$process p
where p.addr = s.paddr ;
如得到的一個查詢結果如下:
SID serial# USERNAME MacHINE PROGRAM SERVPID SERVER
---- ------- -------- ------------------ ------------- --------- ---------
8 3 SCOTT WORKGROUPSUNNYXU SQLPLUS.EXE 388 DEDICATED
LOGON_TIME
------------------
2005.06.28 18:50:11
上面的結果中比較有用的列為:
sid, serial# : 這兩個值聯合起來唯一標識一個session
username : 程序連接數據庫的用戶名
Machine : 連接數據庫的程序所在的機器的機器名,可以hostname得到
program : 連接數據庫的程序名,所有用Java jdbc thin的程序的名字都一樣,
servpid : 與程序對應的服務器端的服務器進程的進程號,在unix下比較有用
server : 程序連接數據庫的模式:專用模式(dedicaed)、共享模式(shared)。
只有在專用模式下的數據庫連接,對其進程跟蹤才有效
logon_time : 程序連接數據庫的登陸時間
根據Machine, logon_time 可以方便的識別出一個數據庫連接對應的session,從而得到該sesion的唯一標識sid, serial#, 為對該session進行跟蹤做好准備
2) 設定相應的參數
參數說明:
timed_statistics : 收集跟蹤信息時,是否將收集時間信息,如果收集,則可以知道一個sql的各個執行階段耗費的時間情況
user_dump_dest : 存放跟蹤數據的文件的位置
max_dump_file_size : 放跟蹤數據的文件的最大值,防止由於無意的疏忽,使跟蹤數據的文件占用整個硬盤,影響系統的正常運行
設置的方法:
SQL> exec sys.dbms_system.set_bool_param_in_session( -
sid => 8, -
serial# => 3, -
parnam => 'timed_statistics', -
bval => true);
SQL> alter system set user_dump_dest='c: emp';
-- 注意這個語句會改變整個系統的跟蹤文件存放的位置,所以我一般不改這個參數,而用系統的缺省值,要查看當前系統的該參數的值,可以用system用戶登陸後:
SQL> show parameter user_dump_dest
SQL> exec sys.dbms_system.set_int_param_in_session( -
sid => 8, -
serial# => 3, -
parnam => 'max_dump_file_size', -
intval => 2147483647)
3) 啟動跟蹤功能
SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 3, true);
注意,只有跟蹤的session再次發出sql語句後,才會產生trc文件
4) 讓系統運行一段時間,以便可以收集到跟蹤數據
5) 關閉跟蹤功能
SQL> exec sys.dbms_system.set_sql_trace_in_session(8,3,false);
6) 格式化跟蹤數據,得到我們易於理解的跟蹤結果
對產生的trace文件進行格式化:
在命令提示符下,運行下面的命令
tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER
其它使用tkprof的例子:
(a) tkprof tracefile.trc sort_1.prf explain=apps/your_aPPS_passWord print=10 sort='(prsqry,exeqry,fchqry,prscu,execu,fchcu)'
(b) tkprof tracefile.trc sort_2.prf explain=apps/your_aPPS_passWord print=10 sort='(prsela,exeela,fchela)'
(c) tkprof tracefile.trc sort_3.prf explain=apps/your_aPPS_passWord print=10 sort='(prscnt,execnt,fchcnt)'
(d) tkprof tracefile.trc normal.prf explain=apps/your_aPPS_passWord