sql - 如何杀死正在运行的 SELECT 语句

标签 sql oracle select oracle10g sqlplus

如何通过终止 session 来停止正在运行的 SELECT 语句?

该命令根据 SELECT 语句不断给我输出,我想在两者之间停止它。

最佳答案

当您不断获得结果页面时,我假设您在 SQL*Plus 中启动了 session 。如果是这样,最简单的方法是 bash ctrl + break 很多很多次,直到它停止。

我在下面详细介绍了更复杂和更通用的方法,以增加凶猛/邪恶的顺序。第一个可能对你有用,但如果没有,你可以继续向下移动列表。

不推荐使用其中的大多数,并且可能会产生意想不到的后果。

1、Oracle级别——杀死数据库中的进程

根据 ObiWanKenobi's answerALTER SESSION 文档

alter system kill session 'sid,serial#';

要查找 sid 、 session id 和 serial# 、序列号,请运行以下查询 - 从 OracleBase 汇总 - 并找到您的 session :
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 这样的工具,那么 session 窗口也将帮助您找到它。

对于稍微强一点的“kill”,您可以指定 IMMEDIATE 关键字,它指示数据库不要等待事务完成:
alter system kill session 'sid,serial#' immediate;

2. 操作系统级别 - 发出 SIGTERM

kill pid

这假设您使用的是 Linux 或其他 *nix 变体。 SIGTERM 是操作系统向特定进程发出的终止信号,要求它停止运行。它试图让进程优雅地终止。

弄错了可能会导致您终止重要的操作系统进程,因此在键入时要小心。

您可以通过运行以下查询找到 pid ,进程 ID,它还会告诉您有用的信息,例如运行进程的终端和运行它的用户名,以便您确保选择正确的。
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' 将帮助您找到仍在“运行”的已终止进程。

3. 操作系统 - 发出 SIGKILL

kill -9 pid

使用您在 2 中选择的相同 pid,SIGKILL 是从操作系统发送到特定进程的信号,该信号导致进程立即终止。再次打字时要小心。

这应该很少是必要的。如果您正在执行 DMLDDL,它将停止正在处理的任何回滚,并且可能难以在发生故障时将数据库恢复到一致状态。

All the remaining options will kill all sessions and result in your database - and in the case of 6 and 7 server as well - becoming unavailable. They should only be used if absolutely necessary...



4. Oracle - Shutdown 数据库
shutdown immediate

这实际上比 SIGKILL 更礼貌,尽管显然它作用于数据库中的所有进程而不是您的特定进程。对你的数据库保持礼貌总是好的。

只有在您的 DBA 同意的情况下才能关闭数据库(如果您有 DBA)。很高兴告诉使用数据库的人。

它关闭数据库,终止所有 session 并对所有未提交的事务执行 rollback 。如果您有大量未提交的事务需要回滚,则可能需要一段时间。

5. Oracle - 关闭数据库(不太好的方式)
shutdown abort

这与 SIGKILL 大致相同,尽管再次针对数据库中的所有进程。这是给数据库的一个信号,立即停止一切并死掉 - 一次严重的崩溃。它终止所有 session 并且不回滚;因此,这可能意味着数据库需要更长的时间才能再次访问 startup 。尽管有煽动性的语言,shutdown abort 并不是纯粹的邪恶,通常可以安全地使用。

和以前一样,先通知相关人员。

6. 操作系统 - 重启服务器

reboot

显然,这不仅会停止数据库,还会停止服务器,因此除了 DBA、开发人员、客户和用户之外,请谨慎使用并征得系统管理员的同意。

7. 操作系统——最后阶段

我已经重新启动不起作用......一旦你达到这个阶段,你最好希望你使用的是虚拟机。我们最终删除了它......

关于sql - 如何杀死正在运行的 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545560/

相关文章:

php - 如何在编辑 form_dropdown codeigniter 中显示所选项目

SQL Server 2008 - 从选择到快速编辑

sql - 如何在Oracle中获取每个组的最大值?

sql - 在oracle中选择2列值作为1

MySQL 选择查询 - 添加两行并将它们显示为一行?

sql - 如何找到以 GB 为单位的列的大小?

sql - 错误 : SubQuery returns more than one records

sql - 列中具有相同值的行,将另一列中的所有值相加并显示 1 行

mysql - SQL 查询关联给定消费者拥有的每个集合集的数量

java - hibernate创建sessionfactory时出现空指针异常