Der MySQL-Fehler „Too many con­nec­tions“ (oder „Zu viele Ver­bin­dun­gen“) erscheint, wenn die zulässige Höchst­zahl gleich­zei­ti­ger Ver­bin­dun­gen zum Server über­schrit­ten wird. Jeder aktive Client ver­braucht eine Ver­bin­dung, und sobald das Limit erreicht ist, können keine neuen Ver­bin­dun­gen mehr her­ge­stellt werden. Häufige Ursachen sind viele parallel laufende Abfragen, nicht korrekt ge­schlos­se­ne Ver­bin­dun­gen oder ein zu niedrig ein­ge­stell­ter max_connections-Wert auf dem Server.

Wie kommt es in MySQL/MariaDB zu dem Fehler „Too many con­nec­tions“?

Eine Datenbank kann nur eine be­schränk­te Anzahl an Anfragen gleich­zei­tig ver­ar­bei­ten. Wird dieser Ma­xi­mal­wert über­schrit­ten, zeigen MySQL oder MariaDB Ihnen die Feh­ler­mel­dung „Too many con­nec­tions” an. Dies ist bei­spiels­wei­se der Fall, wenn ein PHP-Skript zu viele gleich­zei­ti­ge Ver­bin­dun­gen zu der re­la­tio­na­len Datenbank aufbauen möchte. Auch, wenn Sie eine Web­an­wen­dung haben, die eine MySQL-Datenbank verwendet, ist es möglich, dass bei sehr starker Nachfrage der MySQL-Error „Zu viele Ver­bin­dun­gen“ auftritt.

HiDrive Cloud-Speicher
Ihr sicherer Online-Speicher
  • Daten zentral speichern, teilen und be­ar­bei­ten
  • Ser­ver­stand­ort Deutsch­land (ISO 27001-zer­ti­fi­ziert)
  • Höchste Da­ten­si­cher­heit im Einklang mit der DSGVO

„Zu viele Ver­bin­dun­gen”: So beheben Sie den MySQL-/MariaDB-Fehler

Es gibt ver­schie­de­ne Ansätze, um den Fehler „Too many con­nec­tions“ in MySQL zu beheben, je nachdem, wo genau das Problem liegt. Nach­fol­gend werden die gän­gigs­ten Lö­sungs­we­ge aus­führ­lich erklärt.

Lösung 1: Eine neue maximale Anzahl von Ver­bin­dun­gen auswählen

Die Sys­tem­va­ria­ble max_connections bestimmt die Anzahl der Ver­bin­dun­gen, die MySQL/MariaDB ak­zep­tiert. Der Stan­dard­wert ist 151 Ver­bin­dun­gen, was 150 normale Ver­bin­dun­gen plus eine Ver­bin­dung aus dem SUPER-Konto er­mög­licht. SUPER ist ein MySQL-Privileg, das dem User Ad­min­rech­te zuteilt.

Als Erstes muss ent­schie­den werden, welchen neuen Ma­xi­mal­wert Sie für max_connections ein­stel­len möchten. Es gibt mehrere Über­le­gun­gen, die bei der Erhöhung der Anzahl der MySQL/MariaDB-Ver­bin­dun­gen zu be­rück­sich­ti­gen sind. Die maximale Anzahl, die vom System un­ter­stützt werden kann, hängt von folgenden Faktoren ab:

  • Die Menge des ver­füg­ba­ren Ar­beits­spei­chers (RAM)
  • Wie viel RAM jede Ver­bin­dung benötigt (einfache Abfragen benötigen weniger RAM als ar­beits­in­ten­si­ve­re Ver­bin­dun­gen)
  • Die ak­zep­ta­ble Re­ak­ti­ons­zeit

Laut der MySQL-Do­ku­men­ta­ti­on sollten die meisten Linux-Systeme 500 bis 1.000 Ver­bin­dun­gen pro­blem­los un­ter­stüt­zen können.

Dau­er­haf­te Anpassung von max_connections

Um die Variable max_connections dauerhaft an­zu­pas­sen, müssen Sie die my.cnf- oder die my.ini-Datei ak­tua­li­sie­ren.

Öffnen Sie die Datei /etc/my.cnf zur Be­ar­bei­tung mit dem Befehl:

