wake-up-neo.com

MySQL-Fehler "Zu viele Verbindungen"

Ich verwende MySQL 5.0 für eine Site, die von GoDaddy (Linux) gehostet wird. 

Ich habe ein paar Tests mit meiner Web-App durchgeführt und plötzlich bemerkte ich, dass die Seiten wirklich langsam aktualisiert wurden. Nach langem Warten kam ich schließlich zu einer Seite, auf der etwas wie "MySQL-Fehler, zu viele Verbindungen ..." stand, und sie zeigte auf meine config.php-Datei, die eine Verbindung zur Datenbank herstellt.

Ich habe gerade mit der Datenbank verbunden, keine anderen Benutzer. Auf jeder meiner Seiten füge ich oben die Datei config.php ein und schließe die mysql-Verbindung am Ende der Seite. Es können mehrere Abfragen dazwischen sein. Ich befürchte, dass ich mysql-Verbindungen nicht genug schließe (mysql_close ()).

Wenn ich jedoch versuche, sie nach dem Ausführen einer Abfrage zu schließen, erhalte ich Verbindungsfehler auf der Seite. Meine Seiten sind PHP und HTML. Wenn ich versuche, eine Abfrage zu schließen, scheint die nächste keine Verbindung herzustellen. Muss ich nach dem Schließen die config.php erneut einbinden, um eine Verbindung herzustellen?

Dieser Fehler hat mir Angst gemacht, denn in zwei Wochen beginnen etwa 84 Personen mit dieser Webanwendung.

Vielen Dank.

BEARBEITEN:

Hier ist ein Pseudo-Code meiner Seite:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

Ich dachte mir, dass auf diese Weise jedes Mal, wenn die Seite geöffnet wird, die Verbindung geöffnet wird und die Verbindung dann geschlossen wird, wenn die Seite vollständig geladen ist. Die Verbindung wird dann wieder geöffnet, wenn jemand auf eine Schaltfläche auf der Seite klickt usw.

BEARBEITEN:

Okay, ich habe gerade mit GoDaddy telefoniert. Anscheinend bin ich mit meinem Sparpaket auf 50 Verbindungen gleichzeitig begrenzt. Während mein Problem heute nur bei mir auftrat, als ich auf die Website zugegriffen habe, gaben sie an, dass sie zuvor einige Serverprobleme hatten. In Anbetracht dessen, wie ich 84 Benutzer für meine Web-App haben werde, sollte ich wahrscheinlich auf "Deluxe" upgraden, was 100 Verbindungen gleichzeitig zulässt. An einem bestimmten Tag können etwa 30 Benutzer gleichzeitig auf meine Website zugreifen. Ich denke, die 100 sind sicherer. Seid ihr euch einig?

20
littleK

Shared-Hosting-Anbieter erlauben im Allgemeinen eine relativ kleine Anzahl gleichzeitiger Verbindungen für denselben Benutzer.

Was Ihr Code tut, ist:

  • öffnen Sie eine Verbindung zum MySQL-Server
  • mach es (Seite generieren)
  • schließen Sie die Verbindung am Ende der Seite.

Der letzte Schritt am Ende der Seite ist nicht obligatorisch : (unter Angabe von mysql_close manuell):

Die Verwendung von mysql_close () ist normalerweise nicht erforderlich, da nicht persistente offene Links am Ende der Skriptausführung automatisch geschlossen werden.

Aber beachten Sie, dass Sie wahrscheinlich sowieso keine dauerhaften Verbindungen verwenden sollten ...

Zwei Tipps:

  • benutze _mysql_connect_ statt _mysql_pconnect_ (für dich schon OK)
  • Setzen Sie den vierten Parameter von mysql_connect auf false (für Sie bereits OK, da dies der Standardwert ist) : (unter Bezugnahme auf das Handbuch):

Wenn ein zweiter Aufruf von mysql_connect () mit denselben Argumenten erfolgt, wird keine neue Verknüpfung hergestellt, sondern die Verknüpfungskennung der bereits geöffneten Verknüpfung zurückgegeben.

Der Parameter new_link ändert dieses Verhalten und bewirkt, dass mysql_connect () immer einen neuen Link öffnet, selbst wenn mysql_connect () zuvor mit denselben Parametern aufgerufen wurde.



Was könnte dann das Problem verursachen?

Möglicherweise versuchen Sie, auf mehrere Seiten gleichzeitig zuzugreifen (z. B. mit mehreren Registerkarten in Ihrem Browser) , wodurch mehrere Benutzer gleichzeitig die Website verwenden?

Wenn Sie viele Benutzer gleichzeitig auf der Site haben und der Code zwischen _mysql_connect_ und dem Schließen der Verbindung viel Zeit in Anspruch nimmt, bedeutet dies, dass viele Verbindungen gleichzeitig geöffnet sind ... und Sie werden Erreiche das Limit :

