web-dev-qa-db-fra.com

Erreur MySQL "Trop de connexions"

J'utilise MySQL 5.0 pour un site hébergé par GoDaddy (linux). 

Je faisais quelques essais sur mon application Web et, tout à coup, j'ai remarqué que les pages rafraîchissaient très lentement. Finalement, après une longue attente, je suis arrivé à une page qui disait quelque chose comme "Erreur MySQL, trop de connexions ...", et cela pointait vers mon fichier config.php qui se connecte à la base de données.

Cela vient de me connecter à la base de données, aucun autre utilisateur. Sur chacune de mes pages, j'inclus le fichier config.php en haut et ferme la connexion mysql à la fin de la page. Il peut y avoir plusieurs requêtes entre les deux. Je crains de ne pas fermer suffisamment les connexions mysql (mysql_close ()).

Cependant, lorsque j'essaie de les fermer après avoir exécuté une requête, je reçois des erreurs de connexion sur la page. Mes pages sont PHP et HTML. Lorsque j'essaie de fermer une requête, il semble que la suivante ne se connecte pas. Devrais-je inclure config.php à nouveau après la fermeture pour pouvoir me connecter?

Cette erreur m'a fait peur car en deux semaines, environ 84 personnes ont commencé à utiliser cette application Web.

Merci.

MODIFIER:

Voici un pseudo-code de ma page:

 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(); ?>

J'ai pensé que de cette façon, chaque fois que la page s'ouvre, la connexion s'ouvre, puis la connexion se ferme lorsque le chargement de la page est terminé. Ensuite, la connexion s'ouvre à nouveau lorsque quelqu'un clique sur un bouton de la page, et ainsi de suite ...

MODIFIER:

D'accord, je viens d'avoir GoDaddy au téléphone. Apparemment, avec mon forfait économique, je suis limité à 50 connexions à la fois. Alors que mon problème aujourd'hui ne concernait que mon accès au site, ils ont dit qu'ils avaient eu des problèmes de serveur plus tôt. Cependant, vu que je vais avoir 84 utilisateurs pour mon application web, je devrais probablement passer à "Deluxe", ce qui permet 100 connexions à la fois. Chaque jour, environ 30 utilisateurs accèdent à mon site à la fois. Je pense donc que le nombre de 100 serait un pari plus sûr. Êtes-vous d'accord?

20
littleK

Les fournisseurs d’hébergement mutualisé autorisent généralement un assez petit nombre de connexions simultanées pour le même utilisateur.

Ce que votre code fait est:

  • ouvrir une connexion au serveur MySQL
  • faire ses trucs (générer la page)
  • fermez la connexion à la fin de la page.

La dernière étape, à la fin de la page, n’est pas obligatoire: (citant le manuel de mysql_close ):

Utiliser mysql_close () n'est généralement pas nécessaire, ouvert non persistant les liens sont automatiquement fermés au fin de l'exécution du script.

Mais notez que vous ne devriez probablement pas utiliser des connexions persistantes de toute façon ...

