获取其他会话的SID和SERIAL#
SYS@dbabd> select sid,SERIAL#,username from v$session where username is not null; SID SERIAL# USERNAME ---------- ---------- ------------------------------------------------------------------------------------------ 125 17 SYS 141 45 SCOTT实际环境当中可能出现同一个用户有多个会话存在,需要根据v$session视图当中的其他选项进行判断,这里假设只有一个SCOTT用户会话。
开启对SCOTT用户会话的跟踪
SYS@dbabd> begin 2 dbms_system.SET_SQL_TRACE_IN_SESSION(SID => 141, 3 SERIAL# => 45, 4 SQL_TRACE => true 5 ); 6 end; 7 / PL/SQL procedure successfully completed. 或 SYS@dbabd> exec dbms_system.SET_SQL_TRACE_IN_SESSION(141,45,true); PL/SQL procedure successfully completed.定位跟踪的trace文件
SYS@dbabd> select s.sql_trace, 2 s.sql_trace_waits, 3 s.sql_trace_binds, 4 traceid, 5 tracefile 6 from v$session s 7 join v$process p 8 on p.addr = s.paddr 9 where s.sid = 141; SQL_TRACE SQL_TRACE_WAITS SQL_TRACE_BINDS TRACEID TRACEFILE ---------- --------------- --------------- ---------- ------------------------------------------------------------ ENABLED FALSE FALSE SCOTT /data/app/oracle/diag/rdbms/dbabd/dbabd/trace/dbabd_ora_1014 _SCOTT.trc关闭对SCOTT用户会话的跟踪
SYS@dbabd> exec dbms_system.SET_SQL_TRACE_IN_SESSION(141,45,false); PL/SQL procedure successfully completed. DBMS_MONITOR包跟踪无论是跟踪当前会话或者其他会话都可以采用DBMS_MONITOR包当中的SESSION_TRACE_ENABLE存储过程。跟踪其他会话的前提还是需要获取到会话的SID和SERIAL#,关闭则使用包当中的SESSION_TRACE_DISABLE存储过程。
存储过程SESSION_TRACE_ENABLE参数需求如下,详细可参考官方文档::
PROCEDURE SESSION_TRACE_ENABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SESSION_ID BINARY_INTEGER IN DEFAULT -- 对应SID SERIAL_NUM BINARY_INTEGER IN DEFAULT -- 对应SERIAL# WAITS BOOLEAN IN DEFAULT -- 对应是否加入等待事件跟踪 BINDS BOOLEAN IN DEFAULT -- 对应是否加入绑定变量跟踪 PLAN_STAT VARCHAR2 IN DEFAULT -- 对应跟踪转储行数据频率,取值参考官方文档存储过程SESSION_TRACE_DISABLE参数需求如下,详细可参考官方文档::
PROCEDURE SESSION_TRACE_DISABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SESSION_ID BINARY_INTEGER IN DEFAULT SERIAL_NUM BINARY_INTEGER IN DEFAULT从以上两个存储过程所需参数来看,如果是跟踪当前会话的话可以省略SESSION_ID和SERIAL_NUM这两个参数,具体的开启和关闭语句可以参考其他会话跟踪当中的DBMS_SYSTEM包使用方法。
当前数据库跟踪使用DBMS_MONITOR包还可以用来开启整个数据库的跟踪,但是这会造成trace文件异常庞大,不便于定位具体问题,而且也会造成一定的性能损失,所以通常不建议开启。
采用SQL语句方式:
-- 开启 SYS@dbabd> alter system set sql_trace = true; -- 关闭 SYS@dbabd> alter system set sql_trace = false;采用DBMS_MONITOR包方式,主要使用DATABASE_TRACE_ENABLE和DATABASE_TRACE_DISABLE两个存储过程:
PROCEDURE DATABASE_TRACE_ENABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- WAITS BOOLEAN IN DEFAULT BINDS BOOLEAN IN DEFAULT INSTANCE_NAME VARCHAR2 IN DEFAULT PLAN_STAT VARCHAR2 IN DEFAULT PROCEDURE DATABASE_TRACE_DISABLE Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- INSTANCE_NAME VARCHAR2 IN DEFAULT -- 开启 SYS@dbabd> exec dbms_monitor.DATABASE_TRACE_ENABLE(true,true,'dbabd','all_executions'); -- 关闭 SYS@dbabd> exec dbms_monitor.DATABASE_TRACE_DISABLE('dbabd'); 采用登录触发器跟踪可以通过创建登录触发器来跟踪某个用户的SQL执行效率情况,登录触发器会在会话初始化的时候去执行,触发器可以根据指定条件是否对这次会话开启跟踪,以下登录触发器是以SCOTT用户为例,为SCOTT用户登录的所有会话设置合适的trace文件标识符并开启跟踪。
-- 创建触发器SCOTT_LOGIN_TRACE语句 create or replace trigger scott_login_trace after logon on database begin if user = 'SCOTT' then execute immediate 'alter session set tracefile_identifier = SCOTT'; dbms_session.session_trace_enable(waits => true, binds => true, plan_stat => 'all_executions'); end if; end; /