使用 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;
/
设置初始化参数 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;
/
相关文章推荐
- 使用sql_trace/10046事件进行数据库诊断
- 使用SQL_Trace/10046事件进行数据库诊断
- oracle优化6(使用sql_trace/10046事件进行数据库诊断)
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断(转载)
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断
- 使用SQL_TRACE进行数据库诊断