●组件级别
包dbms_monitor分别提供了过程serv_mod_act_trace_enable和serv_mod_act_trace_disable来利用服务名、模块名和动作名为组件启用和禁用SQL跟踪。要充分使用这些过程,你需要设置会话属性、模块名和动作名。
以下PL/SQL调用为所有使用指定参数的会话启用SQL跟踪:
dbms_monitor.serv_mod_act_trace_enable(service_name=>'DBM11203.antognini.ch',
module_name =>'mymodule',
action_name =>'myaction',
waits =>TRUE,
binds =>TRUE,
instance_name=>NULL,
plan_stat=>'all_executions');
这里唯一一个没有默认值的参数是第一个service_name。参数module_name和action_name默认值分别为any_module和any_action。同时,NULL也是一个有效的值。如果指定了参数action_name的值,那么也必须指定参数module_name的值。如果不设置,则会引发ORA-13859错误。在RAC环境下,参数instance_name用来限定具体跟踪哪个数据库实例。默认情况下,SQL跟踪对所有数据库实例生效。请注意,参数service_name、module_name、action_name和instance_name区分大小写。
由于设置保存在数据字典中,数据库实例重启不会影响使用。
与客户端级别的SQL跟踪相同,在dba_enabled_traces和12.1多租户环境下的cdb_enabled_traces视图里,通过过程serv_mod_act_trace_enable,会显示启用了SQL跟踪的用户标识符组件以及使用的参数。使用以上PL/SQL调用启用SQL跟踪后,你可以查询到以下信息:
SELECT primary_id AS service_name,
qualifier_id1 AS module_name,
qualifier_id2 AS action_name, waits, binds, plan_stats
FROM dba_enabled_traces
WHERE trace_type IN
('SERVICE','SERVICE_MODULE','SERVICE_MODULE_ACTION');
注意,根据启用SQL跟踪指定的参数定义(即服务名、模块名和动作名),会将列trace_type设置成SERVICE、SERVICE_MODULE或者SERVICE_MODLE_ACTION。
以下PL/SQL调用为所有使用指定参数的会话禁用SQL跟踪:
dbms_monitor.serv_mod_act_trace_disable(service_name_=>'DBM11203.antognini.ch',
module_name=>'mymodule',
action_name=>'myaction',
instance_name=>NULL);
过程serv_mod_act_trace_disable会移除过程serv_mod_act_trace_enable添加到数据字典里的信息。所有参数都与过程serv_mod_act_trace_enable具有一样的默认值并且作用一致。
①服务名对于数据库来说是一个逻辑名。它是通过初始化参数service_names或包dbms_service进行配置的。 一个数据库可以有多个服务名。
●数据库级别
包dbms_monitor为所有连接到数据库的会话启用和禁用SQL跟踪(那些后台进程创建的除外),分别提供过程database_trace_enable和database_trace_disable。
以下PL/SQL调用为单个数据库实例启用级别12的SQL跟踪:
dbms_monitor.database_trace_enable(waits
=> TRUE,
binds => TRUE,
instance_name =>'DBM11203',
plan_stat ='first_execution');
所有参数都有默认值。在RAC环境下,使用参数instance_name来限制要跟踪的数据库实例。指定_的值可以从视图gv$instance的列instance_name获得。如果将参数instance_name设置为NULL(同时也是默认值),SQL跟踪会在所有数据库实例启用。请注意,参数instance_name区分大小写。
由于设置保存在数据字典中,数据库实例重启不会影响使用。
与客户端级别和组件级别的SQL跟踪相同,在dba_enabled_traces和12.1多租户环境下的cdb_enabled_traces视图里,会通过过程database_trace_enable显示启用SQL跟踪的用户标识符以及使用的参数。例如,使用以上PL/SQL调用启用SQL跟踪后,可以查询到以下信息:
SELECT instance_name, waits,
binds,plan_stats
FROM dba_enabled_traces
WHERE trace_type ='DATABASE';
以下PL/SQL调用会禁用数据库级别的SQL跟踪,同时会移除过程database_trace_enable相应加入到数据字典里的信息:
dbms_monitor.database_trace_disable(instance_name=>'DBM11203');
请注意,这不会禁用其他级别(包括会话级别、客户端级别或组件级别)的SQL跟踪。如果将参数instance_name设置为NULL(同时也是默认值),则会禁用所有数据库实例的SQL跟踪功能。