7

我有考试题,找不到答案。为什么sid必须强制执行KILL SESSION命令?
KILL SESSION语法:ALTER SYSTEM KILL SESSION 'sid,session#[@inst_id]' [IMMEDIATE];
其中sid是“唯一”会话标识符。引号中唯一,因为它在当前时刻是唯一的,Oracle 服务器可以有,例如会话某个 sid,但是在这个会话结束后,这个 sid 可以用于其他会话。在操作系统中Sid是类比。Session#是一个序列会话号;它是一个会话计数器。服务器在数据库启动时清除计数器。因此, session# 是会话的真正唯一标识符pid

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

谢谢。

4

3 回答 3

6

您需要 SID 和 SERIAL#。甲骨文参考有这样的说法:

SID 会话标识符

SERIAL# 会话序列号。用于唯一标识会话的对象。如果会话结束并且另一个会话以相同的会话 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 表示)?我不知道。

于 2012-05-19T19:25:03.000 回答
6

我找到了!序列serial#是循环的。int如果使用了 20 亿次登录,或者如果使用了 32k次,号码将被重新short使用。因此,不使用serial#其他任何东西并不能提供真正独特的枚举。
sid在一瞬间是独一无二的。所以,pairsid,serial#真的很独特
您不能使用serial#sid管理会话,您应该成对使用它。

感谢您的时间!

于 2012-05-20T14:21:53.087 回答
4

我知道这是一个老话题,但我想指出 serial# 本身甚至不接近唯一标识符,即使在特定时间点也是如此。

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 个不同的序列号。

EDIT: And this is a single instance database. In a RAC environment, you need to include the instance ID to get a truly unique session, from what I understand (I've never personally worked with a RAC database).

于 2013-06-27T15:14:51.183 回答