在 Oracle 中终止来自指定用户的所有会话的最快方法是什么?

在 Oracle 中终止来自指定用户的所有会话的最快方法是什么?

在 Oracle 中终止来自指定用户的所有会话的最快方法是什么?

答案1

您应该能够循环执行此操作PL/SQL。请确保在实际调用之前仅通过记录参数来测试它kill session

BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = 'your_user_name'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;

观点差不多在 asktom 上提问

答案2

另一种总体运行速度更快的方法是生成 orakill 命令并在 DOS 窗口中执行它们:

SELECT 'orakill '||d.name||' '||spid
  FROM v$session s JOIN v$process p ON addr=paddr
                   JOIN v$database d ON (1=1)
WHERE s.username = 'THE_USER';

Orakill 不会等待会话事务完成,因此终止速度非常快。

无论您的解决方案是什么,请务必小心!

答案3

需要注意的一点是,在 Oracle 中终止会话并不一定能阻止用户会话(及相关进程)消耗资源。因此,失控查询可能会继续失控,消耗 CPU 和 I/O 等资源并持有锁,直到它重新使用 Oracle 的进程监视器 (pmon) 进程/线程进行检查。

假设某人在 Unix 系统上以“专用连接”模式运行 Oracle,则可以将 v$session 和 v$process 在 v$session.paddr = v$process.addr 上连接起来,以查找给定用户连接的所有会话和进程,然后使用 UNIXkill命令SIGKILL终止该用户会话的底层服务器进程。然后 pmon 将清理失败的会话,回滚所有事务并释放所有锁。

当 Peter Lang 先前指出的方法不能足够积极地终止用户会话时,这绝对是一种强硬的方法。

答案4

这是 Peter Lang 的答案的一个很小的改进,我发现它更容易使用。它是交互式的,并要求输入用户名:

PROMPT Entrer the username to kill;
DEFINE username = &1
BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = '&&username'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;
/

相关内容