排查oracle会话非活动状态的语句

Posted 老周21

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排查oracle会话非活动状态的语句相关的知识,希望对你有一定的参考价值。

下面语句全是干货哦,一个个拿去查查就知道了,连要怎么杀会话的命令都有,只要复制了,打开一个plsql  的命令行窗口,就可以全部执行杀掉了,或者linux服务器上使用sqlplus 这个交互方式也可以杀

sqlplus -silent / as sysdba  <<EOF

   ALTER SYSTEM KILL SESSION 1282,34211 ;

##依次粘贴会话就可以了

 

EOF  


--查询有多少不活动的死会话

SELECT alter system disconnect session ||sid||,||s.SERIAL#|| immediate;,s.inst_id, s.sid,s.USERNAME,s.CLIENT_INFO,s.SERIAL#,s.sql_id,s.SQL_CHILD_NUMBER,s.LAST_CALL_ET,

s.SQL_HASH_VALUE,t.SQL_TEXT,t.sql_fulltext, s.PROGRAM, s.MACHINE,S.STATUS

 FROM gv$session s, gv$sql t

where s.SQL_ADDRESS = t.address

  and s.sql_hash_value = t.HASH_VALUE

  and s.LAST_CALL_ET >0

  and s.inst_id=1

  and s.STATUS <>ACTIVE order by  s.LAST_CALL_ET desc

####################################################

###### 以下两个 sql 应对会话卡死操作


select * from (    

SELECT s.type,s.username 用户名称, s.status 状态,s.machine 机器名称,

       osuser 操作系统用户名称,spid UNIX进程号,

         kill -9 ||spid UNIX级断开连接,

         alter system kill session ||||s.sid||,||s.serial# || immediate; Oracle级断开连接,

         TO_CHAR (logon_time, dd/mm/yyyy hh24:mi:ss) 登陆时间,

          last_call_et 空闲时间秒,

          TO_CHAR (TRUNC (last_call_et / 3600, 0))|| || HRS ||

      TO_CHAR (TRUNC ((last_call_et - TRUNC(last_call_et / 3600, 0) * 3600) / 60, 0)  ) || MINS 空闲时间小时分钟,

          module 模块

         FROM gv$session s, gv$process p

         WHERE TYPE = USER

         AND p.addr = s.paddr

        AND status != KILLED and s.username<>SYS/*and s.username=JSPT*/ and s.status=ACTIVE

         -- AND SUBSTR (machine, 1, 19) NOT IN (机器名)

        AND last_call_et >60 --60 * 60 * 1-- 空闲时间超过1小时的连接

      -- and exists (select 1 from  gv$sql bb where bb.sql_id=s.sql_id and /*bb.SQL_TEXT like %wssq_tcs_lcb% or*/ bb.SQL_TEXT like %@pzhd% )

        ORDER BY last_call_et desc) where rownum<540

   

   


   

   

select t.last_call_et,t.sql_id ,a.SQL_TEXT,a.SQL_FULLTEXT,a.EXECUTIONS,alter system kill session ||||t.sid||,||t.serial# || immediate;,t.* from gv$session t,gv$sql a  

where t.STATUS=ACTIVE and t.SQL_ID=a.SQL_ID and t.SCHEMANAME<>SYS  

and t.LAST_CALL_ET>1000

--and a.SQL_TEXT like %WSSQ_TCS_LCB%;   


##这个看jinjin那边是卡哪个语句,last_call_et, 这个空闲时间 就是卡住的时间,越大越有问题

select t.last_call_et,t.sql_id ,a.SQL_TEXT,a.EXECUTIONS,t.* from gv$session@gt3 t,gv$sql@gt3 a  where t.STATUS=ACTIVE and t.SQL_ID=a.SQL_ID and t.SCHEMANAME<>SYS order by t.last_call_et desc;  


以上是关于排查oracle会话非活动状态的语句的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE定期清理INACTIVE会话

使用 BasicDataSource 关闭非活动会话

防止会话在非活动用户的 PHP 会话中过期

如何为用户终止所有活动和非活动的 oracle 会话

客户端异常关闭时的 Oracle 活动会话状态

终止会话