如何跟踪某个session的SQL(转)

第一种方法:


获取当前用户所连接的所有session的sid:select sid from v$session where audsid=userenv('sessionid');


获取当前用户当前终端所连接的session的sid:select * from v$session where sid in(select sid from v$mystat);


首先你要确定跟踪哪个session,比如select sql_address from v$session where sid=505;


然后,select * from v$sqltext where address=<sql_address> order by piece;就可以找出session正在执行的sql了


另,也可以通过查v$open_cursor来完成。


第二种方法:


捕捉运行很久的SQL


SELECT username, SID, opname,
ROUND (sofar * 100 / totalwork, 0) || '%' AS progress, time_remaining,
sql_text
FROM v$session_longops, v$sql
WHERE time_remaining <> 0
AND sql_address = address
AND sql_hash_value = hash_value





如果跟踪自己的会话或者是别人的会话
[A]跟踪自己的会话很简单
Alter session set sql_trace true|false
如果跟踪别人的会话,需要调用一个包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
or
exec dbms_system.set_sql_trace_in_session(sid,serial#,8,’’),这里的8是跟踪级别
跟踪的信息在user_dump_dest 目录下可以找到
可以通过Tkprof来解析跟踪文件,如
Tkprof 原文件 目标文件 sys=n




怎么设置整个数据库系统跟踪
[A]其实文档上的alter system set sql_trace=true是不成功的
但是可以通过设置事件来完成这个工作,作用相等
alter system set events
‘10046 trace name context forever,level 1’;
如果关闭跟踪,可以用如下语句
alter system set events
‘10046 trace name context off’;
其中的level 1与上面的8都是跟踪级别
level 1:跟踪SQL语句,等于sql_trace=true
level 4:包括变量的详细信息 sql_text
level 8:包括等待事件
level 12:包括绑定变量与等待事件

你可能感兴趣的:(如何跟踪某个session的SQL(转))