Oracle Trace dbms_monitor

Posted Jane Chiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Trace dbms_monitor相关的知识,希望对你有一定的参考价值。

Oracle 10g 增加的dbms_monitor方法,异步跟踪,可指定跟踪其他会话,获取对应的trace文件;除了可以设置trace以外还可以开启关闭对指定会话的统计信息;

一句话说明:
dbms_monitor方法提供了4种开启/关闭trace文件的功能+ 2种开启/关闭会话统计信息功能 (其中,统计信息功能类似V$MYSTAT视图);

SQL> desc dbms_monitor;
Element                    	Type      
-------------------------- --------- 
ALL_MODULES                	CONSTANT  
ALL_ACTIONS                	CONSTANT  
CLIENT_ID_STAT_ENABLE      	PROCEDURE 
CLIENT_ID_STAT_DISABLE     	PROCEDURE 
SERV_MOD_ACT_STAT_ENABLE   	PROCEDURE 
SERV_MOD_ACT_STAT_DISABLE  	PROCEDURE 
CLIENT_ID_TRACE_ENABLE     	PROCEDURE 
CLIENT_ID_TRACE_DISABLE    	PROCEDURE 
SERV_MOD_ACT_TRACE_ENABLE  	PROCEDURE 
SERV_MOD_ACT_TRACE_DISABLE 	PROCEDURE 
SESSION_TRACE_ENABLE       	PROCEDURE 
SESSION_TRACE_DISABLE      	PROCEDURE 
DATABASE_TRACE_ENABLE      	PROCEDURE 
DATABASE_TRACE_DISABLE     	PROCEDURE

4种方法开启/关闭trace文件:

  1. SESSION_TRACE_ENABLE/SESSION_TRACE_DISABLE:
    通过指定会话的SID和SERIAL#开启/关闭trace,实现异步跟踪;

  2. DATABASE_TRACE_ENABLE/DATABASE_TRACE_DISABLE过程:
    设置数据库实例上所有会话的trace 开启/关闭,不建议这样做;

  3. CLIENT_ID_TRACE_ENABLE/CLIENT_ID_TRACE_DISABLE:
    通过客户端ID开启/关闭指定客户端的TRACE,如果会话客户端ID为空,可以通过程序设置:DBMS_SESSION.SET_IDENTIFIER('YYC_TEST');

  4. SERV_MOD_ACT_TRACE_ENABLE/SERV_MOD_ACT_TRACE_DISABLE:
    通过SERVICE_NAME, MODULE_NAME和ACTION_NAME开启/关闭trace;

2种方法开启/关闭会话的统计信息功能:

  1. SERV_MOD_ACT_STAT_ENABLE/SERV_MOD_ACT_STAT_DISABLE:
    和trace方法4一样,都是通过SERVICE_NAME, MODULE_NAME和ACTION_NAME开启/关闭对应会话的统计信息,对应统计视图:V$SERV_MOD_ACT_STATS

  2. CLIENT_ID_STAT_ENABLE/ CLIENT_ID_STAT_DISABLE:
    和trace方法3一样,通过通过客户端ID开启/关闭指定客户端的统计信息,对应统计视图: V$CLIENT_STATS;

Session级跟踪,基于会话ID和序列号

不使用form界面跟踪,使用dbms_monitor根据系统用户的session信息获取form界面操作对应的trace数据;

步骤一: 获取form界面所处的sid和serial#,可使用个性化方法获取信息(个性化活动页,通过消息文本输出数据);

=(select sid from V$mystat where rownum = 1)

