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

时间:2015-07-03 08:05:26

标签: oracle session stored-procedures schema

我正在尝试使用以下脚本立即终止用户的所有活动和非活动oracle会话,但它不起作用。该脚本成功执行但不会终止用户的会话。

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;

6 个答案:

答案 0 :(得分:17)

KILL SESSION命令实际上 kill 会话。它只是要求会话自杀。在某些情况下,例如等待远程数据库的回复或回滚事务,会话不会立即自行终止并等待当前操作完成。在这些情况下,会话的状态为“标记为终止”。然后它会尽快被杀死。

检查状态以确认:

SELECT sid, serial#, status FROM v$session;

您还可以使用 IMMEDIATE 子句:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

IMMEDIATE子句不会影响命令执行的工作,但会立即将控制权返回给当前会话,而不是等待确认kill。看看Killing Oracle Sessions

更新如果你想要杀死所有会话,你可以准备一个小脚本。

SELECT 'ALTER SYSTEM KILL SESSION '||sid||','||serial#||';' FROM v$session;

假脱机上面的.sql文件并执行它。

答案 1 :(得分:16)

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;

这应该有效 - 我刚刚更改了您的脚本以添加immediate关键字。正如之前的答案所指出的那样,kill session只标记了杀戮的会话;它不会立即这样,但是在方便的时候会这样做。

从您的问题来看,您似乎希望立即看到结果。因此immediate关键字用于强制执行此操作。

答案 2 :(得分:4)

执行此脚本:

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';

它将打印出应该执行的sqls。

答案 3 :(得分:0)

对于Oracle 11g,这可能无法正常工作,因为您可能会收到以下错误消息

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.

要解决此问题,请使用以下代码标识会话

SQL> select inst_id,sid,serial# from gv$session或v $ session

注意 v $ session没有inst_id字段

并使用

杀死他们
alter system kill session 'sid,serial,@inst_id' IMMEDIATE;

答案 4 :(得分:0)

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/
  

对我有用。

答案 5 :(得分:0)

杀死前一天的无效会话

begin
    for i in (select * from v$session where status='INACTIVE' and (sysdate-PREV_EXEC_START)>1)
    LOOP
        EXECUTE IMMEDIATE(q'{ALTER SYSTEM KILL SESSION '}'||i.sid||q'[,]'  ||i.serial#||q'[']'||' IMMEDIATE');
    END LOOP;
end;