为什么在'KILL SESSION'(Oracle SQL)中需要sid?

时间:2012-05-19 18:50:41

标签: sql oracle sessionid

我有考试问题,无法找到答案。为什么执行sid命令需要KILL SESSIONKILL SESSION语法:ALTER SYSTEM KILL SESSION 'sid,session#[@inst_id]' [IMMEDIATE];
哪里 sid 是一个独特的'会话标识符。引用中的唯一因为它在当前时刻中是唯一的,Oracle服务器可以具有例如会话一些sid,但是在此会话结束后,此sid可以用于其他会话。操作系统中Sid类似于pid 会话#序列会话号码;这是一个会议柜台。服务器在数据库启动时清除计数器。因此,session#是会话的真正唯一标识符

我不明白为什么sidKILL SESSION命令是强制性的。我认为,可以仅使用session#

感谢。

3 个答案:

答案 0 :(得分:4)

您需要SID和SERIAL#。 oracle reference有这样说:

  

SID 会话标识符

     

序列号会话序列号。用于唯一标识会话   对象。保证会话级命令应用于   如果会话结束并且另一个会话开始,则更正会话对象   具有相同的会话ID

因此,虽然SID是唯一的,但可以重复使用。所以我想添加一个SERIAL#可以确保你不会杀死一个新连接的会话,它恰好使用你想要杀死的SID(如果他们在执行命令之前已经断开连接)。

更新以回应陪审团的评论:

我不能说为什么它是这样实现的,只是我根据文档对实现的理解:SID是可重用的,SID中的SERIAL#不是。所以,作为一个例子:

  • [1,1] JOE连接并分配了SID 1,SERIAL#1
  • JOE断开连接
  • [1,2] TOM连接并分配SID 1(重用),但SERIAL#增加到2
  • [2,1] SUSAN连接并分配了SID 2,SERIAL#1

为什么要这样实施?保持数字大小可管理吗?最小化争用?重用已经分配的资源(由SID表示)?我不知道。

答案 1 :(得分:2)

我找到了! serial#的序列是循环的。如果使用int,则在数十亿次登录后使用数字,如果使用short,则在32k之后重复使用。因此,使用serial#而不使用任何其他内容不会提供真正独特的枚举 但是sid在某个时刻是独一无二的。因此,对sid,serial# 非常独特 您无法使用serial#sid来管理会话,您应该成对使用它。

感谢您的时间!

答案 2 :(得分:2)

我知道这是一个古老的主题,但我想指出,即使在某个特定时间点,串口#本身也不接近唯一标识符。

SQL> select serial#, count(*) from v$session group by serial#;

   SERIAL#   COUNT(*)
---------- ----------
         1         15
       983          1
         2          1
       505          1
         5          2
      7076          1
         7          2
        58          1
         3          3
         9          1
     22160          1

11 rows selected.

在我目前的数据库中的29个会话中,只有11个不同的序列#s。

编辑:这是一个单实例数据库。在RAC环境中,您需要包含实例ID以获得真正独特的会话,这是我理解的(我从未亲自使用过RAC数据库)。