So sieht die Meldung aus
ERROR 1040 (08004): Too many connections
SQLSTATE[HY000] [1040] Too many connectionsHäufige Ursachen
- Eine Anwendung öffnet Verbindungen und schließt oder nutzt sie nicht wieder, z. B. ohne Pool oder mit zu vielen Workern.
- Langsame Abfragen oder Sperren halten Verbindungen belegt, neue Anfragen stauen sich dahinter.
- Eine Lastspitze oder eine Bot-Flut lässt eine Web-App viele Verbindungen gleichzeitig öffnen.
- Untätige Verbindungen bleiben zu lange offen, weil
wait_timeouthoch ist. max_connectionsist für die echte Last einfach zu niedrig.
Prüfen
- Aktuelles Limit
mysql -e "SHOW VARIABLES LIKE 'max_connections'" - Wie hoch war es seit dem Start?
mysql -e "SHOW GLOBAL STATUS LIKE 'Max_used_connections'" - Was tun die Verbindungen gerade?
mysql -e 'SHOW FULL PROCESSLIST' - Welcher Benutzer und Host hält die meisten?
mysql -e 'SELECT user, host, COUNT(*) AS n FROM information_schema.processlist GROUP BY user, host ORDER BY n DESC'
Lösung
- Mit einem Admin-Konto anmelden. Der Server hält für Benutzer mit dem nötigen Recht eine Verbindung extra frei, deshalb kommt der root-Account meist noch hinein.
- Die Ursache in der Prozessliste suchen: viele
Sleep-Einträge bedeuten undichte oder untätige Clients, viele lang laufende Abfragen bedeuten langsame Abfragen oder Sperren. - Hängende Sitzungen bei Bedarf mit
KILL id;beenden. Das bricht ab, was sie gerade tun. - Die Anwendung korrigieren: Connection-Pool nutzen, Verbindungen schließen, Anzahl der Worker begrenzen.
- Erst dann das Limit anheben, z. B.
SET GLOBAL max_connections = 300;, und es im Abschnitt[mysqld]der Konfiguration festhalten. Jede Verbindung braucht Speicher, setze es nicht höher, als der RAM zulässt. Ein niedrigereswait_timeoutist auch einen Blick wert.
Häufige Fragen
Ist es sicher, max_connections einfach anzuheben?
Es verdeckt die Ursache und kann zu Speicherdruck und dem OOM-Killer führen. Hebe es maßvoll an und beobachte den Speicher, nachdem du Lecks und langsame Abfragen behoben hast.
Ich komme gar nicht mehr hinein, auch nicht als root.
Verbinde dich als root über den lokalen Socket, der den Extra-Platz nutzt. Klappt auch das nicht, den Dienst neu starten und die Anwendung korrigieren, bevor sie sich wieder verbindet.