Fehler 1040 / 1203 - too many sql connections


Beim Aufruf Ihrer Homepage oder einer Ihrer Unterseiten erscheint die Meldung "too many sql connections"?

Dieser Meldung tritt auf, wenn mehr Verbindungen zur MySQL-Datenbank hergestellt werden, als erlaubt sind. Folgende Konfiguration ist am MySQL-Server eingestellt:

  • MySQL5:
    max_connections: 2560
    max_user_connections: 100
  • MySQL5.7:
    max_connections: 1024
    max_user_connections: keine Begrenzung

Diese Begrenzung ist erforderlich, um eine gleichmäßige Performance für alle Kunden zu gewährleisten und kann daher nicht auf- oder angehoben werden. Es handelt sich auch nicht um eine Sperre, sondern eben um ein Limit, welches ggf. erreicht wurde. Und solange die Anzahl der Verbindungen nicht unter dieses Limit sinkt, sind keine weiteren möglich.

Aber was bedeuten diese Werte?

max_user_connections

Jeder Besucher Ihrer Homepage landet auf einem unserer Server (zur Lastverteilung werden mehrere Server nebeneinander betrieben). Dieser Server führt das jeweilige Skript aus und stellt dabei eine Verbindung zur MySQL-Datenbank her. Dieser Server ist aus Sicht der MySQL-Datenbank ein "User".

Das bedeutet aber nicht, dass jeder Besucher Ihrer Homepage einen "User" auf der Datenbank ausmacht, denn es können sich auch mehrere Besucher auf einem Server gleichzeitig befinden. Dennoch verbindet sich nur ein "User" mit der Datenbank. 

Ein "User" kann aber auch der Zugriff über den im Homepage Center verlinkten PhpMyAdmin, oder der Zugriff per "SSH" sein.

max_connections

Es können mehrere Besucher auf einem Server landen und von dort auf die Datenbank zugreifen. Dabei verwendet jeder Besucher unterschiedliche Abfragen (z. B. welchen Inhalt Ihrer Seite er sich anzeigen lässt, welches Formular der Besucher absendet). Hier baut ein "User" mehrere Verbindungen auf.

Und wie kommt man jetzt an das Limit?

Grundsätzlich besteht eine Verbindung zur Datenbank nur wenige hundertstel Sekunden, unabhängig davon, wie lange ein Besucher auf der Internetseite verweilt. 

Wenn aber eine Datenbankabfrage zu weit gefasst ist, kann die Antwort von der Datenbank länger dauern (Slow Querie). Wenn das mehrfach auftritt, dann finden viele parallele Verbindungen statt. 

Wenn dann das Skript noch so gebaut ist, dass weitere Abfragen erfolgen, die abhängig von einer vorherigen Abfrage sind, kann es zu "Deadlocks" kommen. In der Folge bleibt eine Verbindung so lange offen, bis diese durch ein Timeout beendet wird.

Was kann man dagegen machen?

Den Quellcode optimieren. Nur durch eine effizientere Programmierung lässt sich dieser Fehler im Skript dauerhaft beheben. Achten Sie beispielsweise darauf, dass geöffnete Verbindungen zur Datenbank auch wieder geschlossen werden, wenn sie nicht mehr benötigt werden.