zoukankan      html  css  js  c++  java
  • DBMS_MONITOR程序开启10046事件

    在具有连接池或共享服务器的多层环境中,一个会话可以跨越多个进程,甚至跨越多个实例。DBMS_MONITOR是在Oracle 10g中引入的内置的程序包,通过该程序包可以跟踪从客户机到中间层、再到后端数据库的任何用户的会话,从而可以较为容易地标识创建大量工作量的特定用户。DBMS_MONITOR取代了传统的跟踪工具,例如DBMS_ SUPPORT。需要具有DBA角色才可以使用DBMS_MONITOR。

    端对端的应用程序跟踪可以基于如下:

    会话:基于会话ID(SID)和序列号。

    客户端标识符:允许跨越多个会话设置跟踪。基于登录ID指定终端用户。使用DBMS_SESSION.SET_IDENTIFIER过程设置该值。

    实例:基于实例名指定给定的实例。

    服务名:指定一组相关的应用程序。使用DBMS_SERVICE.CREATE_SERVICE过程设置该值。

    模块名:开发人员在其应用程序代码中使用DBMS_ APPLICATION _INFO.SET _MODULE过程设置该值。使用该名称表示执行的模块或代码。

    操作名:开发人员在其应用程序代码中使用DBMS_ APPLICATION _INFO.SET _ACTION过程设置该值。使用该名称表示模块执行的操作。

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

    1. 基于会话ID和序列号设置跟踪

    为了基于会话ID和序列号设置跟踪,首先确定需要跟踪的会话的SID和序列号:

    Select     sid,serial#,username
    from       v$session;
    SID       SERIAL# USERNAME
    ----------  ---------- ------------------------------
    156          3588  SCOTT
    142          1054 SYS

    为了启用跟踪,可执行如下语句:

    SQL> exec dbms_monitor.session_trace_enable(156,3588,TRUE,FALSE);
    

    第三个参数用于等待(默认为TRUE),第四个参数用于绑定变量(默认为FALSE)。

    为了关闭跟踪,可执行如下语句:

    SQL> exec dbms_monitor.session_trace_disable(156,3588);
    

    为了跟踪当前的会话,可设置SID和SERIAL#为空:

    SQL> exec dbms_monitor.session_trace_enable(null,null);

    2. 基于客户端标识符设置跟踪

    为了基于表示用户的客户端标识符设置跟踪,可运行如下语句:

    SQL> exec dbms_session.set_identifier('bryan id');

    为了验证客户端标识符,可执行如下语句:

    select     sid,serial#,username, client_identifier
    from        v$session
    where      client_identifier is not null;
    SID     SERIAL#  USERNAME                      CLIENT_IDENTIFIER
    ---------- ----------  ------------------------   ------------------
    156         3588   SCOTT                         bryan id

    现在就可以为这个客户端标识符设置跟踪:

    SQL> exec dbms_monitor.client_id_trace_enable('bryan id',true,false);

    第二个参数用于等待(默认为TRUE),第三个参数用于绑定变量(默认为FALSE)。

    为了禁用这个客户端标识符跟踪,可执行如下语句:

    SQL> exec dbms_monitor.client_id_trace_disable('bryan id');

    3. 设置服务名/模块名/操作名的跟踪

    为了使用操作名,必须有对应的模块名和服务名。为了使用模块名,必须有服务名。对全局范围内针对某个数据库的服务名、模块名和操作名的给定组合启用跟踪,除非为过程指定了实例名。服务名由用于连接到服务的连接字符串确定。

    Oracle数据库表示为作为服务的客户端;也就是说,数据库代表客户端执行相应的操作。数据库可以有一个或多个与其关联的服务。例如,可以有一个数据库,该数据库带有两个用于Web客户端的不同服务:用于购买书籍的客户端的book.us.acme.com,以及用于购买软件的客户端的soft.us.acme.com。在该示例中,数据库名是sales.acme.com,因此服务名并不基于数据库名。服务名由初始参数文件中的SERVICE_NAMES参数指定。服务名默认为由数据库名(DB_NAME参数)和域名(DB_DOMAIN参数)组成的全局数据库名。

    为了启用服务名的跟踪,可执行如下语句:

    SQL> exec dbms_monitor.serv_mod_act_trace_enable(service_name=>'ebk2');

    这将跟踪服务名为ebk2的所有会话。

    为了启用服务名、模块名和操作名组合的跟踪,可执行如下语句:

    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');

    技巧:

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

    4. 启用跟踪视图

    查看DBA_ENABLED_TRACES和DBA_ENABLED_AGGREGATIONS视图,可以看到启用的跟踪和收集的统计信息。可以使用这些视图确保已经禁用的所有跟踪选项。

  • 相关阅读:
    python操作MySQL数据库(转)
    python3.3.2中的关键字(转)
    HashMap的键值需要注意什么?
    为什么基本类型不能做为HashMap的键值?
    怎么确保一个集合不能被修改?
    Iterator和 ListIterator有什么区别?
    Iterator怎么使用?有什么特点?
    迭代器Iterator是什么?
    哪些集合类是线程安全的?
    Queue的element()和peek()方法有什么区别?
  • 原文地址:https://www.cnblogs.com/youngerger/p/8541918.html
Copyright © 2011-2022 走看看