it-swarm.com.de

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

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 cron Jobs ausführen, zeigt:

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

Ich verwende den LAMP-Stack auf dem Server mit phpMyAdmin. Die Ausgabe top im Terminal zeigt mysqld mit 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 viele 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, PHPlist-Anwendung zum Senden von E-Mails und eine wichtige Datenbank für Benutzerregistrierungen.

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

9
Shashank

Zuerst müssen Sie diese Abfrage ausführen:

SELECT user,Host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',Host) <> '[email protected]';

Dies listet alle Benutzer auf, die SUPER Privileg haben. Die meisten Benutzer, die eine anwendungsbezogene DB-Verarbeitung durchführen, benötigen diese Berechtigung nicht. Gemäß MySQL Documentation können Personen mit SUPER-Berechtigungen Folgendes tun:

  • Führen Sie CHANGE MASTER TO aus, um die Replikationskoordinaten zu steuern
  • KILL oder mysqladmin kill um Threads zu beenden, die zu anderen Konten gehören
  • 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 IS DAS WICHTIGSTE FÜR IHR PROBLEM: : Ermöglicht es Ihnen, eine Verbindung (einmal) herzustellen, auch wenn das Verbindungslimit erreicht ist gesteuert durch die Systemvariable max_connections wird erreicht.

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) <> '[email protected]';
FLUSH PRIVILEGES;

Sobald Sie dies tun und nur alle Benutzer MySQL-Verbindungen überfluten, wird nur [email protected] kann sich anmelden. Wenn jeder und seine Großmutter das SUPER-Privileg hätten, würde dies schließlich [email protected] davor, sich jemals vor allen anderen zu 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 max_connections dynamisch erhöhen mit diesem Befehl:

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 genug RAM hat, 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.

12
RolandoMySQLDBA
  1. Die globale Variable max_connections bestimmt 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 (z. B. mysql_pconnect ()) nicht ordnungsgemäß verwendet.

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

Ich hoffe diese Vorschläge helfen.

2
Mahesh Patil

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

df -h

wird Ihnen der verbleibende Speicherplatz auf jeder Partition angezeigt, müssen Sie wahrscheinlich die Root-Partition überprüfen / (oder/var/falls Sie eine zusätzliche Partition dafür haben):

df -h /
0
rubo77