我杀死了一个会话,它仍在运行?

use*_*759 2 oracle

我有 Oracle 9.2

我使用查询查看我的运行会话:

SELECT S92700.SYSUSR_VW."NAME", SID,SERIAL#, AUDSID
FROM v$session, S92700.SYSUSR_VW, S92700.SECUSR
WHERE S92700.SYSUSR_VW.SESSIONID = AUDSID AND S92700.SECUSR."NAME"=S92700.SYSUSR_VW."NAME" 
Run Code Online (Sandbox Code Playgroud)

结果:

 NAME      SID      SERIAL#    AUDSID
 prot6      9        6503       78239
Run Code Online (Sandbox Code Playgroud)

我运行以下查询来终止会话

alter system kill session '9,6503' immediate
Run Code Online (Sandbox Code Playgroud)

SQL 命令执行

在 0 秒内成功执行,0 行受影响。第 1 行,第 1 列

0 秒后执行完成,发生 0 个错误。


会话仍在运行

其他模式中的相同查询正在工作

Vin*_*rat 7

AskTom 上的一个线程,当会话被终止时:

会话已终止,但正在清理。当你终止一个会话时——仍然必须清理未完成的工作。

当您对表执行 DML 时,即使您没有提交,Oracle 也可能几乎立即对基表进行更改。由于多版本读取一致性,其他会话尚未看到这些更改,但实际物理块可能已经被您未提交的工作覆盖。

这样做是因为 Oracle 针对提交进行了优化。大多数会话应该很少回滚,因此 Oracle 通过抢先写入更改来预测。这也是允许 Oracle 拥有任意大事务(仅受undo 表空间大小限制)的原因之一。更改不会延迟(很多)。这也是为什么您几乎从不等待 Oracle 中的提交,即使是数百万行的 DML。

后果之一是回滚需要撤消更改。未提交的事务从撤消表空间读回,并且每个更改都以相反的顺序撤消。由于以下几个原因,这可能需要比初始 DML 更长的时间:

  • 回滚没有得到很好的优化,特别是多行操作可能比常规 DML 花费更长的时间。
  • 反过来,某些更改的成本更高。例如,相对便宜的 DML 删除变成反向插入(更昂贵)。

这解释了为什么回滚可能需要很多时间。你几乎没有办法加速这个过程。在任何情况下,您都不应该

  • 终止回滚进程
  • 关闭数据库,希望这将终止会话

如果您正常(或事务性或立即性)关闭数据库,Oracle 将等待该过程完成以使数据库保持一致状态。如果关闭ABORT,数据库将处于不一致状态(未提交的数据写入磁盘),一旦数据库重新启动,Oracle 将恢复回滚。

回滚由smon处理,我不会试图杀死它。


某些会话在被杀死后仍将保留在v$session视图中,即使它们的所有更改都已完全回滚。这通常是因为 Oracle 正在等待客户端返回相关错误消息,例如:

ora-00028 your session has been killed
Run Code Online (Sandbox Code Playgroud)

如果客户端本身已经离开或网络通信已被切断,则被终止的会话可能会无限期保留,直到您重新启动实例。我认为这些会议不会占用资源。