如何检查Oracle数据库允许的最大连接数?

99

使用SQL查询检查Oracle数据库允许的最大连接数的最佳方式是什么?最终,我想显示当前会话数和总允许数,例如“目前,80个连接中有23个正在使用”。

7个回答

132

在确定Oracle数据库支持的连接数时,可能会涉及到几个不同的限制条件。最简单的方法是使用SESSIONS参数和V$SESSION,即:

数据库配置允许的会话数。

SELECT name, value 
  FROM v$parameter
 WHERE name = 'sessions'

当前活跃会话数

SELECT COUNT(*)
  FROM v$session

就像我之前说的一样,无论是在数据库层面还是操作系统层面,都存在其他潜在的限制条件,这取决于是否已配置共享服务器。如果忽略共享服务器,你很可能在达到SESSIONS参数的限制之前就会达到PROCESSES参数的限制。另外,每个会话都需要一定量的内存,因此你可能会碰到操作系统的限制。


1
抱歉,我们该如何运行这个查询?我收到了“表或视图不存在”的错误提示,针对的是“SELECT COUNT(*) FROM v$session”。 - lorraine batol
5
这句话的意思是,这表示您正在使用的Oracle用户没有对v$session视图的权限。您需要向数据库管理员请求授予您该权限。最可能的是,您需要通过select any dictionary特权或者直接授予该对象来获得select_catalog_role角色。请注意,不要改变原本的意思。 - Justin Cave
ORA-00942: "表或视图不存在" - pdem
1
@pdem - 正如我之前的评论所提到的,这意味着您没有访问那些视图的权限,需要向数据库管理员请求授予您访问权限。 - Justin Cave

46

sessions参数是从processes参数派生的,当您更改最大进程数时,该参数会相应地发生变化。有关详细信息,请参阅Oracle文档

要仅获取有关会话的信息:

    select current_utilization, limit_value 
    from v$resource_limit 
    where resource_name='sessions';
当前使用量 限制值
-------------- -------
            110     792

尝试这个来显示两者的信息:

    select resource_name, current_utilization, max_utilization, limit_value 
    from v$resource_limit 
    where resource_name in ('sessions', 'processes');
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION LIMIT_VALUE
------------- ------------------- --------------- -----------
进程数                        96             309         500
会话数                       104             323         792

35

根据这个来源,我原以为这会奏效。

SELECT
  'Currently, ' 
  || (SELECT COUNT(*) FROM V$SESSION)
  || ' out of ' 
  || DECODE(VL.SESSIONS_MAX,0,'unlimited',VL.SESSIONS_MAX) 
  || ' connections are used.' AS USAGE_MESSAGE
FROM 
  V$LICENSE VL

然而,Justin Cave是正确的。这个查询会给出更好的结果:

SELECT
  'Currently, ' 
  || (SELECT COUNT(*) FROM V$SESSION)
  || ' out of ' 
  || VP.VALUE 
  || ' connections are used.' AS USAGE_MESSAGE
FROM 
  V$PARAMETER VP
WHERE VP.NAME = 'sessions'

抱歉,请问我们该如何运行这个查询?我收到了“表或视图不存在”的错误,针对的是“SELECT COUNT(*) FROM v$session”。 - lorraine batol
2
@yin03 你是在使用Oracle还是其他类型的数据库?如果是Oracle,可能是权限问题。 - JosephStyons
1
无瑕疵的查询 @JosephStyons! - Gaurav
@guarav,我很高兴你觉得它有用! - JosephStyons

6
注意:这仅回答了问题的一部分。
如果您只想知道允许的最大会话数,则可以在sqlplus中以sysdba身份执行以下命令:
SQL> show parameter sessions

这将为您提供如下输出结果:
    NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size           integer     0
java_soft_sessionspace_limit         integer     0
license_max_sessions                 integer     0
license_sessions_warning             integer     0
sessions                             integer     248
shared_server_sessions               integer

会话参数就是你想要的参数。

4

如果您想获取整个群集中的会话总数,请使用gv$session进行RAC操作。


3

1
select count(*),sum(decode(status, 'ACTIVE',1,0)) from v$session where type= 'USER'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接