Jak sprawdzić maksymalną liczbę dozwolonych połączeń z bazą danych Oracle?

90

W jaki sposób najlepiej sprawdzić maksymalną liczbę połączeń dozwolonych dla bazy danych Oracle przy użyciu języka SQL? Na koniec chciałbym pokazać aktualną liczbę sesji oraz łączną dozwoloną liczbę np. „Obecnie używane są 23 z 80 połączeń”.

Niklas Gustavsson
źródło

Odpowiedzi:

121

Istnieje kilka różnych ograniczeń, które mogą wpłynąć na określenie liczby połączeń obsługiwanych przez bazę danych Oracle. Najprostszym podejściem byłoby użycie parametru SESSIONS i V $ SESSION, czyli

Liczba sesji, na które baza danych została skonfigurowana

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

Liczba aktualnie aktywnych sesji

SELECT COUNT(*)
  FROM v$session

Jak powiedziałem, istnieją jednak inne potencjalne ograniczenia, zarówno na poziomie bazy danych, jak i na poziomie systemu operacyjnego oraz w zależności od tego, czy skonfigurowano serwer współdzielony. Jeśli serwer współdzielony jest ignorowany, możesz przekroczyć limit parametru PROCESSES, zanim osiągniesz limit parametru SESSIONS. Możesz też przekroczyć ograniczenia systemu operacyjnego, ponieważ każda sesja wymaga określonej ilości pamięci RAM.

Justin Cave
źródło
przepraszam, jak możemy uruchomić to zapytanie? Otrzymuję informację „tabela lub widok nie istnieje” dla „SELECT COUNT (*) FROM v $ session”
wieśniak,
3
@ yin03 - Oznacza to, że dowolny użytkownik Oracle, którego używasz, nie ma uprawnień do v$sessionwidoku. Musisz poprosić swojego administratora o przyznanie Ci tego przywileju. Najprawdopodobniej chciałbyś mieć select any dictionaryprzywilej, chociaż select_catalog_rolerola lub bezpośrednie nadanie tylko dla tego obiektu również działałoby.
Justin Cave
36

Te sesje parametr jest pochodną procesów parametru i zmienia się odpowiednio w przypadku zmiany liczby procesów max. Więcej informacji można znaleźć w dokumentacji Oracle .

Aby uzyskać tylko informacje o sesjach:

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

Spróbuj tego, aby wyświetlić informacje o obu:

    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
------------- ------------------- --------------- --- --------
przetwarza 96309 500
sesje 104 323 792
FuePi
źródło
34

Myślałem, że to zadziała, opierając się na tym źródle .

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

Jednak Justin Cave ma rację. To zapytanie daje lepsze wyniki:

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
źródło
przepraszam, jak możemy uruchomić to zapytanie? Otrzymuję informację „tabela lub widok nie istnieje” dla „SELECT COUNT (*) FROM v $ session”
wieśniak,
2
@ yin03 Czy używasz bazy danych Oracle lub innego typu? W przypadku Oracle może to być problem z uprawnieniami.
JosephStyons,
1
bezbłędne zapytanie @JosephStyons!
Gaurav
@guarav, cieszę się, że okazało się przydatne!
JosephStyons
4

Uwaga: to tylko odpowiada na część pytania.

Jeśli chcesz tylko poznać maksymalną dozwoloną liczbę sesji, możesz wykonać w sqlplus, jako sysdba:

SQL> show parameter sessions

Daje to wynik podobny do:

    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

Parametr sesji jest tym, czego chcesz.

botkop
źródło
4

Użyj sesji gv $ dla RAC, jeśli chcesz uzyskać całkowitą liczbę sesji w klastrze.

Tomek
źródło
1
select count(*),sum(decode(status, 'ACTIVE',1,0)) from v$session where type= 'USER'
saris mohammad
źródło