檢查資料庫是否啟用了跟蹤

jolly10發表於2007-11-21
如果會話執行的任務和預期不符,或者執行速度比較慢,那麼大多數資料庫管理員的第一步是檢查等待事件。要構建配置檔案,您可能還需要長期跟蹤會話,那麼在 user_dump_dest 目錄中將生成一個跟蹤檔案。[@more@]

如果會話執行的任務和預期不符,或者執行速度比較慢,那麼大多數資料庫管理員的第一步是檢查等待事件。要構建配置檔案,您可能還需要長期跟蹤會話,那麼在 user_dump_dest 目錄中將生成一個跟蹤檔案。

  現在,假設您在某段時間內對多個會話使用了端到端跟蹤,但現在不知道哪些會話處於跟蹤狀態。如何找出這些對話呢?

  方法之一是對大量跟蹤檔案進行篩選,以提取 SID Serial# 列並在資料庫的 V$SESSION 檢視中進行匹配。毋庸質疑,這個過程比較複雜、困難並且容易出錯。Oracle 資料庫 10g 2 版中提供了一個更優秀、更簡單的方法:您所要做的只是檢視一個檢視,即 V$SESSION

  新增了三個新列顯示跟蹤狀態:

sql_trace - 如果在會話中啟用了 SQL 跟蹤,則顯示 TRUE/FALSE

sql_trace_waits - 如果啟用了會話跟蹤,則可以讓跟蹤程式將等待資訊寫入跟蹤檔案,這對於診斷效能問題很有用。

sql_trace_binds - 如果會話使用繫結變數,則可以讓跟蹤程式將繫結變數值寫入跟蹤檔案。該列顯示 TRUE/FALSE

  當未開啟會話跟蹤時,如果選擇這些列:

select sid, serial#, sql_trace, sql_trace_waits, sql_trace_bindsfrom v$sessionwhere username = ''''HR''''

  輸出結果如下:

SID SERIAL# SQL_TRAC SQL_T SQL_T

---------- ---------- -------- ----- -----

196 60946 DISABLED FALSE FALSE

  此處您可以看到,SID 196Serial# 60946 的會話未啟用跟蹤。

  現在,您可以對等待事件(而不是繫結變數)啟用跟蹤。可以使用程式包 dbms_monitor 啟用跟蹤。

Begin dbms_monitor.session_trace_enable (session_id => 196,serial_num => 60960,waits => true,binds => false);end;/

  現在,如果您要檢視會話資訊:

  select sid, serial#, sql_trace, sql_trace_waits, sql_trace_bindsfrom v$sessionwhere username = ''''HR''''

  輸出結果如下:

SID SERIAL# SQL_TRAC SQL_T SQL_T

---------- ---------- -------- ----- -----

196 60960 ENABLED TRUE FALSE

  注意,僅當使用程式包 dbms_monitor 中的過程 session_trace_enable 啟用跟蹤(而不是透過 alter session set sql_trace = true 或設定事件 10046)時,才會填充檢視 V$SESSION。在以後的某個時間點上,如果您要查明哪些會話已經啟用了跟蹤,可以使用以上查詢執行此操作。

  如果使用程式包 dbms_monitor 中的其他過程(如 SERV_MOD_ACT_TRACE_ENABLE CLIENT_ID_TRACE_ENABLE)啟用了跟蹤,V$SESSION 檢視將不顯示該資訊。相反,它們將記錄到另一個檢視 DBA_ENABLED_TRACES 中。可以將該檢視與其他相關資訊儲存連線在一起以檢視啟用了跟蹤的會話。例如,使用

SELECT * FROM (SELECT SID, 'SESSION_TRACE' trace_type FROM v$session WHERE sql_trace = 'ENABLED')

UNION

(SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t

WHERE t.trace_type = 'CLIENT_ID' AND s.client_identifier = t.primary_id)

UNION

(SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance I

WHERE t.trace_type = 'SERVICE' AND s.service_name = t.primary_id

AND (t.instance_name IS NULL OR t.instance_name = i.instance_name))

UNION

(SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance I

WHERE t.trace_type = 'SERVICE_MODULE' AND s.service_name = t.primary_id

AND s.module = t.qualifier_id1 AND (t.instance_name IS NULL OR t.instance_name = i.instance_name))

UNION

(SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance I

WHERE t.trace_type = 'SERVICE_MODULE_ACTION' AND s.service_name = t.primary_id

AND s.module = t.qualifier_id1 AND s.action = t.qualifier_id2

AND (t.instance_name IS NULL OR t.instance_name = i.instance_name))

UNION

(SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance I

WHERE t.trace_type = 'DATABASE' AND (t.instance_name IS NULL OR t.instance_name = i.instance_name));

  輸出結果如下:

SID TRACE_TYPE

---------- ---------------------

136 SERVICE_MODULE136 SERVICE_MODULE_ACTION

  您可以看到,您已經對會話 136 Service Module Service Module Action 啟用了跟蹤。但 DBA_ENABLED_TRACES 並未顯示繫結變數或等待事件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-983178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章