Oracle数据库也提供了dbms_monitor包来启用和禁用SQL跟踪。这个包不仅提供了一种启用会话级别的扩展SQL跟踪方法,更重要的是,你可以基于会话属性来启用和禁用SQL跟踪。这些属性包括:客户端标识符、服务名、模块名和动作名。这意味着如果应用配置正确,你可以针对执行数据库调用的会话单独启用和禁用SQL跟踪。目前,这是特别有用的方法,因为在大多数情况下都会用到连接池,所以用户已经不会关联某个特定的会话。
当使用dbms_monitor包时,不需要直接指定诊断事件10046的级别。每个过程提供三个参数(binds、waits以及自版本11.1起才有的plan_stat)
来启用SQL 跟踪。使用以下参数可以启用对应的级别。
Ø 启用级别4,binds 需要设置为TRUE。
Ø 启用级别8,waits 需要设置为TRUE。
Ø 启用级别16,plan_stat 需要设置为all_executions。
Ø 启用级别32,plan_stat 需要设置为never。
Ø dbms_monitor 无法启用级别64。
参数waits的默认值为TRUE。binds的默认值为FALSE。plan_stat的默认值为NULL(相当于first_execution)。因此,默认级别是8。
接下来的内容给出了一些使用dbms_monitor包在会话、客户端、组件和数据库级别启用和禁用SQL跟踪的例子。请注意,在默认情况下,只有拥有dba角色的用户可以执行dbms_monitor包下的过程。
●会话级别
为会话启用和禁用SQL跟踪,dbms_monitor包分别提供了session_trace_enable和session_trace_disable过程。
以下PL/SQL调用针对ID为127、序列号为29的会话启用级别8的SQL跟踪:
dbms_monitor.session_trace_enable(session_id
=> 127,
serial_num => 29,
waits
=> TRUE,
binds
=> FALSE,
plan_stat
=>'first_execution')
所有参数都有默认值。如果有两个关于会话的参数没有指定,就针对执行此PL/SQL调用的会话启用SQL跟踪。
当通过session_trace_enable启用SQL跟踪时,也会相应地设置视图v$session中的sql_trace、sql_trace_waits和sql_trace_binds列。此外,自版本11.1开始,sql_trace_plan_stats列也会生效。注意,直至(并包括)10.2.0.5,这只会在以下情况下发生:在执行sessiontraceenable后至少有一条SQL语句在被跟踪的会话中执行。例如,以下信息在执行了之前的PL/SQL调用后才能查询到:
select
sql_trace,sql_trace_waits,sql_trace_binds,sql_trace_plan_stats
from v$session
where sid=127
下面的PL/SQL调用禁用了ID为127、序列号为29的SQL 跟踪:
dbms_monitor.session_trace_disable(session_id
=> 127,serial_num => 29);
请注意,这两个参数都有默认值。如果不指定,会禁用与执行这个PL/SQL调用对应的会话的SQL跟踪。
在RAC(Real
Application Cluster,真实应用程序集)环境中,session_trace_enable
和
session_trace_diable 需要在存在会话的对应数据库实例上执行。
●客户端级别
为客户端启用和禁用SQL跟踪, dbms_monitor包分别提供了client_id_trace_enable和 client_id_trace_disable过程。这些过程仅会在已设置会话属性的客户端标识符的情况下使用。
以下PL/SQL调用为所有具有指定客户端标识符的会话启用了级别12的SQL跟踪:
dbms_monitor.client_id_trace_enable(client_id
=>'helicon.antognini.ch',
waits
=> TRUE,
binds
=> TRUE,
plan_stat
=>'first_execution');
参数client_id没有默认值,并且区分大小写。
由于这个设置会保存在数据字典里,所以实例重启后也会存在,同时,在一个RAC的环境下,它对所有数据库实例生效。
在dba_enabled_traces和12.1多租户环境下的cdb_enabled_traces视图里,会通过client_id_trace_enable 过程,显示启用SQL跟踪的用户标识符以及使用的参数。例如,使用以上的PL/SQL调用启用SQL跟踪后,可以查到如下信息:
SELECT primary_id AS client_id, waits,
binds, plan_stats
FROM dba_enabled_traces
WHERE trace_type='CLIENT_ID';
以下PL/SQL调用针对所有指定客户端标识符的会话禁用SQL跟踪:
dbms_monitor.client_id_trace_disable(client_id
=>'helicon.antognini.ch')
过程client_id_trace_disable移除过程client_id_trace_enable相应在数据字典里增加的信息。参数client_id没有默认值。