這篇文章主要為大家展示了“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個會話,service_name,sid等”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個會話,service_name,sid等”這篇文章吧。
創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為略陽企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、做網(wǎng)站,略陽網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
概述
在
具有連接池或共享服務(wù)器的多層環(huán)境中,一個會話可以跨越多個進程,甚至跨越多個實例。DBMS_MONITOR是在Oracle
10g中引入的內(nèi)置的程序包,通過該程序包可以跟蹤從客戶機到中間層、再到后端數(shù)據(jù)庫的任何用戶的會話。由于每個會話都會產(chǎn)生獨立的trace文件,因而
可以較為容易地標(biāo)識創(chuàng)建大量工作量的特定用戶。DBMS_MONITOR取代了傳統(tǒng)的跟蹤工具,例如DBMS_SUPPORT。需要具有DBA角色才可以使用DBMS_MONITOR。
端對端的應(yīng)用程序跟蹤可以基于如下:
會話(SID):基于會話ID(SID)和序列號。
客戶端標(biāo)識符(client_identifier):允許跨越多個會話設(shè)置跟蹤?;诘卿汭D指定終端用戶。使用DBMS_SESSION.SET_IDENTIFIER過程設(shè)置該值。
實例(INST_NAME):基于實例名指定給定的實例。
服務(wù)名(SERVICE_NAME):指定一組相關(guān)的應(yīng)用程序。使用DBMS_SERVICE.CREATE_SERVICE過程設(shè)置該值。
模塊名(MODULE):開發(fā)人員在其應(yīng)用程序代碼中使用DBMS_APPLICATION_INFO.SET_MODULE過程設(shè)置該值。使用該名稱表示執(zhí)行的模塊或代碼。
操作名(ACTION):開發(fā)人員在其應(yīng)用程序代碼中使用DBMS_APPLICATION_INFO.SET_ACTION過程設(shè)置該值。使用該名稱表示模塊執(zhí)行的操作。
也可以執(zhí)行如下sql:
select sid,serial#,SERVICE_NAME,MODULE,ACTION,client_identifier from v$session;
最后3個跟蹤選項在層次上關(guān)聯(lián);不可以在沒有指定模塊名和服務(wù)名的情況下就指定操作名,但是可以只指定服務(wù)名,或者只指定服務(wù)名和模塊名。
1.基于會話ID和序列號設(shè)置跟蹤(serial#可以加,也可以不加)
為了基于會話ID和序列號設(shè)置跟蹤,首先確定需要跟蹤的會話的SID和序列號:
SQL>COL PROGRAM FOR A30
SQL> COL EVENT FOR A30
SQL> select sid,serial#,username,program,status,type,event,blocking_session from v$session where type='USER';
SID SERIAL# USERNAME PROGRAM STATUS TYPE EVENT BLOCKING_SESSION
---------- ---------- ------------------------------ ------------------------------ -------- ---------- ------------------------------ ----------------
1 5 SYS sqlplus@wang (TNS V1-V3) ACTIVE USER SQL*Net message to client
37 123 SYS plsqldev.exe INACTIVE USER SQL*Net message from client
38 133 SYS plsqldev.exe INACTIVE USER SQL*Net message from client
39 215 SYS plsqldev.exe INACTIVE USER SQL*Net message from client
41 79 HR sqlplus.exe INACTIVE USER SQL*Net message from client
為了啟用跟蹤,可執(zhí)行如下語句:
第三個參數(shù)用于等待(默認(rèn)為TRUE),第四個參數(shù)用于綁定變量(默認(rèn)為FALSE)。
SQL> exec dbms_monitor.session_trace_enable(1,5,TRUE,TRUE);
PL/SQL procedure successfully completed.
SQL> select sid from v$mystat where rownum=1;
SID
----------
1
SQL> select count(*) from hr.jobs;
COUNT(*)
----------
19
為了關(guān)閉跟蹤,可執(zhí)行如下語句:
SQL> exec dbms_monitor.session_trace_disable(1,5);
PL/SQL procedure successfully completed.
--查詢trace文件位置:
select c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
FROM v$process a, v$session b, v$parameter c, v$instance d
WHERE a.addr = b.paddr
AND b.audsid = userenv('sessionid')
AND c.name = 'user_dump_dest';
執(zhí)行如下:
SQL> select c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
2 FROM v$process a, v$session b, v$parameter c, v$instance d
3 WHERE a.addr = b.paddr
4 AND b.audsid = userenv('sessionid')
5 AND c.name = 'user_dump_dest';
TRACE
------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_5994.trc
使用vi工具查看,/dbms_monitor.session_trace 按鍵n/N
為了跟蹤當(dāng)前的會話,可設(shè)置SID和SERIAL#為空:
SQL> exec dbms_monitor.session_trace_enable(null,null);
2.基于客戶端標(biāo)識符設(shè)置跟蹤
為了基于表示用戶的客戶端標(biāo)識符設(shè)置跟蹤,可運行如下語句:
SQL> exec dbms_session.set_identifier('bryan id');
或者執(zhí)行執(zhí)行如下sql:
select sid,serial#,username,client_identifier from v$session;
為了驗證客戶端標(biāo)識符,可執(zhí)行如下語句:
select sid,serial#,username,client_identifier from v$session;
SID SERIAL# USERNAME CLIENT_IDENTIFIER
---------- ---------- ------------------------------ ----------------------------------------------------------------
1 5 SYS bryan id
現(xiàn)在就可以為這個客戶端標(biāo)識符設(shè)置跟蹤:第二個參數(shù)用于等待(默認(rèn)為TRUE),第三個參數(shù)用于綁定變量(默認(rèn)為FALSE)。
SQL> exec dbms_monitor.client_id_trace_enable('bryan id',true,true);
PL/SQL procedure successfully completed.
--執(zhí)行一些操作:
SQL> create table a as select * from dba_objects where rownum <10;
Table created.
SQL> insert into a select * from a;
9 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from a;
COUNT(*)
----------
18
為了禁用這個客戶端標(biāo)識符跟蹤,可執(zhí)行如下語句:
SQL> exec dbms_monitor.client_id_trace_disable('bryan id');
PL/SQL procedure successfully completed.
--查詢trace文件位置:
select c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
FROM v$process a, v$session b, v$parameter c, v$instance d
WHERE a.addr = b.paddr
AND b.audsid = userenv('sessionid')
AND c.name = 'user_dump_dest';
SQL> select c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
2 FROM v$process a, v$session b, v$parameter c, v$instance d
3 WHERE a.addr = b.paddr
4 AND b.audsid = userenv('sessionid')
5 AND c.name = 'user_dump_dest';
TRACE
-----------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_5994.trc
3.設(shè)置服務(wù)名/模塊名/操作名的跟蹤
為了使用操作名,必須有對應(yīng)的模塊名和服務(wù)名。為了使用模塊名,必須有服務(wù)名。對全局范圍內(nèi)針對某個數(shù)據(jù)庫的服務(wù)名、模塊名和操作名的給定組合啟用跟蹤,除非為過程指定了實例名。服務(wù)名由用于連接到服務(wù)的連接字符串確定。
Oracle
數(shù)據(jù)庫表示為作為服務(wù)的客戶端;也就是說,數(shù)據(jù)庫代表客戶端執(zhí)行相應(yīng)的操作。數(shù)據(jù)庫可以有一個或多個與其關(guān)聯(lián)的服務(wù)。例如,可以有一個數(shù)據(jù)庫,該數(shù)據(jù)庫帶
有兩個用于Web客戶端的不同服務(wù):用于購買書籍的客戶端的book.us.acme.com,以及用于購買軟件的客戶端的
soft.us.acme.com。在該示例中,數(shù)據(jù)庫名是sales.acme.com,因此服務(wù)名并不基于數(shù)據(jù)庫名。服務(wù)名由初始參數(shù)文件中的
SERVICE_NAMES參數(shù)指定。服務(wù)名默認(rèn)為由數(shù)據(jù)庫名(DB_NAME參數(shù))和域名(DB_DOMAIN參數(shù))組成的全局?jǐn)?shù)據(jù)庫名。
--使用如下失去了查詢服務(wù)名/模塊名/操作名:
select sid,serial#,SERVICE_NAME,MODULE,ACTION,client_identifier from v$session;
為了啟用服務(wù)名的跟蹤,可執(zhí)行如下語句:
SQL> exec dbms_monitor.serv_mod_act_trace_enable(service_name=>'DBdb');
這將跟蹤服務(wù)名為DBdb的所有會話。
為了啟用服務(wù)名、模塊名和操作名組合的跟蹤,可執(zhí)行如下語句:
SQL>
exec dbms_monitor.serv_mod_act_trace_enable(service_name=>'ebk2',
module_name=>'salary_update', action_name=>'insert_item');
為了禁用前面代碼中的跟蹤,可使用過程SERV_MOD_ACT_TRACE_DISABLE,如下說是:
SQL>
exec dbms_monitor.serv_mod_act_trace_disable(service_name=>'ebk2',
module_name=>'salary_update', action_name=>'insert_item');
為了跟蹤整個數(shù)據(jù)庫或?qū)嵗蓤?zhí)行如下語句(不推薦這樣操作):
execute DBMS_MONITOR.DATABASE_TRACE_ENABLE(waits => TRUE, binds => FALSE, instance_name => 'ebk1');
execute DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name => 'ebk1');
注意:使用DBMS_MONITOR時,請確保在完成操作時禁用跟蹤;否則,將會跟蹤滿足指定條件的每個會話。
以上是“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個會話,service_name,sid等”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!