前几天发帖,说我们数据库中有很多session保持几天的不释放,有可能是应用程序中的部分connect未关闭所致,应用那边不愿意彻底排查应用程序,所以希望从数据库这边入手,找出这些session所执行过的最后一条sql语句,以便在程序中定位未关闭connect。
考虑过使用sql_trace,logmnr,审计等方案,都觉得不太合适,今天仔细观察了一下v$session这个视图,发现有PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句,受到了启发,既然我们session的问题就是connect未关闭所致,那么这些遗留session所执行的上一条sql语句,也就是它的最后一条sql语句。
通过以下方法:
select distinct(sql_text)
from v$sql a,v$session b
where a.hash_value=b.prev_hash_value
and a.address=b.prev_sql_addr
and b.status='INACTIVE'
and to_char(b.logon_time)='02-11月-07';
可以找出滞留session所执行的最后一条语句,于是应用也可以很快定位到程序中未关闭connect的地方。
以上是我刚刚得出的结论,发出来一是让大家参考,二也是想做个求证,如果有前辈认为不对,请多多指教。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/310745/viewspace-6312/
,如需转载,请注明出处,否则将追究法律责任。