在具有許多活躍用戶的繁忙生產環境中,跟蹤SQL會話是費時且十分復雜的,因為在任何使用連接池的多層系統中處理SQL語句可能要涉及多個進程,或者甚至是不同的實例。
利用Oracle數據庫10g,Oralce通過一個新的內置軟件包DBMS_MONITOR合理化了SQL的跟蹤,這個軟件包中包含以前無書面記載的跟蹤工具(如DBMS_SUPPORT軟件包)的功能。現在,您可以輕松地從頭到尾--從客戶機到中間層再到後端--跟蹤任何用戶的會話,並且基於特定的客戶ID、模塊或動作生成跟蹤文件。
此外,Oracle數據庫10g包含一種新的實用程序trcsess,它可以讓您基於會話ID或模塊名稱之類的條件,有選擇地從大量跟蹤文件中抽取出跟蹤數據,並將它們保存到一個文件中。該實用程序在共享服務器配置中特別有用,因為調度程序可能把每一個用戶請求傳遞給不同的共享服務器進程,從而為任何給定的會話產生多個跟蹤文件。與通過大量跟蹤文件發掘信息不同,Oracle數據庫10g的trcsess可以讓您獲得關於單一用戶會話的整合後的跟蹤信息。
開始
和Oracle數據庫的以前版本一樣,跟蹤文件將被輸出到由服務器的初始化文件(或spfile)的user_dump_dest參數指定的目錄中。默認的位置取決於操作系統;例如,對於使用DBCA的Microsoft Windows平台,默認位置是$ORACLE_BASE\instance_name\admin\udump,其中instance_ name是Oracle實例的名稱。您可以通過使用以下改變會話命令來動態地更改該參數:
alter session set user_dump_dest="c:\kflosstrace";
您還可以把您自己的標記添加到跟蹤文件名中,以便您能夠更容易地找到生成的文件。為此,可以在啟動跟蹤之前設置tracefile_identifIEr初始化參數:
alter session set tracefile_identifIEr ="kfloss_test";
通過該命令生成的跟蹤文件帶有您設置的附加在文件名後的字符串值。盡管這些改變會話命令都不是必要的,但是它們都會使查找跟蹤會話的結果更容易。
現在,我們已經設置了這些參數,那麼讓我們看看新的跟蹤軟件包和Oracle企業管理器的界面。讓我們使用新的DBMS_MONITOR軟件包通過模塊名稱和客戶機名稱來建立一個跟蹤。
用DBMS_MONITOR建立跟蹤
DBMS_MONITOR包具有多個例程,用於啟用和禁用統計數據集合,以及用於根據會話ID進行跟蹤、或者基於服務名稱、模塊名稱和動作名稱的組合進行跟蹤。(它們三者從層次結構上是關聯的:您不能在不指定模塊和服務名稱的情況下指定一個動作,但是您可以只指定服務名稱,或者只指定服務名稱和模塊名稱)。 模塊名稱和動作名稱(如果有的話)都來自於應用程序代碼內部。例如,Oracle電子商務套件應用程序在代碼中提供了模塊名稱和動作名稱,這樣您就可以在任何Oralce企業管理器頁面中通過名稱來識別它們。 (PL/SQL開發人員可以通過使用DBMS_APPLICATION_INFO包設置模塊名稱和動作名稱,把一些調用嵌入到他們的應用程序中)。
請注意,設置模塊、動作及其他參數(如clIEnt_id)將不造成對數據庫的往返操作--這些例程攜帶來自應用程序的所有調用。
服務名稱由用於連接該服務的連接字符串來確定。未與特定服務關聯的用戶會話將由sys$users處理(sys$background是後台進程的默認服務)。由於我們具有一個服務和一個模塊名稱,因而我們可以啟動對該模塊的跟蹤,如下所示:
SQL> exec dbms_monitor.serv_mod_act_trace_enable (service_name=>'testenv', module_name=>'product_update');
PL/SQL過程已成功完成。
我們可以啟動對客戶機的跟蹤:
SQL> exec dbms_monitor.client_id_trace_enable (clIEnt_id=>'kimberly');
PL/SQL過程已成功完成。
請注意,所有這些設置都是永久性的--所有與該服務和模塊關聯的會話都會被跟蹤,而不僅僅是跟蹤當前會話。
為了基於會話ID跟蹤SQL,可以查看Oracle企業管理器的Top Sessions頁面,或者像您當前做的那樣查詢V$SESSION視圖。
SQL> select sid, serial#, username from v$session; SID SERIAL# USERNAME ------ ------- ------------ 133 4152 SYS 137 2418 SYSMAN 139 53 KIMBERLY 140 561 DBSNMP 141 4 DBSNMP . . . 168 1 169 1 170 1 28 rows selected.
通過會話ID(SID)和序號,您可以使用DBMS_MONITOR只對下面的會話啟用跟蹤:
SQL> exec dbms_monitor.session_trace_enable(139);
PL/SQL過程已成功完成。
該序號默認為該SID的當前序號(除非另外指定),因此如果那就是您想跟蹤的會話和序號,那麼您就不必查看更多的內容了。還有,默認情況下,WAITS設置為true而BINDS設置為false,因此上面的語法實際上與下面的語法效果相同:
SQL> exec dbms_monitor.session_trace_enable (session_id=>139, serial_num=>53, waits=>true, binds=>false);
請注意,WAITS和BINDS是相同的參數,您在過去可能已經使用DBMS_SUPPORT和10046事件對它們進行了設置。
如果您正在一個生產環境中工作,那麼此時您最好重新運行出錯的SQL或應用程序,並且相應地創建跟蹤文件。
用企業管理器建立跟蹤
通過Oracle企業管理器建立跟蹤從Top Consumers頁面(可以通過Additional Monitoring Links區域中的Performance頁面得到,如圖1所示)開始。該頁面顯示服務、模塊、客戶和動作對系統資源的當前使用情況。
圖1:Oracle企業管理器的Top Consumers頁面
您可以單擊Top Services、Top Modules、Top Actions、Top ClIEnts或Top Sessions選項卡,來查看這些類別的頂級消費者中每一種的詳細信息,隨後您可以通過這些頁面中的每一個頁面輕松啟用(或禁用)SQL跟蹤。從頁面上的列表中簡單地選擇項目,然後單擊啟用SQL跟蹤(Enable SQL Trace)開始跟蹤(當您完成跟蹤時,單擊禁用按鈕)。
您還可以啟用(或禁用)這些頁面上列出的任何項目的統計數據集合。(DBMS_MONITOR還提供了用於啟用和禁用數據集合的例程)。
分析跟蹤結果
獲取關於Kimberly Floss的圖書的信息
無論您是使用DBMS_MONITOR或者是使用Oracle企業管理器建立跟蹤,您都將使用trcsess 命令行工具來整合跟蹤文件。單擊Oracle企業管理器中的查看SQL跟蹤(VIEw SQL Trace)按鈕顯示一個頁面,其中顯示了您將用於整合所有跟蹤文件的語法。
要確保用雙引號括住字符串,並在文件名後添加一個".trc"擴展名;否則,TKPROF將不會把它作為一個文件名來接受。在執行該命令之前,找到在user_dump_dest(或者,如果您沒有更改該參數名,則在\udump)中指定的目錄。
C:\...\udump> trcsess output="kfloss.trc" service="testenv" module="product update" action="batch insert"
隨後,您可以對整合的跟蹤文件運行TKPROF,以生成一份報告。
C:\...\udump> tkprof kfloss.trc output=kfloss_trace_report SORT=(EXEELA, PRSELA, FCHELA)
如果您不終止跟蹤,那麼運行該服務和模塊的每一個會話都會被跟蹤。因此,當您完成跟蹤時,要確保通過使用Oralce企業管理器或DBMS_MONITOR包來終止跟蹤。