Ben*_*Ben 70
当你不断得到结果页面时,我假设你在SQL*Plus中启动了会话.如果是这样,则容易的事是来砸ctrl+ break,直到它停止了很多很多次.
我在下面按照增加的凶猛/邪恶的顺序详述的更复杂和更通用的方式.第一个可能适合你,但如果没有,你可以继续向下移动.
其中大多数都不推荐,可能会产生意想不到的后果.
根据ObiWanKenobi的回答和ALTER SESSION文档
alter system kill session 'sid,serial#';
Run Code Online (Sandbox Code Playgroud)
要查找sid,会话ID和serial#序列号,请运行以下查询 - 从OracleBase汇总- 并找到您的会话:
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'
Run Code Online (Sandbox Code Playgroud)
如果您正在运行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'
Run Code Online (Sandbox Code Playgroud)
如果您没有运行RAC,此查询也将起作用.
如果您使用的是PL/SQL Developer之类的工具,那么会话窗口也可以帮助您找到它.
对于稍微强一些的"kill",您可以指定IMMEDIATE关键字,该关键字指示数据库不等待事务完成:
alter system kill session 'sid,serial#' immediate;
Run Code Online (Sandbox Code Playgroud)
kill pid
Run Code Online (Sandbox Code Playgroud)
这假设您使用的是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# = ?
Run Code Online (Sandbox Code Playgroud)
再一次,如果您正在运行RAC,则需要稍微更改为:
select p.*
from Gv$process p
left outer join Gv$session s
on p.addr = s.paddr
where s.sid = ?
and s.serial# = ?
Run Code Online (Sandbox Code Playgroud)
更改where子句where s.status = 'KILLED'将帮助您找到仍在"运行"的已杀死进程.
kill -9 pid
Run Code Online (Sandbox Code Playgroud)
使用pid您在2中选择的信号,SIGKILL是从操作系统到特定进程的信号,该进程导致进程立即终止.打字时再次小心.
这很少是必要的.如果您正在执行DML或DDL,它将停止正在处理的任何回滚,并且可能使得在发生故障时将数据库恢复到一致状态变得困难.
所有剩余的选项将终止所有会话并导致您的数据库 - 并且在6和7服务器的情况下 - 变得不可用.它们只应在绝对必要的情况下使用......
shutdown immediate
Run Code Online (Sandbox Code Playgroud)
这实际上是一个不是SIGKILL的 politer ,虽然它显然是作用于数据库中的所有进程而不是你的特定进程.它总是好礼貌到您的数据库.
只有在您拥有DBA的情况下,才能关闭数据库.告诉使用数据库的人也很高兴.
它关闭数据库,终止所有会话并对rollback所有未提交的事务执行操作.如果您有需要回滚的大型未提交事务,则可能需要一段时间.
shutdown abort
Run Code Online (Sandbox Code Playgroud)
这与SIGKILL大致相同,但再次对数据库中的所有进程都是如此.这是数据库立即停止一切并死亡的信号 - 一次严重的崩溃.它终止所有会话并且不会回滚; 因此,这可能意味着数据库需要更长的时间startup.尽管有煽动性语言,但shutdown abort它并不是纯粹的邪恶,通常可以安全使用.
如前所述先告知相关人员.
reboot
Run Code Online (Sandbox Code Playgroud)
显然,这不仅会停止数据库,还会停止服务器,因此除了DBA,开发人员,客户端和用户之外,请谨慎使用并获得系统管理员的同意.
我已经重新启动了不行......一旦你到达这个阶段,你最好希望你使用的是VM.我们最终删除了它......
这就是我使用的。我执行第一个查询以查找会话和用户:
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';
Run Code Online (Sandbox Code Playgroud)
这将让我知道同一用户是否有多个会话。然后我通常会检查以验证会话是否阻塞了数据库。
SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
然后我运行一个 ALTER 语句来终止这种格式的特定会话:
ALTER SYSTEM KILL SESSION 'sid,serial#';
Run Code Online (Sandbox Code Playgroud)
例如:
ALTER SYSTEM KILL SESSION '314, 2643';
Run Code Online (Sandbox Code Playgroud)
无需终止整个会话。在 Oracle 18c 中您可以使用ALTER SYSTEM CANCEL:
取消会话中的SQL语句
您可以使用 ALTER SYSTEM CANCEL SQL 语句取消会话中的 SQL 语句。
您可以取消会话中的高负载 SQL 语句,而不是终止会话。当您取消 DML 语句时,该语句将回滚。
Run Code Online (Sandbox Code Playgroud)ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';如果未指定@INST_ID,则使用当前会话的实例ID。
如果未指定 SQL_ID,则终止指定会话中当前正在运行的 SQL 语句。