设置事件trace及sql trace

一、 设置事件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

发布了303 篇原创文章 · 获赞 36 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/100988835