Como verificar o número máximo de conexões permitidas com um banco de dados Oracle?

89

Qual é a melhor maneira, usando SQL, de verificar o número máximo de conexões permitidas para um banco de dados Oracle? No final, gostaria de mostrar o número atual de sessões e o número total permitido, por exemplo, "Atualmente, 23 de 80 conexões são usadas".

Niklas Gustavsson
fonte

Respostas:

120

Existem alguns limites diferentes que podem entrar em jogo na determinação do número de conexões que um banco de dados Oracle suporta. A abordagem mais simples seria usar o parâmetro SESSIONS e V $ SESSION, ou seja,

O número de sessões que o banco de dados foi configurado para permitir

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

O número de sessões atualmente ativas

SELECT COUNT(*)
  FROM v$session

Porém, como eu disse, existem outros limites potenciais tanto no nível do banco de dados quanto no nível do sistema operacional, dependendo se o servidor compartilhado foi configurado. Se o servidor compartilhado for ignorado, você pode atingir o limite do parâmetro PROCESSES antes de atingir o limite do parâmetro SESSIONS. E você pode atingir os limites do sistema operacional porque cada sessão requer uma certa quantidade de RAM.

Caverna Justin
fonte
desculpe, como podemos executar esta consulta? Estou recebendo "tabela ou visão não existe" para "SELECT COUNT (*) FROM v $ session"
aldeão
3
@ yin03 - Isso significa que qualquer usuário Oracle que você esteja usando não tem privilégios na v$sessionvisualização. Você precisaria pedir ao seu DBA para conceder esse privilégio. Provavelmente, você desejaria o select any dictionaryprivilégio por meio da select_catalog_rolefunção ou uma concessão direta apenas naquele objeto também funcionaria.
Justin Cave
35

O parâmetro de sessões é derivado do parâmetro de processos e muda de acordo quando você altera o número máximo de processos. Veja a documentação da Oracle para mais informações.

Para obter apenas as informações sobre as sessões:

    select current_utilization, limit_value 
    from v$resource_limit 
    where resource_name='sessions';
CURRENT_UTILIZATION LIMIT_VALUE
------------------- -----------
                110 792

Tente isso para mostrar informações sobre ambos:

    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
------------- ------------------- --------------- --- --------
processos 96 309 500
sessões 104 323 792
FuePi
fonte
34

Achei que isso funcionaria, com base nesta fonte .

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

No entanto, Justin Cave está certo. Esta consulta fornece melhores resultados:

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'
JosephStyons
fonte
desculpe, como podemos executar esta consulta? Estou recebendo "tabela ou visão não existe" para "SELECT COUNT (*) FROM v $ session"
aldeão
2
@ yin03 Você está usando Oracle ou outro tipo de banco de dados? Se for Oracle, pode ser um problema de permissões.
JosephStyons
1
consulta perfeita @JosephStyons!
Gaurav de
@guarav, que bom que você achou útil!
JosephStyons de
4

Nota: isso responde apenas a parte da pergunta.

Se você quer apenas saber o número máximo de sessões permitidas, você pode executar no sqlplus, como sysdba:

SQL> show parameter sessions

Isso fornece uma saída como:

    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

O parâmetro de sessões é o que você deseja.

botkop
fonte
4

Use gv $ session para RAC, se quiser obter o número total de sessões no cluster.

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