ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sql_trace/ 10046 整理

sql_trace/ 10046 整理

原创 Linux操作系统 作者:zecaro 时间:2011-03-13 15:24:02 0 删除 编辑

 sql_trace

sql_trace 在10G中是动态参数,之前的版本是静态参数

1.
 在全局启用 在参数文件(pfile/spfile)中指定:
sql_trace =true

在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用.

2.建议在session 级使用
在当前session级设置

alter session set sql_trace=TRUE;
alter session set sql_trace=false;

alter session set timed_statistics =TRUE

3. 跟踪其他用户进程
在很多时候我们需要跟踪其他用户的进程,而不是当前用户,这可以通过Oracle提供的系统包D
BMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
来完成

SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:

SQL> desc dbms_system
...
PROCEDURE SET_SQL_TRACE_IN_SESSION
Argument Name                     Type                    In/Out Default?
------------------------------           -----------------------   ------ --------
SID                               NUMBER                  IN
SERIAL#                          NUMBER                  IN
SQL_TRACE                        BOOLEAN                 IN
...


通过v$session我们可以获得sid、serial#等信息:

获得进程信息,选择需要跟踪的进程:

SQL> select sid,serial#,username from v$session
  2  where username is not null;

       SID    SERIAL#  USERNAME
---------- ---------- ------------------------------
         8       2041  SYS
         9        437  EYGLE

设置跟着:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,true)

PL/SQL procedure successfully completed.

....
可以等候片刻,跟踪session执行任务,捕获sql操作...
....

停止跟踪:
SQL> exec dbms_system.set_sql_trace_in_session(9,437,false)

PL/SQL procedure successfully completed.
     



10046

10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.


10046事件可以设置以下四个级别:
 
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 +绑定值(bind values)
 8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8

其中1相当于设置SQL_TRACE=TRUE之后的结果,4包括1的结果和绑定变量的实际值,8包括1的结果和等待事件的情况,12则同时包含1的结果,绑定变量的实际值和等待事件情况,所以可以说level 12是最为详细的trace了。


类似sql_trace,10046事件可以在全局设置,也可以在session级设置。

1. 在全局设置

全局设置 不建议开启,影响性能
alter system set sql_trace=TRUE;
alter system set events '10046 trace name context forever, level 12';


 在全局设置 在参数文件中增加:

event="10046 trace name context forever,level 12"
此设置对所有用户的所有进程生效、包括后台进程.


2. 对当前session设置

10046事件跟踪开启等 当前会话
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 forever, level 12';
alter session set events '10046 trace name context off';


3.对其他用户session设置
通过DBMS_SYSTEM.SET_EV系统包来实现:



SQL> desc dbms_system
...
PROCEDURE SET_EV
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
SI                             BINARY_INTEGER          IN
SE                             BINARY_INTEGER          IN
EV                             BINARY_INTEGER          IN
LE                             BINARY_INTEGER          IN
NM                             VARCHAR2                IN

...

                     
其中的参数SI、SE、 NM对应v$session视图sid,serial#,username
LE 表示TRACE级别,=0时表示跟踪结束
EV表示跟踪的事件类型

查询获得需要跟踪的session信息:
SQL> select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE


执行跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');

结束跟踪:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');



(c) 获取跟踪文件
方法1 以上生成的跟踪文件位于user_dump_dest目录中,位置及文件名可以通过以下SQL查询获得:


SQL> select
  d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
  from
    ( select p.spid
       from sys.v$mystat m,sys.v$session s,sys.v$process p
      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
    ( select t.instance from sys.v$thread  t,sys.v$parameter  v
        where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
   ( select value from sys.v$parameter where name = 'user_dump_dest') d



方法2
在日常工作中,我们经常需要对一些session进行跟踪,如何快速获取对应的trace文件。方法很多。今天向大家推荐一个Oracle undocumented
alter session command .让你"随心所欲"的控制你的trace file文件名称.

当然了,trace file 还是在参数user_dump_dest对应的目录下生成。同时,可以在一个session中生成多个trace file

缺省的文件名格式为:sid_ora_pid_traceid.trc 注:TRACEID就是你自己定义的标识符

ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SESSION SET TRACEFILE_IDENTIFIER='TOMS';

Use V$PROCESS.TRACEID to check the setting.

SQL> select username, traceid from v$process where username='STUDY'

USERNAME        TRACEID
--------------- ----------
STUDY           TOMS

示例如下:
SQL> alter session set sql_trace=true;
会话已更改。

SQL> alter session set tracefile_identifier='toms';
会话已更改。

SQL> select sysdate from dual;

SYSDATE
--------------
20060615202501

SQL> alter session set tracefile_identifier='toms_other';
会话已更改。

SQL> select user from dual;

USER
------------------------------
SYS
SQL> alter session set sql_trace=false;

会话已更改。

D:adminstudyudump>dir *toms*.trc
驱动器 D 中的卷是 应用盘
卷的序列号是 F0A8-DF97

D:adminstudyudump 的目录

2006-06-15 20:31 4,842 study_ora_3652_toms.trc
 

2006-06-15 20:31   702 study_ora_3652_toms_other.trc
2 个文件 5,544 字节
0 个目录 26,398,515,200 可用字节

D:adminstudyudump>
如果想取消上面的设置,只需要
alter session set tracefile_identifier='';
这样以后再在这个session中生成的trace file就是传统规则(sid_ora_pid.trc)的命名了.



(d) 读取当前session设置的参数
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取:


SQL> set feedback off
SQL> set serveroutput on
SQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1


或者
declare lev integer;
    begin
   dbms_system.read_ev(10046,lev);
   dbms_output.put_line(lev);
   end;
   /

 
TKPROF 用于格式化trace文件 ,详见 tkprof 整理

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23650854/viewspace-689296/,如需转载,请注明出处,否则将追究法律责任。

下一篇: tkprof 整理
请登录后发表评论 登录
全部评论

注册时间:2010-10-28

  • 博文量
    182
  • 访问量
    348656