So beheben Sie zu viele Verbindungen und schwerwiegende Fehler in MySQL, das auf vps ausgeführt wird


9

Ich führe eine Anwendungs-PHP-Liste auf meinem Linode-Server aus und führe gleichzeitig 12 PHP-Skripte aus, von denen jedes eine MySQL-Verbindung öffnet. Wenn ich jetzt auf PHPlist zugreife, wird häufig der folgende Fehler angezeigt:

Schwerwiegender Fehler: Der Server ist derzeit leider zu ausgelastet. Versuchen Sie es später erneut.

Wenn ich versuche, auf phpMyAdmin zuzugreifen, wird ein Fehler # 1040 angezeigt. Die Ausgabe meiner PHP-Skripte, die cronJobs durchlaufen , zeigt:

PHP Warnung: mysqli_connect (): (HY000 / 1040): Zu viele Verbindungen

Ich verwende den LAMP-Stack auf dem Server mit phpMyAdmin. Die topAusgabe im Terminal zeigt die mysqldVerwendung von 100-130% CPU. Wenn ich versuche, dieses Problem zu beheben, habe ich einige Hinweise erhalten:

  • Erhöhen Sie die Variable max_connection: Ich verwende 200 (standardmäßig 100).
  • Offener Tabellencache: 512 (standardmäßig 400)

Es müssen viele Variablen festgelegt werden, aber ich kann nicht bestimmen, welche spezifisch sind. Ich erhalte einige Referenzen von: zu vielen Verbindungen und http://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Aber je nach meiner Verwendung, wie man den Speicher erhöht und was der maximale Speicher ist, fällt es mir schwer.

Auf meinem Server verwende ich ungefähr 12 PHP-Skripte, eine PHPlist-Anwendung zum Senden von E-Mails und eine wichtige Datenbank für Benutzerregistrierungen.

Bitte helfen Sie mir, dieses Problem zu lösen.

Antworten:


12

Zuerst müssen Sie diese Abfrage ausführen:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Dadurch werden alle Benutzer aufgelistet , die über die Berechtigung SUPER verfügen . Die meisten Benutzer, die eine anwendungsbezogene DB-Verarbeitung durchführen, benötigen diese Berechtigung nicht. Laut der MySQL-Dokumentation können Personen mit SUPER-Berechtigungen Folgendes tun:

  • Führen Sie CHANGE MASTER TO aus, um die Replikationskoordinaten zu steuern
  • TÖTEN oder mysqladmin killThreads anderer Konten beenden
  • PINGE BINARY LOGS zum systematischen Löschen von Binärprotokollen
  • Nehmen Sie Konfigurationsänderungen mit SET GLOBAL vor, um globale Systemvariablen zu ändern
  • mysqladmin Debug-Befehl
  • Aktivieren oder Deaktivieren der Protokollierung
  • Aktualisierungen durchführen, auch wenn die Systemvariable * read_only * aktiviert ist
  • Starten und Stoppen der Replikation auf Slave-Servern
  • Angabe eines beliebigen Kontos im DEFINER-Attribut gespeicherter Programme und Ansichten
  • HIER IST DAS WICHTIGSTE FÜR IHR PROBLEM :: Ermöglicht Ihnen die Verbindung (einmal), auch wenn das von der Systemvariablen max_connections gesteuerte Verbindungslimit erreicht ist.

Sie müssen sich als root @ localhost anmelden und das SUPER-Privileg wie folgt widerrufen:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Sobald Sie dies getan haben, root@localhostkönnen sich nur Benutzer anmelden , wenn alle Benutzer MySQL-Verbindungen überfluten . Wenn jeder und seine Großmutter das SUPER-Privileg hätten, würde dies schließlich verhindern, dass sie sich root@localhostjemals vor allen anderen verbinden. Wenn max_connections bei 200 liegt und Sie es auf 300 erhöhen müssen, ohne mysqld neu starten zu müssen, können Sie die max_connections mit diesem Befehl dynamisch erhöhen :

mysql> SET GLOBAL max_connections = 300;

Dadurch werden sofort mehr Verbindungen wirksam, aber erhöhen Sie die Anzahl nicht einfach willkürlich aus einer Laune heraus. Sie müssen sicherstellen, dass MySQL über genügend RAM verfügt, um die Erhöhung zu berücksichtigen.

CAVEAT: Wenn Sie max_connections dynamisch auf 300 ändern, geben Sie es bitte in /etc/my.cnf ein

[mysqld]
max_connections=300

Sie können mysqltuner.pl auf Ihrem MySQL DB Server ausführen. Wenn Sie es nicht haben, führen Sie Folgendes aus:

cd
wget mysqltuner.pl
perl mysqltuner.pl

Die 3. Zeile unter Leistungsmetriken enthält dies

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

Sehen Sie die 5,4 Millionen pro Thread? Das wird mit max_connections multipliziert. In diesem Beispiel wären das maximal etwa 10,8 GB RAM. Daher sollten Sie jedes Mal, wenn Sie max_connections aufrufen, mysqltuner.pl ausführen und prüfen, ob Sie das Betriebssystem für zu viel Speicher drücken.

In jedem Fall bietet die Einschränkung, wer über SUPER-Berechtigungen verfügt, diesen Benutzern die Möglichkeit, das Überfluten von mysqld mit DB Connections zu verringern.


Ich erhalte diesen Fehler beim Versuch von perl mysqltuner.pl "Es wurde versucht, Anmeldeinformationen vom Debian-Wartungskonto zu verwenden, aber sie sind fehlgeschlagen."
Shashank

Ich versuche dies auf meinem lokalen Ubuntu-Server, es zeigt maximale Speicherauslastung, aber auf meinem vps zeigt es Fehler und ich kann mich nicht in phpmyadmin anmelden, aber erfolgreich in MySQL-Terminal anmelden
Shashank

Dieses cmd wget mysqltuner.plhat index.html heruntergeladen, aber es war eine Perl-Datei, also habe ich es in mysqltuner.pl umbenannt und das nächste cmd hat perl mysqltuner.plfunktioniert.
MotsManish

2
  1. Die globale Variable max_connectionsbestimmt die maximale Anzahl gleichzeitiger Verbindungen zu MySQL. Stellen Sie sicher, dass Sie einen hohen Wert für diese Variable haben. Sie können diesen Wert auf 300 oder 400 erhöhen und versuchen, MySQL nach diesen Einstellungen neu zu starten.
  2. Entwerfen Sie Ihre Anwendung so, dass eine MySQL-Verbindung für einen sehr kurzen Zeitraum offen bleibt.
  3. Sie sollten auch überprüfen, ob der Clientcode keine dauerhaften Verbindungen (wie z. B. mysql_pconnect ()) nicht ordnungsgemäß verwendet.

Flush status;Führen Sie auch den Befehl auf dem MySQl-Server aus, um diesen Wert zu verringern.

Ich hoffe diese Vorschläge helfen.


0

Überprüfen Sie, ob Ihre Festplatte voll ist. Dies kann denselben Fehler verursachen:

df -h

Um Ihnen den verbleibenden Speicherplatz auf jeder Partition anzuzeigen, müssen Sie wahrscheinlich die Root-Partition überprüfen /(oder / var /, falls Sie eine zusätzliche Partition dafür haben):

df -h /
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.