SQL_TRACE及10046事件

一、SQL_TRACE

在使用 SQL_TRACE 之前,几个注意事项需要简单说明一下:

1. 初始化参数 TIMED_STATISTICS

参数 TIMED_STATISTICS 最好设置为 True,否则一些重要信息不会被收集。

2. 设置 MAX_DUMP_FILE_SIZE

该参数设置跟踪文件的大小限制,可以以操作系统块为单位设置;也可以以 K|M 为
单位设置;如果跟踪的信息较多,可以干脆设置为 UNLIMITED

在 Session 级可以设置如下:
SQL> alter session set MAX_DUMP_FILE_SIZE=unlimited;

注意:你需要足够的空间保存 trace 文件,跟踪过程产生的 Trace 文件可能远
远大于你的想象。
SQL_TRACE 可以作为初始化参数在全局启用,也可以通过命令行方式在具体 session 启
用。

1. 在全局启用 SQL_TRACE

在参数文件(pfile/spfile)中指定:
sql_trace = true
在全局启用 SQL_TRACE 会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,
这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用。

2. 在当前 session 级设置

在 session 级启用和停止 sql_trace 方式如下:
SQL> alter session set sql_trace=true;
结束跟踪:
SQL> alter session set sql_trace=false;

3. 跟踪其他用户进程

可以通过 Oracle提供的系统包 DBMS_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 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)

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

如果要对其他用户的参数进行设置,我们可能需要用到 DBMS_SYSTEM 包中的另外一个过程:

比如设置 MAX_DUMP_FILE_SIZE 等参数,可以参考如下:
SQL> select sid,serial#,username from v$session where username is not null;
 
 SID       SERIAL# USERNAME
 ---------- ---------- ------------------------------
 18 1605 EYGLE

SQL> begin
 2 sys.dbms_system.set_bool_param_in_session(18, 1605, 'timed_statistics', true);
 3 sys.dbms_system.set_int_param_in_session(18, 1605, 'max_dump_file_size', 2147483647);
 4 sys.dbms_system.set_sql_trace_in_session(18, 1605, true);
 5 end;
 6 /
 
二、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
类似 sql_trace, 10046 事件可以在全局设置,也可以在 session 级设置。

1. 在全局设置

在参数文件中增加:
event="10046 trace name context forever,level 12"
此设置对所有用户的所有进程生效、包括后台进程.

2. 对当前 session 设置

通过 alter session 的方式修改,需要 alter session 的系统权限:
SQL> alter session set events '10046 trace name context forever, level 8';
Session altered.
SQL> alter session set events '10046 trace name context off';
Session altered.

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 来自 v$session 视图, 查询获得需要跟踪的 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');

三、获取跟踪文件

生成的跟踪文件位于 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
 /
 
 TRACE_FILE_NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD/udump/prod_ora_2408.trc

读取当前 session 设置的参数

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

SQL> set feedback off
SQL> set serveroutput on
SQL> declare
 event_level number;
 begin
 for event_number in 10000..10999 loop
 sys.dbms_system.read_ev(event_number, event_level);
 if (event_level > 0) then
 sys.dbms_output.put_line(
 'Event ' ||
 to_char(event_number) ||
 ' is set at level ' ||
 to_char(event_level)
 );
 end if;
end loop;
end;
/

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

转载于:http://blog.itpub.net/27064835/viewspace-1623824/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值