国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

如何收集Oracle進程中的sql跟蹤信息

2024-08-29 13:29:03
字體:
來源:轉載
供稿:網友


在診斷數據庫系統性能的過程中,總會涉及到跟蹤效率低下的sql語句,現在就如何跟蹤sql語句來做一個簡單的總結。權做拋磚引玉之用。

如果我們可以修改應用系統的源代碼,則可以直接在程序中加入如下的語句:

1)alter session set timed_statistics=true; /*適用于oracle 7.3以后的版本*/

2)alter session set max_dump_file_size=unlimited ; /*適用于oracle 7.3以后的版本*/

3)alter session set tracefile_identifier='pox20031031a'; /*適用于oracle 8.1.7以后的版本*/

4)alter session set events '10046 trace name context forever, level 8';

/*在這里編寫應用程序的代碼*/

5)alter session set events '10046 trace name context off';

在上述語句中,語句1)是把該會話的時間統計打開,該參數默認為false.在oracle 7.3之前的版本中,不能在會話級設置該參數,只能修改初始化文件然后重新啟動數據庫,這樣將在實例級打開時間統計。

語句2)是把跟蹤文件的大小設置成操作系統所允許的最大尺寸,這樣可以防止跟蹤文件在完成所需要的跟蹤之前被填充滿,此外需要注意的是確保存放跟蹤文件的目錄要有足夠的空間,否則將會收到“文件系統已滿”錯誤。

語句3)的作用是使生成的跟蹤文件名稱中包含'pox20031031a'字符串,這樣可以使你很容易的找到所需的跟蹤文件,該參數在oracle 8.1.7之后可用。

語句4)和語句5)的作用分別是打開和關閉跟sql跟蹤,你可以在這兩個語句之間寫入應用程序的代碼,這些代碼的執行情況都將被跟蹤。需要注意的是語句4)的level關鍵字,它用來指定跟蹤級別,一共有0,1,2,4,8,12六個級別可以設置,0相當于關閉跟蹤;1是輸出一般的跟蹤信息,不包括綁定變量和等待信息;2和1相同;4是在級別1的基礎上增加綁定變量信息;8是在級別1的基礎上增加等待信息;級別12是輸出包含級別1,4,8的所有信息。

如果應用程序的代碼無法修改或者是不想去修改,則可以在其他會話中打開對特定會話的跟蹤,方法如下:

1)sys.dbms_system.set_bool_param_in_session(:sid, :serial,'timed_statistics', true);

2)sys.dbms_system.set_int_param_in_session( :sid, :serial,'max_dump_file_size', 2147483647);

打開和關閉跟蹤的第一種方法(oracle推薦):

3.1)sys.dbms_support.start_trace_in_session(:sid, :serial,waits=>true, binds=>false);

/* 在此期間運行要跟蹤的應用程序*/

4.1)sys.dbms_support.stop_trace_in_session(:sid, :serial);

打開和關閉跟蹤的第二種方法:

3.2)sys.dbms_system.set_ev(:sid, :serial, 10046, 8, '');

/*在此期間運行要跟蹤的應用程序*/

3.2)sys.dbms_system.set_ev(:sid, :serial, 10046, 0, '');

以上語句中的:sid和:serial分別代表所要跟蹤的會話的id和序列號,這些信息可以從v$session視圖的sid和serial#列獲得。打開關閉跟蹤中第一種方法的好處是你不用自己寫10046這個事件號,這樣可以減少錯誤,但是dbms_support程序包在你的數據庫中可能會不存在,這樣就只有用第二種方法了。

到現在為止,我們已經生成了所需要的跟蹤文件,然后我們需要找到該文件來進行分析。跟蹤文件的存放位置只有兩種可能,oracle參數user_dump_dest 或者background_dump_dest指定的目錄;文件名稱根據不同的平臺會有所不同,但是在文件名中都會包含會話所對應的操作系統進程(線程)號,也就是v$process的spid列(v$process.spid) ,該信息可以通過 v$process.addr和v$session.paddr做表連接查詢得到。例如:select spid from v$process p,v$session s where p.addr=s.paddr and s.sid=:sid and s.serial#=:serial.

本文只對oracle在使用專用服務器進程(dedicated server)模式做了總結,至于的共享服務器(shared server)模式和在應用級使用連接池的情況下,收集sql跟蹤信息的方法會比較復雜,希望有相關經驗的高手來總結。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永泰县| 扶风县| 筠连县| 浙江省| 鄂托克旗| 辽宁省| 武威市| 乡宁县| 织金县| 永宁县| 图片| 白城市| 尚义县| 冷水江市| 贡觉县| 莱阳市| 扎鲁特旗| 五峰| 项城市| 呼图壁县| 梁山县| 新平| 常山县| 会同县| 上思县| 军事| 吴忠市| 麻栗坡县| 德保县| 壤塘县| 汨罗市| 天门市| 新竹市| 天柱县| 磐安县| 永泰县| 镇江市| 邹平县| 新和县| 武川县| 什邡市|