2009-07-14 4 views
1

Ich versuche, einen Fehler zu debuggen, den ich auf einem Produktionsserver bekam. Manchmal gibt MySQL auf und meine Webanwendung kann keine Verbindung zur Datenbank herstellen (ich bekomme den Fehler "zu viele Verbindungen"). Der Server verfügt über ein paar tausend Besucher pro Tag und in der Nacht habe ich ein paar Cronjobs renne, die manchmal hat einige schwere mysql Arbeit (Looping bis 50 000 Zeilen, Einfügen und Löschen von Duplikaten usw.)Debug MySQL "zu viele Verbindungen"

  • Der Server läuft beide apache und MySQL auf demselben Rechner
  • MySQL eine ziemlich Standard-basierte Konfiguration (max connections) PHP
  • der Web-App wird mit hat

Wie debuggen ich dieses Problem? Welche Log-Dateien sollte ich lesen? Wie finde ich das "böse" Skript? Das seltsame ist, dass wenn ich den MySQL-Server neu starte, es wieder funktioniert.

Edit:

  • Verschiedene Anwendungen/scripts verschiedene Anschlüsse auf seine Datenbank verwendet (meist Mysqli aber auch Zend_Db)

Antwort

2

Verwenden Sie zuerst innotop (Google es), um Ihre Verbindungen zu überwachen. Es ist hauptsächlich auf InnoDB-Statistiken ausgerichtet, aber es kann darauf gesetzt werden, alle Verbindungen anzuzeigen, einschließlich derer, die nicht in einer Transaktion sind.

Andernfalls sind die folgenden hilfreich: Verwenden Sie permanente Verbindungen/Verbindungspools in Ihren Webanwendungen. Erhöhen Sie Ihre maximalen Verbindungen.

2

Es ist nicht unbedingt eine lang laufende SQL-Abfrage.

Wenn Sie eine Verbindung am Anfang einer Seite öffnen, wird sie erst freigegeben, wenn das PHP-Skript beendet wird - auch wenn keine Abfrage ausgeführt wird.

Sie sollten Ihren Seiten einige Statistiken hinzufügen, um die langsamsten und die am meisten getroffenen herauszufinden. Ein frühes Schließen der Verbindung würde, wenn möglich, helfen.

2

Versuchen Sie mit persistenten Verbindungen (mysql_pconnect), es wird dazu beitragen, die Serverlast zu reduzieren, die durch das ständige Öffnen und Schließen von MySQL-Verbindungen verursacht wird.

0

Der Ausgangspunkt ist wahrscheinlich mysqladmin processlist zu verwenden, um eine Liste der Prozesse auf dem Server MySQL zu erhalten. Der nächste Schritt hängt davon ab, was Sie finden.