oracle优化6(使用sql_trace/10046事件进行数据库诊断)
对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下
使用SQL Trace
Alter session set sql_trace=true; //启用跟踪
生成的跟踪文件路径:@oracle_home\ diag\rdbms\orcl\orcl\trace(版本:11g)
Alter session set sql_trace=false; //禁用跟踪
使用sql_trace,常用初始化参数设置
Timed_statistics=true;
不设置的话,一些重要信息不会被收集到
Max_dump_file_size( alter session set Max_dump_file_size=unlimited; )
设置跟踪文件的大小
Tkprof按照格出输出
得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等)
Tkprof 跟踪文件.trc 输出文件.txt
跟踪其他用户进程
Dbms_system.set_sql_trace_in_session
说明:三个参数,sid/serial#/sql_trace
得到当前系统的会话:
Select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- -------------
134 34 USER_EB
192 344 USER_EB
199 6280 USER_EB
设置跟踪,用户角色要为sys:
Exec Dbms_system.set_sql_trace_in_session(134,34,true);
停止跟踪:
Exec Dbms_system.set_sql_trace_in_session(134,34,false);
10046事件说明
10046事件是oracle提供的内部事件,是对sql_trace的增强,可以设置以下4个级别:
Level 1:启用标准的sql_trace功能,等价于sql_trace
Level 4:等价于Level 1+绑定值
Level 8: 等价于Level 4+等待事件跟踪
Level 12: 等价于Level 1+level 4 + level 8
当前session设置
当前session设置
Alter session set events '10046 trace name context forever';
或者:
Alter session set events ‘10046 trace name context forever,level 8’;
禁用:
Alter session set events ‘10046 trace name context off;
对其他用户session设置
Dbms_system.set_ev
说明:5个参数 sid/serial#/ev/level/username
Select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- -------------
70 127 USER_EB
192 344 USER_EB
199 6280 USER_EB
执行跟踪:
Exec Dbms_system.set_ev(70,127,10046,8,'user_eb');
结束跟踪:
Exec Dbms_system.set_ev(70,127,10046,0,'user_eb');