Da Sie der einzige Benutzer der Anwendung sind und bis zu 200 Verbindungen gleichzeitig zugelassen sind, ist dennoch etwas Merkwürdiges im Gange ...



Nun, wenn man über " zu viele Verbindungen " und "_max_connections_" nachdenkt ...

Wenn ich mich richtig erinnere, begrenzt _max_connections_ nicht die Anzahl der Verbindungen , die Sie zum MySQL-Server öffnen können, aber die Gesamtzahl der Verbindungen , die zu diesem Server geöffnet werden können , wenn eine Verbindung hergestellt wird .

Zitieren der MySQL-Dokumentation zu --- (Zu viele Verbindungen :

Wenn Sie beim Versuch, eine Verbindung zum mysqld-Server herzustellen, den Fehler "Zu viele Verbindungen" erhalten, bedeutet dies, dass alle verfügbaren Verbindungen von anderen Clients verwendet werden.

Die Anzahl der zulässigen Verbindungen wird von der Systemvariablen max_connections gesteuert. Der Standardwert ist 100. Wenn Sie mehr Verbindungen unterstützen müssen, sollten Sie einen größeren Wert für diese Variable festlegen.

Das Problem liegt also möglicherweise nicht bei Ihnen und auch nicht bei Ihrem Code (der eigentlich in Ordnung aussieht) : Es könnte "nur" sein, dass Sie nicht der einzige sind, der versucht, eine Verbindung herzustellen an diesen MySQL-Server (denken Sie daran, "Shared Hosting") , und dass zu viele Benutzer gleichzeitig damit arbeiten ...

... Und wenn ich Recht habe und es das ist , gibt es nichts, was Sie tun können, um das Problem zu lösen: Solange es zu viele Datenbanken gibt/Benutzer auf diesem Server und dass _max_connection_ auf 200 eingestellt ist, werden Sie weiterhin leiden ...


Als Randbemerkung: Bevor ich zu GoDaddy zurückkehre und sie danach frage, wäre es schön, wenn jemand bestätigen könnte, was ich gerade gesagt habe ^^

31
Pascal MARTIN

Ich hatte ungefähr 18 Monate damit zu tun ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/ )

Die Lösungen, die ich hatte (die für Sie gelten würden) waren am Ende:

  1. stimmen Sie die Datenbank gemäß MySQLTuner ab.
  2. defragmentieren Sie die Tabellen wöchentlich basierend auf diesem post .

Bash-Skript aus dem Posting defragmentieren:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done
3
icc97

Wenn Sie über Shell-Zugriff verfügen, verwenden Sie netstat, um zu sehen, wie viele Sockets für Ihre Datenbank geöffnet sind und woher sie stammen.

Geben Sie unter Linux Folgendes ein:

netstat -n -a |grep 3306

Geben Sie unter Windows Folgendes ein:

netstat -n -a |findstr 3306

Sind Sie absolut sicher, dass der Datenbankserver vollständig für Sie bestimmt ist?

Melden Sie sich als root bei der Datenbank an und verwenden Sie "SHOW PROCESSLIST", um zu sehen, wer verbunden ist. Hängen Sie dies idealerweise in Ihr Überwachungssystem ein, um zu sehen, wie viele Verbindungen im Laufe der Zeit bestehen, und wenn zu viele Verbindungen vorhanden sind.

Die maximalen Datenbankverbindungen können in my.cnf konfiguriert werden. Achten Sie jedoch darauf, dass nicht genügend Speicher oder Adressraum zur Verfügung steht.

2
MarkR

Stellen Sie sicher, dass Sie keine dauerhaften Verbindungen verwenden. Dies ist normalerweise eine schlechte Idee.

Wenn Sie das haben, müssen Sie höchstens so viele Verbindungen wie Apache-Prozesse unterstützen. Können Sie die Einstellung von max_connections ändern?

2
Evert

Die Lösung könnte eine davon sein, ich bin in einem MCQA-Test darauf gestoßen, auch wenn ich nicht wusste, welcher der richtige ist!

Setze dies in my.cnf "set-variable = max_connections = 200"

Führen Sie den Befehl "SET GLOBALmax_connections = 200" aus.

Verwenden Sie immer die Funktion mysql_connect (), um eine Verbindung zum mysql-Server herzustellen

Verwenden Sie immer die Funktion mysql_pconnect (), um eine Verbindung zum mysql-Server herzustellen

1
Nitesh

Folgende Lösungen sind möglich:

1) Erhöhen Sie die maximale Verbindungseinstellung, indem Sie die globale Variable in mysql festlegen.

set global max_connection=200;

Hinweis: Dies erhöht die Serverlast.

2) Leere deinen Verbindungspool wie folgt:

FLUSH HOSTS; 

3) Überprüfen Sie Ihre Prozessliste und beenden Sie die Prozessliste, wenn Sie keine davon möchten.


Sie können das verweisen: - 

Artikel Link

0
dilraj singh