如何杀死正在运行的SELECT语句
如何通过杀死会话来停止正在运行的SELECT语句?
该命令不断给我基于SELECT语句的输出,我想停在它之间。
当你不断得到结果页面时,我假设你在SQL * Plus中开始了会话。 如果是这样,那么容易做的事情就是多次打击ctrl + break ,直到停止。
下面按照越来越凶猛/邪恶的顺序来描述更复杂,更通用的方法。 第一个可能会为你工作,但如果没有,你可以继续下去的名单。
其中大部分不推荐,可能会有意想不到的后果。
1. Oracle级别 – 杀死数据库中的进程
根据ObiWanKenobi的回答和ALTER SESSION文档
alter system kill session 'sid,serial#';
要查找sid
,会话ID和serial#
,序列号,请运行以下查询(从OracleBase汇总)并find您的会话:
select s.sid, s.serial#, p.spid, s.username, s.schemaname , s.program, s.terminal, s.osuser from v$session s join v$process p on s.paddr = p.addr where s.type != 'BACKGROUND'
如果您正在运行RAC,那么您需要稍微更改以考虑多个实例, inst_id
是标识它们的标识:
select s.inst_id, s.sid, s.serial#, p.spid, s.username , s.schemaname, s.program, s.terminal, s.osuser from Gv$session s join Gv$process p on s.paddr = p.addr and s.inst_id = p.inst_id where s.type != 'BACKGROUND'
如果你没有运行RAC,这个查询也可以工作。
如果您正在使用像PL / SQL Developer这样的工具,那么会话窗口也将帮助您find它。
对于稍微强一点的“kill”,可以指定IMMEDIATE关键字,它指示数据库不要等待事务完成:
alter system kill session 'sid,serial#' immediate;
2. 操作系统级别 – 发出SIGTERM
kill pid
这假定你正在使用Linux或其他* nix变种。 SIGTERM是从操作系统到特定进程的终止信号,要求其停止运行。 它试图让进程优雅地终止。
如果出现这种错误,可能会导致您终止基本的操作系统进程,因此input时请小心。
您可以通过运行以下查询来findpid
,进程ID,这也会告诉您有用的信息,例如进程正在运行的terminal以及运行该进程的用户名,以便确保您select正确的信息。
select p.* from v$process p left outer join v$session s on p.addr = s.paddr where s.sid = ? and s.serial# = ?
再一次,如果您运行的是RAC,则需要稍微更改为:
select p.* from Gv$process p left outer join Gv$session s on p.addr = s.paddr where s.sid = ? and s.serial# = ?
将where
子句更改为where s.status = 'KILLED'
将帮助您find已经被杀死的仍在“正在运行”的进程。
3. 操作系统 – 发出SIGKILL
kill -9 pid
使用与2相同的pid
, SIGKILL是从操作系统到特定进程的信号,该进程会立即终止进程。 打字时再次小心。
这应该很less是必要的。 如果您正在执行DML或DDL ,则会停止正在处理的任何回滚,并且可能会使发生故障时将数据库恢复到一致状态变得困难。
剩下的所有选项将会终止所有会话并导致您的数据库 – 并且在6和7服务器的情况下 – 将变得不可用。 只有在绝对必要时才能使用它们。
4. Oracle – closures数据库
shutdown immediate
这实际上是一个比SIGKILL更高的指针,但显然它会影响数据库中的所有进程而不是您的特定进程。 礼貌地对待你的数据库总是好事。
只有在DBA同意的情况下才能closures数据库,如果有的话。 很高兴告诉使用数据库的人员。
它closures数据库,终止所有会话,并rollback
所有未提交的事务。 如果您有大量未提交的事务需要回滚,则可能需要一些时间。
5. Oracle – closures数据库(不太好的方法)
shutdown abort
这与SIGKILL大致相同,但是又一次在数据库中的所有进程上。 这是数据库的一个信号,立即停止所有事情并死亡 – 一场严重的崩溃。 它终止所有会话,不会回滚; 因为这可能意味着数据库需要更长的时间才能重新startup
。 尽pipe煽动性的语言shutdown abort
不是纯粹的邪恶,通常可以安全地使用。
一如既往地通知有关人员。
6. 操作系统 – 重新启动服务器
reboot
显然,这不仅会停止数据库,还会停止服务器,所以除了DBA,开发人员,客户和用户之外,请谨慎使用,并征得系统pipe理员的同意。
7. 操作系统 – 最后一个阶段
我已经重新启动没有工作…一旦你已经到了这个阶段,你最好希望你使用虚拟机。 我们结束了删除它…
这是我用的。 我做这第一个查询find会议和用户:
select s.sid, s.serial#, p.spid, s.username, s.schemaname , s.program, s.terminal, s.osuser from v$session s join v$process p on s.paddr = p.addr where s.type != 'BACKGROUND';
这将让我知道是否有多个会话为同一个用户。 然后,我通常会检查以validation会话是否阻塞数据库。
SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;
然后我运行一个ALTER语句来以这种格式杀死一个特定的会话:
ALTER SYSTEM KILL SESSION 'sid,serial#';
例如:
ALTER SYSTEM KILL SESSION '314, 2643';
要在Oracle中终止会话 ,请使用ALTER SYSTEM KILL SESSION命令。
详情在这里: http : //www.oracle-base.com/articles/misc/KillingOracleSessions.php
哦! 只是阅读有问题的评论,亲爱的我错过了。 但只要让答案在这里,以防其他人可能有用
我试过“Ctrl + C”和“Ctrl + Break”都没有工作。 我正在使用Oracle客户端10.2.0.1.0附带的SQL Plus。 大多数SQL Plus用作连接Oracle DB的客户端。 我使用文件菜单下的取消选项,它停止执行!
一旦你点击文件等待几分钟,然后select命令暂停,菜单出现点击取消。
如果你想停止进程,你可以从任务pipe理器在另一端手动杀死它,如果你想停止在DBMS中运行查询,你可以停止在这里为MS SQL SERVER T-SQL STOP或ABORT命令SQL Server希望它可以帮助你