溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個(gè)會(huì)話,service_name,sid等

發(fā)布時(shí)間:2021-11-10 09:11:07 來源:億速云 閱讀:135 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要為大家展示了“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個(gè)會(huì)話,service_name,sid等”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個(gè)會(huì)話,service_name,sid等”這篇文章吧。


概述

在 具有連接池或共享服務(wù)器的多層環(huán)境中,一個(gè)會(huì)話可以跨越多個(gè)進(jìn)程,甚至跨越多個(gè)實(shí)例。DBMS_MONITOR是在Oracle 10g中引入的內(nèi)置的程序包,通過該程序包可以跟蹤從客戶機(jī)到中間層、再到后端數(shù)據(jù)庫的任何用戶的會(huì)話。由于每個(gè)會(huì)話都會(huì)產(chǎn)生獨(dú)立的trace文件,因而 可以較為容易地標(biāo)識(shí)創(chuàng)建大量工作量的特定用戶。DBMS_MONITOR取代了傳統(tǒng)的跟蹤工具,例如DBMS_SUPPORT。需要具有DBA角色才可以使用DBMS_MONITOR。
端對(duì)端的應(yīng)用程序跟蹤可以基于如下:
會(huì)話(SID):基于會(huì)話ID(SID)和序列號(hào)。
客戶端標(biāo)識(shí)符(client_identifier):允許跨越多個(gè)會(huì)話設(shè)置跟蹤?;诘卿汭D指定終端用戶。使用DBMS_SESSION.SET_IDENTIFIER過程設(shè)置該值。
實(shí)例(INST_NAME):基于實(shí)例名指定給定的實(shí)例。
服務(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個(gè)跟蹤選項(xiàng)在層次上關(guān)聯(lián);不可以在沒有指定模塊名和服務(wù)名的情況下就指定操作名,但是可以只指定服務(wù)名,或者只指定服務(wù)名和模塊名。


1.基于會(huì)話ID和序列號(hào)設(shè)置跟蹤(serial#可以加,也可以不加)

為了基于會(huì)話ID和序列號(hào)設(shè)置跟蹤,首先確定需要跟蹤的會(huì)話的SID和序列號(hào):
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í)行如下語句:
第三個(gè)參數(shù)用于等待(默認(rèn)為TRUE),第四個(gè)參數(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)前的會(huì)話,可設(shè)置SID和SERIAL#為空:
SQL> exec dbms_monitor.session_trace_enable(null,null);

2.基于客戶端標(biāo)識(shí)符設(shè)置跟蹤
為了基于表示用戶的客戶端標(biāo)識(shí)符設(shè)置跟蹤,可運(yùn)行如下語句:
SQL> exec dbms_session.set_identifier('bryan id');

或者執(zhí)行執(zhí)行如下sql:
select sid,serial#,username,client_identifier from v$session;

為了驗(yàn)證客戶端標(biāo)識(shí)符,可執(zhí)行如下語句:
select sid,serial#,username,client_identifier from v$session;

       SID    SERIAL# USERNAME                       CLIENT_IDENTIFIER
---------- ---------- ------------------------------ ----------------------------------------------------------------
         1          5 SYS                            bryan id

現(xiàn)在就可以為這個(gè)客戶端標(biāo)識(shí)符設(shè)置跟蹤:第二個(gè)參數(shù)用于等待(默認(rèn)為TRUE),第三個(gè)參數(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

為了禁用這個(gè)客戶端標(biāo)識(shí)符跟蹤,可執(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ù)名/模塊名/操作名的跟蹤
為了使用操作名,必須有對(duì)應(yīng)的模塊名和服務(wù)名。為了使用模塊名,必須有服務(wù)名。對(duì)全局范圍內(nèi)針對(duì)某個(gè)數(shù)據(jù)庫的服務(wù)名、模塊名和操作名的給定組合啟用跟蹤,除非為過程指定了實(shí)例名。服務(wù)名由用于連接到服務(wù)的連接字符串確定。
Oracle 數(shù)據(jù)庫表示為作為服務(wù)的客戶端;也就是說,數(shù)據(jù)庫代表客戶端執(zhí)行相應(yīng)的操作。數(shù)據(jù)庫可以有一個(gè)或多個(gè)與其關(guān)聯(lián)的服務(wù)。例如,可以有一個(gè)數(shù)據(jù)庫,該數(shù)據(jù)庫帶 有兩個(gè)用于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所有會(huì)話。

為了啟用服務(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');

為了跟蹤整個(gè)數(shù)據(jù)庫或?qū)嵗?/strong>,可執(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í),請(qǐng)確保在完成操作時(shí)禁用跟蹤;否則,將會(huì)跟蹤滿足指定條件的每個(gè)會(huì)話。

以上是“數(shù)據(jù)庫中如何使用dbms_monitor跟蹤多個(gè)會(huì)話,service_name,sid等”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI