如何杀死连接到我的oracle数据库的所有会话?

时间:2008-09-10 21:16:11

标签: oracle session sqlplus kill database-administration

我需要快速(并且强行)终止连接到我的oracle数据库的所有外部会话,而无需管理员的监督。

我不想只是锁定数据库并让用户正常退出。

我如何编写此脚本?

10 个答案:

答案 0 :(得分:44)

这个答案很大程度上受到对话的影响:http://www.tek-tips.com/viewthread.cfm?qid=1395151&page=3

ALTER SYSTEM ENABLE RESTRICTED SESSION;

begin     
    for x in (  
            select Sid, Serial#, machine, program  
            from v$session  
            where  
                machine <> 'MyDatabaseServerName'  
        ) loop  
        execute immediate 'Alter System Kill Session '''|| x.Sid  
                     || ',' || x.Serial# || ''' IMMEDIATE';  
    end loop;  
end;

我跳过了杀死源自数据库服务器的会话,以避免杀死Oracle与自身的连接。

答案 1 :(得分:11)

作为SYS:

startup force;

野蛮但优雅。

答案 2 :(得分:7)

在杀死会话之前,如果可能的话

ALTER SYSTEM ENABLE RESTRICTED SESSION;

停止新会话的连接。

答案 3 :(得分:4)

我一直在使用这样的东西一段时间来杀死我在共享服务器上的会话。可以移除'where'的第一行来杀死所有非'sys'会话:

BEGIN
  FOR c IN (
      SELECT s.sid, s.serial#
      FROM v$session s
      WHERE (s.Osuser = 'MyUser' or s.MACHINE = 'MyNtDomain\MyMachineName')
      AND s.USERNAME <> 'SYS'
      AND s.STATUS <> 'KILLED'
  )
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || '''';
  END LOOP;
END;

答案 4 :(得分:2)

如果要阻止新用户连接,但允许当前会话继续,直到它们处于非活动状态,您可以将数据库置于QUIESCE模式:

ALTER SYSTEM QUIESCE RESTRICTED;

来自Oracle Database Administrator's Guide

  

非DBA活动会话将继续   直到他们变得不活跃一个活跃的   会话是目前的会话   在一个事务,一个查询,一个   fetch或PL / SQL语句;或者a   当前持有的会话   共享资源(例如,   入队)。没有非活动会话   允许变得活跃......一切都好   非DBA会话变为非活动状态   ALTER SYSTEM QUIESCE RESTRICTED   语句完成,以及数据库   处于停滞状态

答案 5 :(得分:2)

其他信息

  

重要的Oracle 11g更改以更改会话终止会话

     

Oracle作者Mladen Gogala指出现在需要@符号   使用inst_id列时终止会话:

alter system kill session '130,620,@1';

http://www.dba-oracle.com/tips_killing_oracle_sessions.htm

答案 6 :(得分:1)

在登录时尝试触发

不应尝试断开用户连接,而是不允许他们连接。

有这样的触发器的例子。

CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
  IF SYS_CONTEXT('USERENV','IP_ADDRESS') not in ('192.168.2.121','192.168.2.123','192.168.2.233') THEN
    RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
  END IF;

  IF (to_number(to_char(sysdate,'HH24'))< 6) and (to_number(to_char(sysdate,'HH24')) >18) THEN
    RAISE_APPLICATION_ERROR(-20005,'Logon only allowed during business hours');
  END IF;

END;

答案 7 :(得分:1)

我发现下面的代码段很有帮助。取自:http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html

select
owner||'.'||object_name obj ,
oracle_username||' ('||s.status||')' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||','||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,'yyyy/mm/dd hh24:mi:ss') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;

然后跑了:

Alter System Kill Session '<value from ss above>'
;

杀死个别会话。

答案 8 :(得分:1)

回答问题, 这是完成工作的最准确的SQL, 你可以将它与PL / SQL循环结合起来实际运行kill语句:

select ses.USERNAME,
    substr(MACHINE,1,10) as MACHINE, 
    substr(module,1,25) as module,
    status, 
    'alter system kill session '''||SID||','||ses.SERIAL#||''';' as kill
from v$session ses LEFT OUTER JOIN v$process p ON (ses.paddr=p.addr)
where schemaname <> 'SYS'
    and not exists
    (select 1 
        from DBA_ROLE_PRIVS 
        where GRANTED_ROLE='DBA' 
            and schemaname=grantee)
    and machine!='yourlocalhostname' 
order by LAST_CALL_ET desc;

答案 9 :(得分:0)

如果Oracle在Unix / Linux上运行,那么我们可以grep所有客户端连接并将其杀死

grep all oracle客户端进程:

ps -ef | grep LOCAL = NO | grep -v grep | awk'{print $ 2}'| wc -l <​​/ p>

杀死所有oracle客户端进程:

kill -9 ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}'