sudo nano /etc/my.cnf

Direkt unter der ersten Zeile sehen Sie folgenden Eintrag:

[mysqld]

Fügen Sie einen neuen Eintrag hinzu:

max_connections=[desired new maximum number]

Temporäre Anpassung von max_connections

Um die Anzahl der maximalen Ver­bin­dun­gen temporär und nur für die laufende Ver­bin­dung zu ändern, können Sie in der MySQL-Konsole folgenden Befehl ausführen:

SET GLOBAL max_connections = [desired new maximum number];

Die Anpassung ist so lange gültig, bis der SQL-Server neu gestartet wird.

Lösung 2: Nicht ver­wen­de­te Ver­bin­dun­gen schließen

Ein weiterer häufiger Grund für den Fehler „Too many con­nec­tions“ ist, dass An­wen­dun­gen Da­ten­bank­ver­bin­dun­gen nicht ord­nungs­ge­mäß schließen. Jede offene Ver­bin­dung belegt einen Slot in MySQL oder MariaDB, und wenn Ver­bin­dun­gen nicht frei­ge­ge­ben werden, kann der Server schnell die maximal erlaubte Anzahl erreichen.

In PHP sollten Sie daher nach der Nutzung einer Ver­bin­dung immer mysqli_close($connection) aufrufen, sobald die Abfragen ab­ge­schlos­sen sind. In Python sollte das Pendant connection.close() genutzt werden. Node.js-An­wen­dun­gen sollten connection.end() verwenden.

Ein weiterer bewährter Ansatz ist der Einsatz von so­ge­nann­ten Con­nec­tion Pools. Hierbei wird eine fest­ge­leg­te Anzahl an Da­ten­bank­ver­bin­dun­gen zentral verwaltet und wie­der­ver­wen­det, anstatt bei jeder Anfrage eine neue Ver­bin­dung zu öffnen. Das reduziert nicht nur die Belastung des Servers, sondern erhöht auch die Per­for­mance, da Ver­bin­dungs­er­stel­lung und -abbau Zeit kostet.

Lösung 3: Timeout für Ver­bin­dun­gen anpassen

Eine weitere effektive Methode, um den Fehler „Too many con­nec­tions“ zu vermeiden, besteht darin, die maximale Le­bens­dau­er inaktiver Ver­bin­dun­gen zu begrenzen. Stan­dard­mä­ßig hält MySQL/MariaDB inaktive Ver­bin­dun­gen für einen relativ langen Zeitraum offen, selbst wenn sie keine Abfragen mehr ausführen. Jede dieser inaktiven Ver­bin­dun­gen belegt jedoch weiterhin einen Slot.

Die Sys­tem­va­ria­blen wait_timeout und interactive_timeout bestimmen, wie lange inaktive Ver­bin­dun­gen bestehen bleiben, bevor sie au­to­ma­tisch vom Server beendet werden. wait_timeout gilt für normale Ver­bin­dun­gen, während interactive_timeout für Ver­bin­dun­gen von in­ter­ak­ti­ven Clients, wie der MySQL-Konsole, verwendet wird. Durch das Re­du­zie­ren dieser Werte werden „hängende“ Ver­bin­dun­gen schneller frei­ge­ge­ben.

Dau­er­haf­te Anpassung

Die Anpassung kann dauerhaft in der Kon­fi­gu­ra­ti­ons­da­tei my.cnf oder my.ini erfolgen. Öffnen Sie diese hierzu und suchen Sie folgenden Eintrag:

[mysqld]

Fügen Sie folgende Zeilen ein:

wait_timeout=120
interactive_timeout=120

Damit stellen Sie sicher, dass inaktive Ver­bin­dun­gen nicht unnötig lange Res­sour­cen blo­ckie­ren.

Temporäre Anpassung

Diese Anpassung kann auch temporär über die MySQL-Konsole erfolgen. Dann gilt die Ver­än­de­rung nur für die laufende Ver­bin­dung und die Werte werden nach Neustart des SQL-Servers wieder zu­rück­ge­setzt.

SET GLOBAL wait_timeout=120;
SET GLOBAL interactive_timeout=120;
Zum Hauptmenü