Deux astuces:

  • utilisez mysql_connect au lieu de mysql_pconnect(vous êtes déjà d'accord)
  • Définissez le quatrième paramètre de mysql_connect sur false (déjà correct pour vous, car c'est la valeur par défaut)}: citant le manuel:

Si un deuxième appel est fait à mysql_connect () avec le même arguments, aucun nouveau lien ne sera établi, mais à la place, le lien identifiant du lien déjà ouvert sera retourné. 

Le nouveau_lien paramètre modifie ce comportement et fait que mysql_connect () ouvre toujours un fichier nouveau lien, même si mysql_connect () était appelé avant avec le même paramètres.



Que pourrait causer le problème, alors?

Peut-être essayez-vous d'accéder à plusieurs pages en parallèle (en utilisant plusieurs onglets dans votre navigateur, par exemple)}, qui simulera plusieurs utilisateurs utilisant simultanément le site Web?

Si de nombreux utilisateurs utilisent le site simultanément et que le code entre mysql_connect et la fermeture de la connexion prend beaucoup de temps, cela signifie que de nombreuses connexions seront ouvertes en même temps ... Et vous atteindrez la limite :-(

Cependant, comme vous êtes le seul utilisateur de l'application, sachant que vous avez jusqu'à 200 connexions simultanées autorisées, il se passe quelque chose d'étrange ...



En pensant à "trop de connexions} _" et à "max_connections" ...

Si je me souviens bien, max_connections ne limite pas le nombre de connexions que vous pouvez ouvrir sur le serveur MySQL, mais le nombre total de connexions pouvant être ouvertes sur ce serveur, par quiconque s'y connectant..

Citant la documentation de MySQL sur Trop de connexions :

Si vous obtenez trop de connexions erreur lorsque vous essayez de vous connecter au serveur mysqld, cela signifie que tous Les connexions disponibles sont utilisées par autres clients.

Le nombre de connexions autorisées est contrôlée par le max_connections variable système. Sa valeur par défaut est 100. Si vous devez prendre en charge davantage de connexions, vous devez définir un plus grand nombre de fichiers valeur pour cette variable.

Donc, en réalité, le problème ne vient peut-être pas de vous ni de votre code (qui a l'air bien, en fait)}: il se peut "juste" que vous ne soyez pas le seul à essayer de vous connecter à ce serveur MySQL (rappelez-vous, "hébergement partagé")}, et qu'il y a trop de gens qui l'utilisent en même temps ...

... Et si j'ai raison et que c'est, vous ne pouvez rien faire pour résoudre le problème: tant qu'il y a trop de bases de données/d'utilisateurs sur ce serveur et que max_connection est défini sur 200, continuer à souffrir ...


En remarque: avant de revenir à GoDaddy pour les interroger à ce sujet, ce serait bien si quelqu'un pouvait valider ce que je viens de dire ^^

31
Pascal MARTIN

J'ai eu environ 18 mois de traitement de ce problème ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/ )

Les solutions que j'avais (qui vous concerneraient) à la fin étaient:

  1. réglez la base de données selon MySQLTuner .
  2. défragmenter les tables chaque semaine en fonction de ceci post

Défragmentation du script bash du message:

#!/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

Si vous avez un accès Shell, utilisez netstat pour voir le nombre de sockets ouverts dans votre base de données et leur origine.

Sous Linux, tapez:

netstat -n -a |grep 3306

Sur Windows, tapez:

netstat -n -a |findstr 3306
2

Êtes-vous complètement sûr que le serveur de base de données vous est entièrement dédié?

Connectez-vous à la base de données en tant que root et utilisez "SHOW PROCESSLIST" pour voir qui est connecté. Idéalement, connectez-le à votre système de surveillance pour afficher le nombre de connexions au fil du temps et alerter s'il y en a trop.

Le nombre maximal de connexions à la base de données peut être configuré dans my.cnf, mais veillez à ne pas manquer de mémoire ou d’espace adresse.

2
MarkR

Assurez-vous de ne pas utiliser de connexions persistantes. Ceci est généralement une mauvaise idée ..

Si vous avez cela .. Au plus, vous aurez besoin de supporter autant de connexions que vous avez de processus Apache. Pouvez-vous modifier le paramètre max_connections?

2
Evert

La solution pourrait un de ceux-ci, je suis tombé sur cela dans un test MCQA, même si je n'ai pas compris lequel est le bon!

Définissez ceci dans my.cnf "set-variable = max_connections = 200"

Exécutez la commande "SET GLOBALmax_connections = 200"

Utilisez toujours la fonction mysql_connect () pour vous connecter au serveur mysql

Utilisez toujours la fonction mysql_pconnect () pour vous connecter au serveur mysql

1
Nitesh

Les suivants sont des solutions possibles:

1) Augmentez le nombre maximal de connexions en définissant la variable globale dans mysql.

set global max_connection=200;

Note: Cela augmentera la charge du serveur.

2) Videz votre pool de connexions comme ci-dessous:

FLUSH HOSTS; 

3) vérifiez votre liste de processus et supprimez une liste de processus spécifique si vous n'en voulez aucune.


Vous pouvez vous référer à ceci: - 

lien article

0
dilraj singh