檢查是否啟用了跟蹤(oracle 白皮書 轉)

mahanso發表於2010-11-03
        如果會話執行的任務和預期不符,或者執行速度比較慢,那麼大多數資料庫管理員的第一步是檢查等待事件。要構建配置檔案,您可能還需要長期跟蹤會話,那麼在 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_binds
from v$session 
where username = 'HR'
輸出結果如下:
SID    SERIAL# SQL_TRAC SQL_T SQL_T
---------- ---------- -------- ----- -----
196      60946 DISABLED FALSE FALSE
此處您可以看到,SID 為 196、Serial# 為 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_binds
from v$session 
where 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_MODULE
136 SERVICE_MODULE_ACTION
您可以看到,您已經對會話 136 的 Service Module 和 Service Module Action 啟用了跟蹤。但 DBA_ENABLED_TRACES 並未顯示繫結變數或等待事件。

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

相關文章