如何杀死正在运行的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相同的pidSIGKILL是从操作系统到特定进程的信号,该进程会立即终止进程。 打字时再次小心。

这应该很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的客户端。 我使用文件菜单下的取消选项,它停止执行!

文件菜单,Oracle SQL * Plus

一旦你点击文件等待几分钟,然后select命令暂停,菜单出现点击取消。

如果你想停止进程,你可以从任务pipe理器在另一端手动杀死它,如果你想停止在DBMS中运行查询,你可以停止在这里为MS SQL SERVER T-SQL STOP或ABORT命令SQL Server希望它可以帮助你