注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风之人生

人生如风,却无法如风般潇洒。

 
 
 

日志

 
 
关于我

一介草民,苟活于上海滩,以甲骨文为生,偶尔对一些国家大事有些兴趣,日常无事常以丝竹之声为乐。

网易考拉推荐

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

2010-02-26 09:42:45|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
     在Oracle数据库中,经常会产生一些inactive的会话,但是仍然连接到数据库,一般情况下,我们可以使用alter system kill session 'sid,serial#'; 来强制杀掉他,但是如果我们有大量的这种进程,要手动一个一个去杀掉,是比较麻烦的。
下面有个方法,可以迅速的杀掉这些进程。
   
SELECT 'ALTER SYSTEM DISCONNECT SESSION ''' || B.SID || ',' || B.SERIAL# ||
      '''IMMEDIATE;'
  FROM V$LOCKED_OBJECT A, V$SESSION B, DBA_OBJECTS C

 WHERE B.SID = A.SESSION_ID
     
   AND A.OBJECT_ID = C.OBJECT_ID
     
      --AND C.OWNER='OWNER1'
     
   AND B.STATUS = 'INACTIVE';

然后使用生成的脚本就可以了。

那么这个kill session和 disconnect session有什么区别呢,废话不说,上酸菜。
Oracle says,
Use the de>DISCONNECTde> de>SESSIONde> clause to disconnect the current session by destroying the dedicated server process (or virtual circuit if the connection was made by way of a Shared Server).
使用这个命令还有个选项POST_TRANSACTION允许你等待到事务结束后在断掉。
再来看这个The de>KILLde> de>SESSIONde> clause lets you mark a session as dead, roll back ongoing transactions, release all session locks, and partially recover session resources.

另外,感谢Michael Cunningham,他提供了一个脚本,是用来杀掉超过18小时的进程的。
##### Beginning of script
#!/bin/sh

if [ "$1" = "" ]
then
  echo
  echo "Usage: $0 <ORACLE_SID>"
  echo "Example: $0 database_name"
  echo
  exit
else
  export ORACLE_SID=$1
fi

#
# Make sure the ORACLE_SID is running on this server.
#
ora_test=`ps -ef | grep pmon_${ORACLE_SID} | grep -v "grep pmon_${ORACLE_SID}"`

if [ "$ora_test" = "" ]
then
  echo
  echo "The "${ORACLE_SID}" instance is not running on this server."
  echo
  exit
fi

export ORAENV_ASK=NO
. /usr/local/bin/oraenv

> kill_old_sessions_${ORACLE_SID}.sql

sqlplus -s /nolog << EOF
connect / as sysdba
set serveroutput on
set feedback off
spool kill_old_sessions_${ORACLE_SID}.sql
declare
        dt_6pm          date;
        n_6pm_seconds   integer;
        s_sql           varchar2(200);
begin
        -- If is is after 6pm then set dt_6pm = Now + 18 hours.
        if to_char( sysdate, 'HH24') >= 18 then
                dt_6pm := trunc( sysdate ) + numtodsinterval( 8, 'hour' );
        else
        -- If is is prior to 6pm then set dt_6pm = Yesterday at 6pm.
        -- Just trunc the current date and subtract 6 hours.
                dt_6pm := trunc( sysdate ) - numtodsinterval( 6, 'hour' );
        end if;
        n_6pm_seconds := to_number( sysdate - dt_6pm ) * 86400;
--
        for r in (
                        select  s.sid, s.serial# serial
                        from    v\$session s
                        where   s.user# <> 0
                        and     s.status = 'INACTIVE'
                        and     s.last_call_et > n_6pm_seconds )
        loop
                s_sql := 'alter system disconnect session ''' || r.sid || ',' || r.serial || ''' immediate;';
                dbms_output.put_line( s_sql );
        end loop;
end;
/
spool off
@kill_old_sessions_${ORACLE_SID}.sql
exit;
EOF
##### End of script

  评论这张
 
阅读(584)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017