Was sind "viele aufeinanderfolgende unterbrochene Verbindungsanforderungen" in MySQL?

8

Ich habe regelmäßig folgenden Fehler:

PHP Fataler Fehler: Uncaught Ausnahme 'PDOException' mit Nachricht 'SQLSTATE [HY000] [1129] Host' MY SERVER 'ist wegen vieler Verbindungsfehler blockiert; Entsperre mit 'mysqladmin flush-hosts'

Es ist einfach, das Problem mit einem regulären Befehl (wie crontab) mysqladmin flush-hosts zu lösen oder die Systemvariable max_connect_errors zu erhöhen, wie in hier .

ABER! Was sind " viele aufeinander folgende unterbrochene Verbindungsanforderungen ", warum passiert das?

Ich würde das Problem lieber stromaufwärts verhindern, anstatt die Blockierung zu korrigieren.

MySQL-Version: 5.5.12. Ich benutze Zend Framework 1.11.10 und Doctrine 2.1.6.

In meinem PHP-Code gibt es weder mysql_close () noch mysqli_close ().

max_connect_errors hat den Standardwert 10, und ich möchte es noch nicht erhöhen, ich möchte verstehen, warum ich die Fehler habe. Ich benutze alle 5 Minuten einen Cron, der einen mysqladmin flush-hosts-Befehl ausführt.

    
Alatar 03.08.2012, 07:23
quelle

2 Antworten

1

Diese Antwort ist vom Entwurf her eine Sicherheitsmaßnahme und resultiert aus dem Erreichen des Werts max_connection_errors für mysql. Hier ist ein Link , der von Oracle zur Verfügung gestellt wird beschreibt die meisten möglichen Ursachen und Lösungen.

Letztendlich bedeutet dies, dass es so viele aufeinander folgende Verbindungsfehler gibt, dass MySql nicht mehr auf Verbindungsversuche reagiert.

  

Ich benutze alle 5 Minuten einen Cron, der einen mysqladmin flush-hosts macht   Befehl.

Da Sie diese Grenze so schnell erreichen, gibt es nur wenige mögliche Täter:

  1. Der Server ist nicht korrekt für die Verwendung von PDO konfiguriert.
  2. Laufender Code enthält sehr häufig neue Verbindungen.
    • Der Wert max_connections wird schnell erreicht, was dazu führt, dass alle nachfolgenden Verbindungsversuche fehlschlagen ... und somit schnell die Grenze max_connection_errors erreicht wird.
  3. Der Code trifft eine Endlosschleife oder einen Kaskadenfehler.
    • Offensichtliche Möglichkeit, muss aber erwähnt werden.
    • (d. h. pageA ruft pageB und pageC auf und pageC ruft PageA)
    • auf
  4. PDO läuft gut, aber einige Skripte brauchen viel Zeit, um zu laufen oder nie zu enden.
    • Der einfachste Weg, dies zu erkennen, ist die max_execution_time .

Es ist wahrscheinlich, dass dies in jedem Fall schwierig zu finden ist.

  1. Protokollieren Sie einen Stack-Trace von jedem mysql-Verbindungsversuch, um herauszufinden, welcher Code das verursacht.
  2. Überprüfen Sie die mysql.err-Protokolldatei

Während PDO nicht explizit das Schließen von mysql-Verbindungen erfordert, gibt es in solchen Fällen einige Praktiken, die solche ServerAdmin-Hunts verhindern können.

  • Schließen Sie mysql-Verbindungen immer explizit.
    • Erstellen Sie eine einfache Klasse , um alle Verbindungen zu verwalten. Öffnen, Array zurückgeben, schließen.
    • Die einzige Zeit, die Sie brauchen, um eine Verbindung offen zu halten, ist für Cursor.
  • Definieren Sie immer Verbindungsargumente in einer einzigen Datei, die überall enthalten ist, wo sie benötigt wird.
  • Erhöhen Sie niemals max_execution_time , es sei denn, Sie wissen, dass Sie sie benötigen, und Sie wissen, dass der Server damit umgehen kann. IF Wenn Sie es brauchen, erhöhen Sie den Wert explizit nur für das Skript, das es benötigt. php.net/manual/en/function.set-time-limit.php
    • Wenn Sie max_execution_time erhöhen, erhöhen Sie max_connections .

dev.mysql.com/doc/refman/5.0/en/cursors.html

    
Tony Chiboucas 10.08.2012 06:39
quelle
0

Dies bedeutet, dass mysqld viele Verbindungsanforderungen vom angegebenen Host erhalten hat, die in der Mitte unterbrochen wurden. Weitere Informationen finden Sie in diesem Link in der Dokumentation.

    
hanleyhansen 03.08.2012 13:50
quelle

Tags und Links