plsql会话inactive状态 程序还在执行吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了plsql会话inactive状态 程序还在执行吗相关的知识,希望对你有一定的参考价值。

参考技术A 如果在Inactive之前,你已经提交了运行程序,那么程序会继续执行
因为程序是运行在服务器端,客户端是否active不影响
参考技术B 所谓会话,其实就是一次连接,假设你用plsql连接数据库,只要你连上了(不管有没有操作),他都是一个会话。其他的也是一样,比如说在数据库执行的计划任务,这个也是一次会话,只不过这个会话是oracle自己发起的,而不是人为发起的

排查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;  


以上是关于plsql会话inactive状态 程序还在执行吗的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE定期清理INACTIVE会话

Oracle inactive session的清理

oracle许多inactive会话久久不释放,我该怎么办

如何迅速杀掉数据库里inactive的会话

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

iOS开发之程序各种状态监听