您的位置:首页 > 数据库

使用 SQL_TRACE/10046 事件进行数据库诊断

2017-08-28 14:29 567 查看
参考盖国强《深入解析oracle》

设置初始化参数 SQL_TRACE 为 true 会对整个实例产生严重的性能影响,所以在产品环境中如非必要,确保不要设置这个参数。如果只是对特定的 session 启用跟踪,可以使用ALTER SESSION 或 DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION 来设置
在使用 SQL_TRACE 之前,几个注意事项需要简单说明一下:
1. 初始化参数 TIMED_STATISTICS
参数 TIMED_STATISTICS 最好设置为 True,否则一些重要信息不会被收集。
2. 设置 MAX_DUMP_FILE_SIZE
该参数设置跟踪文件的大小限制,可以以操作系统块为单位设置;也可以以 K|M 为单位设置;如果跟踪的信息较多,可以干脆设置为 UNLIMITED

在全局使用sql_trace
在参数文件中sql_trace=true

在当前会话使用sql_trace
SQL> alter session set sql_trace=true;

Session altered.

SQL> select * from test.worker;

WNO WNAME
--------- --------------------
001 adam

SQL> alter session set sql_trace=false;

Session altered.

跟踪其他用户进程
SQL> select sid,serial#,username from v$session where username is not null;

SID SERIAL# USERNAME
---------- ---------- ------------------------------
1631 47 SYS
1643 14 SYS

SQL> exec dbms_system.set_sql_trace_in_session(1643,14,true);

PL/SQL procedure successfully completed.

...sql操作...

SQL> exec dbms_system.set_sql_trace_in_session(1643,14,false);

PL/SQL procedure successfully completed.
如果要对其他用户的参数进行设置,我们可能需要用到 DBMS_SYSTEM 包中的另外一个过程
SQL> begin
2 sys.dbms_system.set_bool_param_in_session(1643,14, 'timed_statistics', true);
3 sys.dbms_system.set_int_param_in_session(1643,14, 'max_dump_file_size', 2147483647);
4 sys.dbms_system.set_sql_trace_in_session(1643,14, true);
5 end;
6 /

PL/SQL procedure successfully completed.

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

在全局设置
在参数文件中设置
event="10046 trace name context forever,level 12"

对当前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.

对其它用户session设置
SQL> exec dbms_system.set_ev(1643,14,10046,8,'sys');
PL/SQL procedure successfully completed.
SQL> exec dbms_system.set_ev(1643,14,10046,0,'sys');
PL/SQL procedure successfully completed.

获取跟踪文件

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

TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/admin/csdb/udump/csdb_ora_9198.trc

读取当前session设置的参数
set feedback off
set serveroutput on
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;
/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: