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;
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;
/
您应该能够
PL/SQL
循环执行此操作。确保在实际调用之前只记录参数来测试它kill session
。请参阅 asktom 上的类似问题。
另一种整体运行速度更快的方法是生成 orakill 命令并在 DOS 窗口中执行它们:
Orakill 不等待会话事务完成,因此 kill 非常快。
无论您的解决方案是什么,都要小心!
需要注意的一件事是,在 Oracle 中终止会话并不一定会阻止用户的会话(和相关进程)消耗资源。因此,失控查询可能会继续运行,消耗 CPU 和 I/O 等资源并持有锁,直到它使用 Oracle 的进程监视器 (pmon) 进程/线程重新检查。
假设一个人在 Unix 系统上以“专用连接”模式运行 Oracle,可以在 v$session.paddr = v$process.addr 上加入 v$session 和 v$process 以查找给定用户连接的所有会话和进程,并使用 UNIX命令
kill
withSIGKILL
来终止用户会话的底层服务器进程。然后 pmon 将清理失败的会话,回滚所有事务并释放所有锁。当 Peter Lang 之前指出的方法没有足够积极地杀死用户的会话时,这绝对是一种大锤方法。
更改系统检查点;
关闭中止
启动限制
立即关闭
:)
这是彼得朗的答案的一个非常轻微的改进,我发现它更易于使用。它是交互式的并要求输入用户名: