数据库中如何使用dbms

74次阅读
没有评论

共计 5336 个字符,预计需要花费 14 分钟才能阅读完成。

行业资讯    
数据库    
关系型数据库    
数据库中如何使用 dbms_monitor 跟踪多个会话,service_name,sid 等

这篇文章主要为大家展示了“数据库中如何使用 dbms_monitor 跟踪多个会话,service_name,sid 等”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“数据库中如何使用 dbms_monitor 跟踪多个会话,service_name,sid 等”这篇文章吧。

概述

具有连接池或共享服务器的多层环境中,一个会话可以跨越多个进程,甚至跨越多个实例。DBMS_MONITOR 是在 Oracle
10g 中引入的内置的程序包,通过该程序包可以跟踪从客户机到中间层、再到后端数据库的任何用户的会话。由于每个会话都会产生独立的 trace 文件,因而
可以较为容易地标识创建大量工作量的特定用户。DBMS_MONITOR 取代了传统的跟踪工具,例如 DBMS_SUPPORT。需要具有 DBA 角色才可以使用 DBMS_MONITOR。
端对端的应用程序跟踪可以基于如下:
会话(SID):基于会话 ID(SID)和序列号。
客户端标识符 (client_identifier):允许跨越多个会话设置跟踪。基于登录 ID 指定终端用户。使用 DBMS_SESSION.SET_IDENTIFIER 过程设置该值。
实例 (INST_NAME):基于实例名指定给定的实例。
服务名 (SERVICE_NAME):指定一组相关的应用程序。使用 DBMS_SERVICE.CREATE_SERVICE 过程设置该值。
模块名 (MODULE):开发人员在其应用程序代码中使用 DBMS_APPLICATION_INFO.SET_MODULE 过程设置该值。使用该名称表示执行的模块或代码。
操作名(ACTION):开发人员在其应用程序代码中使用 DBMS_APPLICATION_INFO.SET_ACTION 过程设置该值。使用该名称表示模块执行的操作。

也可以执行如下 sql:
select sid,serial#,SERVICE_NAME,MODULE,ACTION,client_identifier from v$session;

最后 3 个跟踪选项在层次上关联;不可以在没有指定模块名和服务名的情况下就指定操作名,但是可以只指定服务名,或者只指定服务名和模块名。

1. 基于会话 ID 和序列号设置跟踪 (serial# 可以加,也可以不加)
为了基于会话 ID 和序列号设置跟踪,首先确定需要跟踪的会话的 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

为了启用跟踪,可执行如下语句:
第三个参数用于等待(默认为 TRUE),第四个参数用于绑定变量(默认为 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

为了关闭跟踪,可执行如下语句:
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

执行如下:
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

为了跟踪当前的会话,可设置 SID 和 SERIAL# 为空:
SQL exec dbms_monitor.session_trace_enable(null,null);

2. 基于客户端标识符设置跟踪
为了基于表示用户的客户端标识符设置跟踪,可运行如下语句:
SQL exec dbms_session.set_identifier(bryan id

或者执行执行如下 sql:
select sid,serial#,username,client_identifier from v$session;

为了验证客户端标识符,可执行如下语句:
select sid,serial#,username,client_identifier from v$session;

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

现在就可以为这个客户端标识符设置跟踪:第二个参数用于等待(默认为 TRUE),第三个参数用于绑定变量(默认为 FALSE)。
SQL   exec dbms_monitor.client_id_trace_enable(bryan id ,true,true);

PL/SQL procedure successfully completed.

– 执行一些操作:
SQL create table a as select * from dba_objects where rownum

Table created.

SQL insert into a select * from a;

9 rows created.

SQL commit;

Commit complete.

SQL select count(*) from a;

  COUNT(*)
———-
  18

为了禁用这个客户端标识符跟踪,可执行如下语句:
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. 设置服务名 / 模块名 / 操作名的跟踪
为了使用操作名,必须有对应的模块名和服务名。为了使用模块名,必须有服务名。对全局范围内针对某个数据库的服务名、模块名和操作名的给定组合启用跟踪,除非为过程指定了实例名。服务名由用于连接到服务的连接字符串确定。
Oracle
数据库表示为作为服务的客户端;也就是说,数据库代表客户端执行相应的操作。数据库可以有一个或多个与其关联的服务。例如,可以有一个数据库,该数据库带
有两个用于 Web 客户端的不同服务:用于购买书籍的客户端的 book.us.acme.com,以及用于购买软件的客户端的
soft.us.acme.com。在该示例中,数据库名是 sales.acme.com,因此服务名并不基于数据库名。服务名由初始参数文件中的
SERVICE_NAMES 参数指定。服务名默认为由数据库名 (DB_NAME 参数) 和域名 (DB_DOMAIN 参数) 组成的全局数据库名。

– 使用如下失去了查询服务名 / 模块名 / 操作名:
select sid,serial#,SERVICE_NAME,MODULE,ACTION,client_identifier from v$session;

为了启用服务名的跟踪,可执行如下语句:
SQL exec dbms_monitor.serv_mod_act_trace_enable(service_name= DBdb
这将跟踪服务名为 DBdb 的所有会话。

为了启用服务名、模块名和操作名组合的跟踪,可执行如下语句:
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

为了跟踪整个数据库或实例,可执行如下语句(不推荐这样操作):
execute DBMS_MONITOR.DATABASE_TRACE_ENABLE(waits = TRUE, binds = FALSE, instance_name = ebk1
execute DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name = ebk1);

注意:使用 DBMS_MONITOR 时,请确保在完成操作时禁用跟踪;否则,将会跟踪满足指定条件的每个会话。

以上是“数据库中如何使用 dbms_monitor 跟踪多个会话,service_name,sid 等”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计5336字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)