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

时间:2020-03-05 18:51:05  来源:igfitidea点击:

我需要在没有管理员的监督下快速(强行)终止所有连接到oracle数据库的外部会话。

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

我该如何编写脚本?

解决方案

回答

这个答案在很大程度上受到以下对话的影响: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与其自身的连接。

回答

尝试在登录时触发

为了尝试断开用户连接,我们不应该允许他们连接。

有这样的触发器的例子。

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;

回答

在终止会话之前,如果可能的话,请执行

ALTER SYSTEM ENABLE RESTRICTED SESSION;

阻止新会话连接。

回答

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

ALTER SYSTEM QUIESCE RESTRICTED;

从《 Oracle数据库管理员指南》中:

Non-DBA active sessions will continue
  until they become inactive. An active
  session is one that is currently
  inside of a transaction, a query, a
  fetch, or a PL/SQL statement; or a
  session that is currently holding any
  shared resources (for example,
  enqueues). No inactive sessions are
  allowed to become active...Once all
  non-DBA sessions become inactive, the
  ALTER SYSTEM QUIESCE RESTRICTED
  statement completes, and the database
  is in a quiesced state

回答

我发现以下代码段很有帮助。摘自: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>'
;

杀死单个会话。

回答

作为SYS:

startup force;

残酷而优雅。