一、 设置事件trace
0. 指定trace文件标识符(方便找)
alter session set tracefile_identifier=HEHUYI;
1. 启用事件trace
alter system set events '28 trace name errorstack level 3';
或者
ALTER SYSTEM SET events '28 trace name errorstack level 3;name hanganalyze_global level 3;name systemstate_global level 258';
2. 运行问题sql
3. 禁用事件trace
alter system set events '28 trace name ERRORSTACK off';
或者
ALTER SYSTEM SET events '28 trace name errorstack off;name hanganalyze_global off;name systemstate_global off';
4. 检查已设置事件
oradebug setmypid
oradebug eventdump system
oradebug eventdump session
5. 几个例子
- 按报错号设置事件trace
-- 打开trace
SQL> alter system set events '609 trace name errorstack level 3';
System altered.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump system
28 trace name errorstack level 3
SQL> oradebug eventdump session
28 trace name errorstack level 3
--关闭trace
SQL> alter system set events '609 trace name ERRORSTACK off';
System altered.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump system
Statement processed.
SQL> oradebug eventdump session
Statement processed.
- 设置m00进程trace
-- They are for Mmon trace purpose, once it is enabled, m00 trace files would include more detailed information, just like 10046 trace.
SQL> oradebug unit_test kebm_dmp_slv_attrs kewrmafsa_
SQL> oradebug unit_test kebm_dmp_slv_attrs kewfmadsa_
SQL> oradebug unit_test kebm_dmp_slv_attrs kewrmrfsa_
-- Enable traces for Auto flush
begin
dbms_monitor.serv_mod_act_trace_enable(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',
action_name=>'Auto-Flush Slave Action');
dbms_monitor.serv_mod_act_trace_enable(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',
action_name=>'Remote-Flush Slave Action');
end;
/
-- This should dump some more information when the flushing occurs. Please wait for 1 hour and upload latest mmon trace file to SR.
--Please wait until high CPU usage issue occurs again. Once CPU issue is finished. Please disable trace.
--To disable traces for Auto flush
begin
dbms_monitor.serv_mod_act_trace_disable(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',
action_name=>'Auto-Flush Slave Action');
dbms_monitor.serv_mod_act_trace_disable(service_name=>'SYS$BACKGROUND',
module_name=>'MMON_SLAVE',
action_name=>'Remote-Flush Slave Action');
end;
/
- 设置os进程trace
SQL> connect / as sysdba
SQL> oradebug setospid 30780 -- replace it with exact high CPU m00 OS process ID.
SQL> oradebug unlimit
SQL> oradebug dump errorstack 3
---wait for 30 seconds.
SQL> oradebug dump errorstack 3
---wait for 30 seconds.
SQL> oradebug dump errorstack 3
SQL> oradebug tracefile_name
-- This is the generated trace file name
二、 设置SQL TRACE
会话级别
alter session set sql_trace=true | false;
系统级别(一般不用)
alter system set sql_trace=true | false;
指定trace文件标识符(方便找)
alter session set tracefile_identifier=HEHUYI;
也可执行存储过程获取SQL_TRACE信息,生成的文件默认在udump目录下
select sid,serial# from v$session where sid=xxx; --获取sid,serial#信息
exec dbms_system.set_sql_trace_in_session(sid,serial#,true); --启动SQL_TRACE
exec dbms_system.set_sql_trace_in_session(sid,serial#,false); --停止SQL_TRACE
主要参数
explain=username/password --trace文件中生成SQL执行计划
wait=yes|no --为所有sql提供一份等待信息小结
sort=(sort keys) 按排序值的降序展示sql,常用(prsela,exeela,fchela)按时间消耗排序
aggregate=yes|no --yes将所有相同SQL在文件中做合并,no则分别列出(已不可用)
输出文件解析
通常由三行组成,它显示该查询各阶段的重要的执行统计数据。
1.解析(Parse):此阶段是Oracle的优化器为SQL语句生成执行计划的阶段。
2.执行(Execute):此阶段是服务器进程按照执行计划执行语句的阶段。
3.抓取(Fetch):此阶段是服务器进程从表中抓取结果的阶段。只有 Select 语句才需要此阶段,Update、Insert、Delete等这些DML语句并不需要抓取行。
通常包括八列,含义如下:
Call:说明了语句执行的每个阶段。
Count:此阶段的执行次数。
CPU:完成此阶段工作所耗的 CPU时间,单位是毫秒。
Elapsed:完成此阶段工作所耗费的 CPU时间再加上等待的时间,单位也是毫秒。
Disk:完成此阶段工作所用的物理读次数。
Query:完成此阶段工作所用的一致读次数。
Current:完成此阶段工作所用的当前缓存读次数。Query 和 Current加起来就是逻辑读。
Rows:完成此阶段工作所操作的行数。
接下来的几行:
“Misses in library cache during parse”说明硬解析的次数,1为硬解析0为软解析。
“Optimizer mode”是优化器模式
tkprof工具用法
tkprof trace文件名 输出文件名 [explain= ] [wait=yes|no] [sort=(sort keys)] [aggregate=yes|no]
eg:
tkprof mysid_ora31429.trc tkprof_out1.txt explain=username/password sort='(prsela,exeela,fchela)'
tkprof D:\oracle\product\10.2.0\admin\orcl\udump\orcl_ora_2008_hehuyi_dump.trc D:\TRACE.out SYS=NO EXPLAIN=hr/hehuyi
格式化后输出如下
三、 trace 10046事件
设置这个事件可以得到Oracle内部执行系统解析、调用、等待、绑定变量等详细的trace信息,帮助我们解析SQL、PL/SQL语句的运行状态,这些状态包括:Parse/Fetch/Execute三个阶段中遇到的等待事件、消耗的物理和逻辑读、CPU时间、执行计划等。还能帮我们分析一些DDL维护命令的内部工作原理,RMAN、Data Pump Expdp/impdp等工具缓慢问题。对于SQL性能优化、分析系统的性能有着非常重要的作用。
- level 1 等同于SQL_TRACE
- level 4 等同于level 1基础上增加收集绑定变量信息
- level 8 等同于level 1基础上增加等待事件信息
- level 12 等同于level 4 + level 8
使用方法
alter session set tracefile_identifier=HEHUYI;
alter session set events '10046 trace name context forever,level 12';
执行待trace的sql语句
alter session set events '10046 trace name context off';
也可执行存储过程获取SQL_TRACE信息
select sid,serial# from v$session where sid=xxx; --获取sid,serial#信息
exec dbms_monitor.session_trace_enable(sid,serial#,waits=>true,binds=>true); --启动TRACE
exec dbms_monitor.session_trace_disable(sid,serial#); --停止TRACE
10046事件产生的trace文件也在udump路径下,可以用tkprof工具处理
- 设置os进程10046 trace
SQL> connect / as sysdba
SQL>oradebug setospid 30780 -- replace it with exact high CPU m00 OS process ID.
SQL>oradebug unlimit
SQL>oradebug event 10046 trace name context forever, level 12
-- Wait until high cpu issue is finished.
SQL>oradebug event 10046 trace name context off;
SQL> oradebug tracefile_name
-- This is the generated trace file name
四、 trace 10053事件
用来诊断优化器如何估算成本和选择执行计划,为什么会得到这样的执行计划信息
使用方法
alter session set events '10053 trace name context forever,level 12';
执行待trace的sql语句
alter session set events '10053 trace name context off';
10053事件产生的trace文件也在udump路径下,但不能用tkprof工具处理
参考
http://www.eygle.com/case/Use.sql_trace.to.Diagnose.database.htm