Wie überprüfe ich die maximal zulässige Anzahl von Verbindungen zu einer Oracle-Datenbank?

89

Wie kann mit SQL am besten die maximale Anzahl von Verbindungen überprüft werden, die für eine Oracle-Datenbank zulässig sind? Am Ende möchte ich die aktuelle Anzahl der Sitzungen und die zulässige Gesamtzahl anzeigen, z. B. "Derzeit werden 23 von 80 Verbindungen verwendet".

Niklas Gustavsson
quelle

Antworten:

120

Bei der Bestimmung der Anzahl der von einer Oracle-Datenbank unterstützten Verbindungen können verschiedene Einschränkungen auftreten. Der einfachste Ansatz wäre die Verwendung des SESSIONS-Parameters und von V $ SESSION, d. H.

Die Anzahl der Sitzungen, für die die Datenbank konfiguriert wurde

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

Die Anzahl der aktuell aktiven Sitzungen

SELECT COUNT(*)
  FROM v$session

Wie ich bereits sagte, gibt es jedoch sowohl auf Datenbankebene als auch auf Betriebssystemebene und abhängig davon, ob ein gemeinsam genutzter Server konfiguriert wurde, andere potenzielle Einschränkungen. Wenn der gemeinsam genutzte Server ignoriert wird, können Sie möglicherweise das Limit des Parameters PROCESSES erreichen, bevor Sie das Limit des Parameters SESSIONS erreichen. Möglicherweise stoßen Sie an die Betriebssystemgrenzen, da für jede Sitzung eine bestimmte Menge RAM erforderlich ist.

Justin Cave
quelle
Entschuldigung, wie können wir diese Abfrage ausführen? Ich erhalte "Tabelle oder Ansicht nicht vorhanden" für "SELECT COUNT (*) FROM v $ session"
Dorfbewohner
3
@ yin03 - Dies bedeutet, dass der von Ihnen verwendete Oracle-Benutzer keine Berechtigungen für die v$sessionAnsicht hat. Sie müssen Ihren DBA bitten, Ihnen dieses Privileg zu gewähren. Höchstwahrscheinlich möchten Sie das select any dictionaryPrivileg, obwohl die select_catalog_roleRolle oder eine direkte Gewährung nur für dieses Objekt ebenfalls funktionieren würde.
Justin Cave
35

Die Sitzungen Parameter aus der abgeleitet Prozesse Parameter und ändert sich entsprechend , wenn Sie die Anzahl der max Prozesse ändern. Weitere Informationen finden Sie in den Oracle-Dokumenten .

So erhalten Sie nur die Informationen zu den Sitzungen:

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

Versuchen Sie dies, um Informationen zu beiden anzuzeigen:

    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
------------- ------------------- --------------- --- --------
verarbeitet 96 309 500
Sitzungen 104 323 792
FuePi
quelle
34

Ich dachte, das würde funktionieren, basierend auf dieser Quelle .

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 hat jedoch recht. Diese Abfrage liefert bessere Ergebnisse:

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
quelle
Entschuldigung, wie können wir diese Abfrage ausführen? Ich erhalte "Tabelle oder Ansicht nicht vorhanden" für "SELECT COUNT (*) FROM v $ session"
Dorfbewohner
2
@ yin03 Verwenden Sie Oracle oder einen anderen Datenbanktyp? Bei Oracle liegt möglicherweise ein Berechtigungsproblem vor.
JosephStyons
1
fehlerfreie Abfrage @JosephStyons!
Gaurav
@guarav, ich bin froh, dass du es nützlich fandest!
JosephStyons
4

Hinweis: Dies beantwortet nur einen Teil der Frage.

Wenn Sie nur die maximal zulässige Anzahl von Sitzungen wissen möchten, können Sie in sqlplus Folgendes ausführen: sysdba:

SQL> show parameter sessions

Dies gibt Ihnen eine Ausgabe wie:

    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

Der Sitzungsparameter ist derjenige, den Sie möchten.

botkop
quelle
4

Verwenden Sie gv $ session für RAC, wenn Sie die Gesamtzahl der Sitzungen im Cluster ermitteln möchten.

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