=(select serial# from V$session where sid = 744)

因此,获取到界面会话信息:
Sid = 744, serial# = 18251;
回到界面,到要执行跟踪的步骤之前,本例中为点击“关闭”功能之前;

步骤二:根据获取的sid 、 serial# 开启跟踪:
语法:
dbms_monitor.session_trace_enable(sid,serial#,waits,binds);
其中,waits表示等待信息是否记录在trace文件中,binds表示是否记录绑定变量的信息;

SQL> exec dbms_monitor.session_trace_enable(744, 18251,TRUE,FALSE);
PL/SQL procedure successfully completed

步骤三:在界面执行相关操作后,关闭跟踪:

SQL> exec dbms_monitor.SESSION_TRACE_DISABLE(744, 18251);
PL/SQL procedure successfully completed

步骤四:根据sid获取trace文件路径:

SELECT p.tracefile
  FROM v$process p, v$session s
 WHERE p.addr = s.paddr
AND s.sid = 744;

步骤五: tkprof转换trace文件(根据CPU执行时间排序)

tkprof /pjebs/sit/db/tech_st/11.2.0/admin/PJSIT_fmssitdb1/diag/rdbms/pjsit/PJSIT/trace/PJSIT_ora_36962476.trc /pjebs/sit/temp/2/PJSIT_ora_36962476.txt sort= "execpu"

文件中部分内容如下:


方法小结
使用V$session视图获取sid和serial#,开启/关闭会话trace命令如下:

exec dbms_monitor.session_trace_enable(744, 18251,TRUE,FALSE);
exec dbms_monitor.SESSION_TRACE_DISABLE(744, 18251);

CLIENT_ID开启/关闭trace

在plsql中,新开一个会话,设置客户端标识为YYC_TEST,开启/关闭trace。
以client_id开启的trace,只要会话的客户端标识为YYC_TEST,会话内的操作均会记录在trace文件中。该方法可开启多个会话的trace记录;

步骤一:新开会话,设置客户端标识为YYC_TEST;
新开会话1,本例中sid = 17; 检查会话trace设置状态:

SELECT sid, client_identifier, sql_trace, sql_trace_waits, sql_trace_binds
  FROM v$session
 WHERE sid = 17;

因为客户段标识为空,可以选则指定一个标识,如:YYC_TEST;

SQL> EXEC DBMS_SESSION.SET_IDENTIFIER('YYC_TEST');
PL/SQL procedure successfully completed

步骤二:对客户端标识为YYC_TEST的会话开启trace
新开一个会话2,执行语句:

SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('YYC_TEST', TRUE, TRUE);
PL/SQL procedure successfully completed

在原本的会话中执行一段查询语句,此语句会被写入trace文件中:

SQL> SELECT spid FROM v$process WHERE addr IN (SELECT paddr FROM v$session WHERE sid = 17);
SPID
------------------------
32113584

如果此时去查看session状态,会发现SQL_TRACE状态依然是FALSE;

注意:虽然SQL_TRACE= DISABLED,但是事实上会话的TRACE已经被启用了,执行的查询SPID的语句将会出现在生成的TRACE文件中。
由于是通过CLIENT_ID方式设置的,因此无法从当前会话的状态中看到。

步骤三:关闭trace;

SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('YYC_TEST');

步骤四:获取trace文件并使用tkprof格式化;
使用sql查看对应的trace文件目录:

SELECT p.*
  FROM v$process p, v$session s
 WHERE p.addr = s.paddr
   AND s.sid = 17;

方法小结
使用V$session视图获取client_identifier(如果为空,可以使用dbms_session.set_identifier()方法设置),开启/关闭会话trace命令如下:

EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('YYC_TEST', TRUE, TRUE);
EXEC DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('YYC_TEST');

CLIENT_ID开启/关闭统计信息功能

Dbms_monitor除了可以设置trace以外,还可以开启关闭对指定会话的统计功能;统计信息的功能和类似V$MYSTAT视图,可以查看会话的信息;

V$MYSTAT 为例,V$MYSTAT提供的只是会话级别的统计,该视图只可以查看当前会话的信息,而CLIENT_ID_STAT_ENABLE提供的是指定客户端标识符的统计功能,任何会话只要设置了指定统计的标识符,都会被累计到统计值之中。而只要更改了CLIENT_IDENTIFIER,这个会话的统计信息就不会再被统计。

V$MYSTAT是当前用户session的各种统计信息,
sid是session的id,statistic#是统计量的编号(唯一确定统计量的名称),value是统计量的值,可与v$statname配合使用;

SELECT m.sid, m.statistic#, s.name, m.value, s.class, s.stat_id
  FROM v$mystat m, v$statname s
 WHERE m.statistic# = s.statistic#;

以CLIENT_ID_STAT为例:

步骤一:设置CLIENT_ID = ‘YYC_TEST’,开启统计信息功能:

查看此时会话的统计信息,因为会话并没有开启统计信息功能,因此视图V$CLIENT_STATS内容为空:

SQL> SELECT * FROM V$CLIENT_STATS;
CLIENT_IDENTIFIER          STAT_ID STAT_NAME       VALUE
-------------------------------------------------------------

设置会话的客户端标识为‘YYC_TEST’,此时视图V$CLIENT_STATS中内容为空:

在另外的会话启动CLIENT_ID为YYC_TEST客户端标识的统计功能,sql如下:

SQL> EXEC DBMS_MONITOR.CLIENT_ID_STAT_ENABLE('YYC_TEST');
PL/SQL procedure successfully completed

步骤二:执行查询语句,通过视图V$CLIENT_STATS查看会话统计信息;
回到开始的会话,此时执行一个查询sql后,检查统计信息:


可以发现视图V$CLIENT_STATS中出现了当前客户端会话的运行内容个,V$CLIENT_STATS的值会随着用户的操作不断的更新;

步骤三:关闭统计信息
可以通过CLIENT_ID_STAT_DISABLE过程关闭;

SQL> EXEC DBMS_MONITOR.CLIENT_ID_STAT_DISABLE('YYC_TEST');
PL/SQL procedure successfully completed

这时V$CLIENT_STAT视图中的统计信息消失;

SQL> SELECT * FROM V$CLIENT_STATS;
CLIENT_IDENTIFIER          STAT_ID STAT_NAME       VALUE
-------------------------------------------------------------

方法小结:
使用V$session视图获取client_identifier(如果为空,可以使用dbms_session.set_identifier()方法设置),开启/关闭会话统计信息功能:

EXEC DBMS_MONITOR.CLIENT_ID_STAT_ENABLE('YYC_TEST');
EXEC DBMS_MONITOR.CLIENT_ID_STAT_DISABLE('YYC_TEST');

使用V$CLIENT_STATS视图获取会话的统计信息:

SELECT * FROM V$CLIENT_STATS where CLIENT_IDENTIFIER = 'YYC_TEST';

##SERV_MOD_ACT方法开启/关闭统计信息

步骤一:获取SERV,MOD信息,开启统计信息功能

执行SERV_MOD_ACT_STAT_ENABLE过程,对使用PJDEV为服务名的PL/SQL Developer连接设置统计信息

SQL> EXEC DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE('PJDEV', 'PL/SQL Developer');
PL/SQL procedure successfully completed

步骤二:使用视图V$SERV_MOD_ACT_STATS查看统计信息:

步骤三:SERV_MOD_ACT_STAT_DISABLE过程关闭统计信息:

和CLIENT_ID方式一样,这种统计信息是对应所有通过指定服务名登陆,且MODULE_NAME与指定的MODULE一致的会话的。
DBMS_MONITOR包提供的两种设置统计信息的方法,都是针对具有相同类型的一组会话,这使得检查或诊断一类用户的行为时,更加的方便,更有针对性。

方法小结:
使用V$session视图获取service_name, module,开启/关闭会话统计信息功能:

EXEC DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE('PJDEV', 'PL/SQL Developer');
EXEC DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE('PJDEV', 'PL/SQL Developer');

使用V$SERV_MOD_ACT_STATS视图获取会话的统计信息:

SELECT * FROM V$SERV_MOD_ACT_STATS where SERVICE_NAME = 'PJDEV' AND MODULE = 'PL/SQL Developer';

以上是关于Oracle Trace dbms_monitor的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的跟踪文件(trace file)

DBMS_MONITOR程序开启10046事件

如何删除大量oracle中的小trace文件

如何分析oracle trace文件

Oracle SQL Trace 和 10046 事件

ORACLE中trace文件夹下面的文件可以删除么