我有考试问题,无法找到答案。为什么执行sid
命令需要KILL SESSION
?
KILL SESSION
语法:ALTER SYSTEM KILL SESSION 'sid,session#[@inst_id]' [IMMEDIATE];
哪里 sid 是一个独特的'会话标识符。引用中的唯一因为它在当前时刻中是唯一的,Oracle服务器可以具有例如会话一些sid,但是在此会话结束后,此sid可以用于其他会话。操作系统中Sid
类似于pid
会话#是序列会话号码;这是一个会议柜台。服务器在数据库启动时清除计数器。因此,session#是会话的真正唯一标识符。
我不明白为什么sid
对KILL SESSION
命令是强制性的。我认为,可以仅使用session#
。
感谢。
答案 0 :(得分:4)
您需要SID和SERIAL#。 oracle reference有这样说:
SID 会话标识符
序列号会话序列号。用于唯一标识会话 对象。保证会话级命令应用于 如果会话结束并且另一个会话开始,则更正会话对象 具有相同的会话ID
因此,虽然SID是唯一的,但可以重复使用。所以我想添加一个SERIAL#可以确保你不会杀死一个新连接的会话,它恰好使用你想要杀死的SID(如果他们在执行命令之前已经断开连接)。
更新以回应陪审团的评论:
我不能说为什么它是这样实现的,只是我根据文档对实现的理解:SID是可重用的,SID中的SERIAL#不是。所以,作为一个例子:
为什么要这样实施?保持数字大小可管理吗?最小化争用?重用已经分配的资源(由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数据库)。