一、作用
sql执行过程中所有动作和等待的追踪。
二、等级
level:12 包含常用的分析信息:基本信息+绑定变量+等待事件;
level:1 基本信息;
level:4 基本信息+绑定变量
level:8 基本信息+绑定变量+等待事件
level:16 、32、64不常用。
三、普通使用方法
alter session set tracefile_identifier='10046';
alter session set max_dump_file_size=UNLIMITED;
alter session set timed_statistics=true;
--开启
alter session set events '10046 trace name context forever,level 12';
--执行sql
select * from zxb.text;
--关闭
alter session set events '10046 trace name context off';
select value from v$diag_info where name like 'Default Trace File%';
可以使用tkprof 解析格式化(整形)
四、根据process ID 取10046
1、取得process id
select p.pid,p.spid,s.sid from v$process p,v$session s where
s.paddr=p.addr
and s.sid=&session_id;
2、oradebug
conn / as sysdba
oradebug setospid
oradebug unlimit
oradebug event 10046 trace name context forever,level 12;
--一段时间后
oradebug event 10046 trace name context off;
这种模式取得的trc文件,建议读源码,不要用tkprof
五、特定处理的10046 trace
1、data pump 的10046
11G:
alter system set events 'sql_trace {process:pname= dw | pname=dm} level =12';
alter system set events 'sql_trace {process:pname= dw | pname=dm} off';
12C:
alter system set events 'sql_trace {process:pname = dw | pname=dm} level =12';
alter system set events 'sql_trace {process:pname=dw | pname=dm} off';
六、imp、exp,(同样也适合其他操作的追踪)
1、exp zxb/oracle
2、找到系统进程号,即:spid
3、conn /as sysdba
oradebug setospid 27778
oradebug event 10046 trace name context forever,level 12;
4、用之前的进程开始导出
5、关闭
oradebug event 10046 trace name context off;
七、触发器的方式(同样也适合其他操作的追踪)
conn / as sysdba
create or replace trigger sys.set_trace
after logon on database
when (sys_context('userenv','module') like 'sqlldr')
begin
execute immediate 'alter session set tracefile_identifier='||'SQLLDR';
execute immediate 'alter session set max_dump_file_size=unlimited';
execute immediate 'alter session set events "10046 trace name context forever,level 12"';
execute immediate 'alter session set events "10053 trace name context forever,level 1"';
end set_trace;
/
---sys_context('userenv','module')的获取,在v$session 中的module字段。
八、dblink的获取方式
带有dblink的语句,oracle会自动将其划分成两部分的sql,一部分在本地执行的sql,一部分在远端的sql。
取10046trace 的时候也要两端去取。
方法:
1、建立空dblink
select sysdate from dual@dblinkname;
2、确认dblink的本端的process id
select p.pid,p.spid,s.sid from v$process p,v$session s where
s.paddr=p.addr
and s.sid=&session_id;
process_id=23780
3、确认dblink远端数据库的process_id(在远端数据库执行)
select p.pid,p.spid,s.sid from v$process p,v$session s where
s.paddr=p.addr
and s.process='23780';
4、根据步骤3找到的process_id,进行oradebug方式追踪
conn / as sysdba
oradebug setospid
oradebug unlimit
oradebug event 10046 trace name context forever,level 12;
--一段时间后
oradebug event 10046 trace name context off;
5、在dblink本地执行语句
6、结束10046 trace
八、event++方式获取
sql_id的 10046 trace,只要该sql执行,就会打出trace
设定:
alter system set events 'sql_trace[sql:sql_id] level 12; --内存有效
alter system set events 'sql_trace[sql:sql_id] level 12 scope=spfile;
解除:
alter system set events 'sql_trace off';
alter system reset event scope=spfile;
九、10046 trace 解析
1、tkprof
2、直接读原文
tim时间,两行相减就是该行的执行时间