如今,一般DBA使用會話跟蹤、SQL跟蹤並進行分析已不是稀奇的事情,我估計常用的方法有SQL_TRACE、10046事件等。另外,如果我們需要跟蹤其他會話,那需要如何做呢?大家估計最熟悉的是使用ORADEBUG,至少我喜歡這樣做。其實,Oracle提供的跟蹤方法非常豐富,本文就將這些方法一一介紹,大家可以選擇自己喜歡的方式並熟練使用它們。
TRACE目錄
首先,我可能會關心咱跟蹤的trace檔案放在哪裡,Oracle 10g和11g存放trace目錄是不一樣的,Oracle 10g中一般是$ORACLE_BASE/admin/$ORACLE_SID/udump和$ORACLE_BASE/admin/$ORACLE_SID/bdump(往往關心udump),而11g則引入了ADR(Automatic Diagnostic Repository)新特性,trace檔案就放於{adr_base}/diag/rdbms/{database_name}/$ORACLE_SID/trace下。
Oracle 11g Trace目錄中{adr_base}如下查看:
luocs@MAA> show parameter diag
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
diagnostic_dest string /u01/app/oracle
追蹤檔案的前台進程會被定向到USER_DUMP_DEST參數所指定的目錄,而追蹤檔案的後台進程則使用BACKGROUND_DUMP_DEST參數所指向的目錄。無論在哪種情況下,TRACE的尾碼都是.trc。
Oracle 10g中,我們可以如下查看trace目錄
sys@LTB> show parameter user_dump_dest
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
user_dump_dest string /u01/app/oracle/admin/ltb/udump
sys@LTB> show parameter background_dump_dest
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
background_dump_dest string /u01/app/oracle/admin/ltb/bdump
或者通過查v$parameter獲得
sys@LTB> select name, value from v$parameter where name in ('user_dump_dest','background_dump_dest');
NAME VALUE
----------------------------------- -----------------------------------------------------------------
background_dump_dest /u01/app/oracle/admin/ltb/bdump
user_dump_dest /u01/app/oracle/admin/ltb/udump
而Oracle 11g中,前台進程和後台進程所指定的trace目錄是相同的
sys@MAA> select name, value from v$parameter where name in ('user_dump_dest','background_dump_dest');
NAME VALUE
-------------------- -----------------------------------------------------------------
background_dump_dest /u01/app/oracle/diag/rdbms/maa/maa/trace
user_dump_dest /u01/app/oracle/diag/rdbms/maa/maa/trace
另外,如果尋找當前會話的trace檔案,也可以使用如下指令碼:
sys@LTB> column trace new_val T
sys@LTB> select c.value || '/' || d.instance_name || '_ora_' ||
2 a.spid || '.trc' ||
3 case when e.value is not null then '_'||e.value end trace
4 from v$process a, v$session b, v$parameter c, v$instance d, v$parameter e
5 where a.addr = b.paddr
6 and b.audsid = userenv('sessionid')
7 and c.name = 'user_dump_dest'
8 and e.name = 'tracefile_identifier'
9 /
TRACE
------------------------------------------------------------------