10046事件不但可以跟踪用户会话(trace文件位于USER_DUMP_DEST),也可以跟踪background进程(trace文件位于BACKGROUND_DUMP_DEST)。
trace文件的大小决定于4个因素:
跟踪级别,跟踪时长,会话的活动级别和MAX_DUMP_FILE_SIZE参数。
二、启用跟踪事件10046
0.准备工作
1)Init.ORA参数
timed_statistics 设置为true(也可以在session上设置),否则不会有CPU时间信息
user_dump_dest 指定trace文件生成的目录
max_dump_file_size trace文件的最大尺寸(单位为操作系统块),UMLIMITED表示没有限制,Oracle8以后可以在后面加上K或M来表示文件大小
optimizer_mode 定义缺省的查询优化器。虽然可以用alter session来设置,但在格式化trace文件里optimizer_mode会回复到原来的设置(一个新的session来分析SQL的执行计划),这样会产生不准确的执行计划,所以建议不要通过session来修改这个参数。
注:在运行tkprof时不要加explain参数,就不存在这个问题,执行计划是Oracle在运行时所用的计划
2) 确定是以"dedicated"方式连接到数据库
通过tnsping service_name查看
1.在全局设置
在初始化参数init.ora中加入:
EVENT = "10046 trace name context forever, level 8"
或
SQL_TRACE = TRUE
或
SQL> exec dbms_monitor.database_trace_enable('waits=>true,binds=>false,instance_name=>'wending');
全局设置会对系统性能造成明显的影响,建议不要使用。
2.跟踪当前session
SQL> ALTER SESSION SET sql_trace=TRUE;
SQL> ALTER SESSION SET sql_trace=FALSE;
或
SQL> alter session set events '10046 trace name context forever, level 8';
SQL> alter session set events '10046 trace name context off';
或
SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => TRUE);
SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => FALSE);
或
SQL> @ /rdbms/admin/dbmssupp.sql --DBMS_SUPPORT包需要单独安装,用sys用户安装
SQL> EXEC DBMS_SUPPORT.start_trace(waits=>TRUE, binds=>FALSE);
SQL> EXEC DBMS_SUPPORT.stop_trace;
在Oracle10g里推荐使用DBMS_MONITOR:
SQL> EXEC DBMS_MONITOR.session_trace_enable;
SQL> EXEC DBMS_MONITOR.session_trace_enable(waits=>TRUE, binds=>FALSE);
SQL> EXEC DBMS_MONITOR.session_trace_disable;
3.对其他用户session跟踪
首先从v$session中获得sid和serial#, 然后:
SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>TRUE);
SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>FALSE);
或
SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>8, nm=>' ');
SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>0, nm=>' ');
或
SQL> @ /rdbms/admin/dbmssupp.sql --DBMS_SUPPORT包需要单独安装,用sys用户安装
SQL> EXEC DBMS_SUPPORT.start_trace(sid=>123, serial=>1234, waits=>TRUE, binds=>FALSE);
SQL> EXEC DBMS_SUPPORT.stop_trace(sid=>123, serial=>1234);
也可以通过使用oradebug工具来设置10046事件, 首先通过V$PROCESS获得该session的spid, 然后:
SQL> oradebug setospid 12345;
SQL> oradebug unlimit;
SQL> oradebug event 10046 trace name context forever, level 8;
SQL> oradebug event 10046 trace name context off;
在Oracle10g里推荐使用DBMS_MONITOR:
SQL> EXEC DBMS_MONITOR.session_trace_enable(session_id=>1234, serial_num=>1234);
SQL> EXEC DBMS_MONITOR.session_trace_enable(session_id =>1234, serial_num=>1234, waits=>TRUE, binds=>FALSE);
SQL> EXEC DBMS_MONITOR.session_trace_disable(session_id=>1234, serial_num=>1234);
以下还能同时跟踪多个session, client_id通过 DBMS_SESSION 包设置在 v$session 里:
SQL> exec dbms_session.set_identifier('tim_hall');
SQL> select sid,serial#,username,client_identifier from v$session where client_identifier is not null;
SQL> EXEC DBMS_MONITOR.client_id_trace_enable(client_id=>'tim_hall');
SQL> EXEC DBMS_MONITOR.client_id_trace_enable(client_id=>'tim_hall', waits=>TRUE, binds=>FALSE);
SQL> EXEC DBMS_MONITOR.client_id_trace_disable(client_id=>'tim_hall');
以下还能同时跟踪多个session, service_name, module, action columns通过 DBMS_APPLICATION_INFO 包设置在 v$se