¿Cómo verificar el número máximo de conexiones permitidas a una base de datos de Oracle?

90

¿Cuál es la mejor manera, usando SQL, de verificar la cantidad máxima de conexiones permitidas para una base de datos Oracle? Al final, me gustaría mostrar el número actual de sesiones y el número total permitido, por ejemplo, "Actualmente, se utilizan 23 de 80 conexiones".

Niklas Gustavsson
fuente

Respuestas:

122

Hay algunos límites diferentes que pueden entrar en juego para determinar la cantidad de conexiones que admite una base de datos Oracle. El enfoque más simple sería utilizar el parámetro SESSIONS y V $ SESSION, es decir

El número de sesiones que la base de datos estaba configurada para permitir

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

El número de sesiones actualmente activas

SELECT COUNT(*)
  FROM v$session

Sin embargo, como dije, existen otros límites potenciales tanto a nivel de base de datos como a nivel de sistema operativo y dependiendo de si se ha configurado el servidor compartido. Si se ignora el servidor compartido, es posible que alcance el límite del parámetro PROCESOS antes de alcanzar el límite del parámetro SESIONES. Y puede llegar a los límites del sistema operativo porque cada sesión requiere una cierta cantidad de RAM.

Justin Cave
fuente
lo siento, ¿cómo podemos ejecutar esta consulta? Recibo "la tabla o la vista no existen" para "SELECCIONAR CONTADOR (*) DE v $ sesión"
aldeano
3
@ yin03: eso implica que cualquier usuario de Oracle que esté utilizando no tiene privilegios en la v$sessionvista. Debería pedirle a su DBA que le otorgue ese privilegio. Lo más probable es que desee el select any dictionaryprivilegio a través del select_catalog_rolerol o una concesión directa solo para ese objeto.
Justin Cave
36

El parámetro de sesiones se deriva del parámetro de procesos y cambia en consecuencia cuando cambia el número máximo de procesos. Consulte los documentos de Oracle para obtener más información.

Para obtener solo la información sobre las sesiones:

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

Prueba esto para mostrar información 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
------------- ------------------- --------------- --- --------
procesos 96309500
sesiones 104323792
FuePi
fuente
34

Pensé que esto funcionaría, basado en esta fuente .

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

Sin embargo, Justin Cave tiene razón. Esta consulta da mejores 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
fuente
lo siento, ¿cómo podemos ejecutar esta consulta? Recibo "la tabla o la vista no existen" para "SELECCIONAR CONTADOR (*) DE v $ sesión"
aldeano
2
@ yin03 ¿Está utilizando Oracle u otro tipo de base de datos? Si es Oracle, puede ser un problema de permisos.
JosephStyons
1
consulta impecable @JosephStyons!
Gaurav
@guarav, ¡me alegra que lo hayas encontrado útil!
JosephStyons
4

Nota: esto solo responde a una parte de la pregunta.

Si solo desea saber el número máximo de sesiones permitidas, puede ejecutar en sqlplus, como sysdba:

SQL> show parameter sessions

Esto le da una salida 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

El parámetro de sesiones es el que quieres.

botkop
fuente
4

Utilice gv $ session para RAC, si desea obtener el número total de sesiones en el clúster.

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