首页 > 代码库 > sql跟踪及tkprof使用
sql跟踪及tkprof使用
简述
在oracle数据库中,awr是关于数据库系统整体的负载情况和运行情况的报告。而当系统负载都显示正常,而客户端执行某些动作响应很慢,或者某些终端连接的会话执行缓慢或异常时,就需要用到会话级别的跟踪了。
常见方法概述
Session级别跟踪的方法有许多,比如当前会话的跟踪,可以执行命令
Alter session set sql_trace=true;
Alter session set sql_trace=false;
或者使用10046事件
Alter session set events ‘10046 trace name context forever,level 12’;
Alter session set events ‘10046 trace name context off’
其中level 12是可选级别。
Level 1是指标准的sql跟踪,与设置sql_trace效果相同。
Level 4是指在标准的基础上增加绑定变量信息。
Level 8是指在标准的基础上增加等待事件信息。
Level 12是指在标准的基础上同时增加绑定变量信息和等待事件信息。
以上例子是在session级别进行跟踪,若环境中需要在整个实例级别进行跟踪,则直接将以上命令中的session更改为system即可实现。但系统级别的跟踪将消耗大量的系统资源,因此,若非性能诊断需要,不要开启在系统级别的sql_trace。
我们要用的方法
方法有很多,会用一种就行,下面我们说下我推荐的一种方法。
首先,可以设置trace文件标志,使我们的trace文件更容易找出来。
Alter session set tracefile_identifier=’wjf’;
之后打开计时
Alter system set timed_statistics=true;
然后查找到要跟踪会话的sid与serial#,
Select sid,serial#,osuser,machine from v$session;
找到sid与serial#后,就可以执行跟踪了,比如sid=22,serial#=22;
执行以下命令
Exec dbms_monitor.session_trace_enable(22,22,waits=>true,binds=>true);
Exec dbms_monitor.session_trace_disable(22,22);
其中waits=>true跟binds=>true想必也不用解释了。
追踪文件处理(tkprof)
追踪后的trc文件可以在DIAGNOSTIC_DEST目录下找到,但是直接追踪产生的trc文件可读性并不好,需要借助一个oracle提供的工具处理以下,这个工具就是tkprof。
例如我们此处生成trc文件名称为orcl_ora_1234_wjf.trc.
则我们需要在系统级别,即退出sqlplus,在shell或cmd下执行以下命令
Shell>tkprof d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_1234_wjf.trcd:/wjf_2222.txt
这样就能生成可读性较强的追踪文件进行分析了。Tkprof工具必须输入的两个参数也就是一个输入文件,一个输出文件而已。
但tkprof还有一些其他参数,很多时候需要利用其他参数来生成文件,从而更方便找出问题。
Tkprof工具的标准语法
tkprof filename1filename2 [waits=yes|no] [sort=option] [print=n]
[aggregate=yes|no] [insert=filename3] [sys=yes|no] [table=schema.table]
[explain=user/password] [record=filename4] [width=n]
Tkprof参数介绍
介绍几个自我感觉比较常用的参数
Waits=yes|no:是否包含等待事件信息。
Print=n:设置显示多少行sql。比如你设置了排序信息,可以只查看top 10的sql,就可以设置print=10了。
Sys=yes|no:设置是否包含sys用户所发布的sql。主要是为了启动或禁止显示用户为执行自己的sql所产生的递归sql,默认为yes。
Sort=option:设置生成sql根据指定选项进行排序。
prscnt number oftimes parse was called
prscpu cpu timeparsing
prsela elapsedtime parsing
prsdsk numberof disk reads during parse
prsqry numberof buffers for consistent read during parse
prscu numberof buffers for current read during parse
prsmis numberof misses in library cache during parse
execnt numberof execute was called
execpu cputime spent executing
exeela elapsedtime executing
exedsk numberof disk reads during execute
exeqry numberof buffers for consistent read during execute
execu numberof buffers for current read during execute
exerow numberof rows processed during execute
exemis numberof library cache misses during execute
fchcnt numberof times fetch was called
fchcpu cputime spent fetching
fchela elapsedtime fetching
fchdsk numberof disk reads during fetch
fchqry numberof buffers for consistent read during fetch
fchcu numberof buffers for current read during fetch
fchrow numberof rows fetched
userid useridof user that parsed the cursor
其他还有一些参数,具体可以查看联机文档中的performance tunning guide。
Tkprof举例
所以,一个比较正常的tkprof语句可能是这个样子的
tkprof d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_1234_wjf.trcd:/wjf_2222.txt waits=no sys=no sort=(prscpu,execpu,fchcpu) print=10;
就这样了,就像生成awr报告一样,生成文件永远是最简单的,能把生成的报告读的多透彻才是见功底的东西。在此,我仅仅把生成报告的过程做个记录,至于怎么读,慢慢再说。
sql跟踪及tkprof使用