Erreur MySQL " trop de connexions"
J'utilise MySQL 5.0 pour un site hébergé par GoDaddy (linux).
je faisais quelques tests sur mon application web, et soudainement j'ai remarqué que les pages étaient rafraîchissantes vraiment lentement. Finalement, après une longue attente, je suis arrivé à une page qui disait quelque chose comme "erreur MySQL, trop de connexions...", et il a pointé vers ma config.fichier php qui se connecte à la base de données.
il a été moi Se connecter à la base de données, pas d'autres utilisateurs. Sur chacune de mes pages, - Je inclure le fichier de configuration.fichier php en haut, et fermez la connexion mysql à la fin de la page. Il peut y avoir plusieurs requêtes entre les deux. Je crains que je ne ferme pas assez les connexions mysql (mysql_close()).
cependant, quand j'essaie de les fermer après avoir lancé une requête, je reçois des erreurs de connexion sur la page. Mes pages sont en PHP et HTML. Quand j'essaie de fermer une requête, il semble que la suivante ne se connecte pas. Aurais-je inclure config.php à nouveau après la fermeture afin de se connecter?
cette erreur m'a fait peur parce que dans 2 semaines, environ 84 personnes commencent à utiliser cette application web.
Merci.
EDIT:
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, et puis la connexion se ferme quand la page est chargée. Ensuite, la connexion s'ouvre à nouveau lorsque quelqu'un clique sur un bouton sur la page, et donc sur...
EDIT:
<!-Je viens de raccrocher avec GoDaddy. Apparemment, avec mon paquet économique, je suis limité à 50 connexions à la fois. Alors que mon problème aujourd'hui s'est produit avec seulement moi accédant au site, ils ont dit qu'ils avaient quelques problèmes de serveur plus tôt. Cependant, vu que je vais avoir 84 utilisateurs pour mon application web, Je devrais probablement passer à" Deluxe", qui permet 100 connexions à la fois. Un jour donné, il peut y avoir environ 30 utilisateurs j'accède à mon site à la fois, donc je pense que le 100 serait plus sûr pari. Avez-vous les gars êtes d'accord?7 réponses
les fournisseurs D'hébergement partagé permettent généralement un nombre relativement faible de connexions simultanées pour le même utilisateur.
Ce que votre code est la suivante :
- ouvrir une connexion au serveur MySQL
- faire des trucs (la génération de la page)
- fermer la connexion à la fin de la page.
La dernière étape, quand il est fait à la fin de la page n'est pas obligatoire : (citant mysql_close
's manuel) :
utiliser mysql_close () n'est pas habituel nécessaire, comme non persistante ouverte les liens sont automatiquement fermés au fin du script de l'exécution.
mais notez que vous ne devriez probablement pas utiliser de connexions persistantes de toute façon...
Deux conseils :
- utiliser
mysql_connect
au lieu demysql_pconnect
(déjà OK pour vous) - Définir le quatrième paramètre de mysql_connect false (déjà OK pour vous, comme c'est la valeur par défaut) : (citant le manuel) :
Si un deuxième appel est fait à mysql_connect() avec la même arguments, aucun nouveau lien ne sera établi, mais à la place, le lien identifiant du lien déjà ouvert sera retourné.
le nouveau_link paramètre modifie ce comportement et rend mysql_connect () toujours ouvert un nouveau lien, même si mysql_connect() a été appelée avec les mêmes paramètre.
Ce qui pourrait causer le problème, alors ?
Peut-être que vous essayez d'accéder à plusieurs pages en parallèle (l'utilisation de plusieurs onglets dans votre navigateur, par exemple), qui va simuler plusieurs utilisateurs utilisant le site en même temps ?
si vous avez beaucoup d'utilisateurs utilisant le site en même temps et le code entre mysql_connect
et la fermeture de la connexion prend beaucoup de le temps, cela signifie que de nombreuses connexions ouvertes en même temps... Et vous arriverez à la limite :-(
pourtant, comme vous êtes le seul utilisateur de l'application, considérant que vous avez jusqu'à 200 connexions simultanées autorisées, il se passe quelque chose d'étrange...
eh Bien, en pensant à " trop de connexions" et "max_connections
"...
Si je me souviens bien, max_connections
ne pas limiter le nombre de connexions vous peut s'ouvrir sur le serveur MySQL, mais le nombre total de connexions que peut-bo a ouvert pour ce serveur, par toute personne s'y connectant.
citant la documentation de MySQL sur trop de connexions:
si vous avez trop de connexions erreur lorsque vous essayez de vous connecter serveur mysqld, cela signifie que tous les les connexions disponibles sont utilisées par autre client.
Le nombre de connexions autorisées est contrôlé par les max_connections la variable système. Sa valeur par défaut est 100. Si vous avez besoin de supporter plus de connexions, vous devriez mettre un plus grand la valeur de cette variable.
donc, en fait, le problème ne vient peut-être pas de vous ni de votre code (qui a l'air bien, en fait) : il peut "seulement" être que vous n'êtes pas le seul à essayer de se connecter à ce serveur MySQL (rappelez-vous, "partagé hébergement"), et qu'il y a trop de personnes qui l'utilisent en même temps...
... Et si je suis à droite et c'est que, il n'y a rien que vous puissiez faire pour résoudre le problème : tant qu'il y a trop de bases de données / utilisateurs sur ce serveur et que max_connection
est fixé à 200, vous continuerez à souffrir...
Comme un sidenote: avant de retourner à GoDaddy leur poser des questions à ce sujet, ce serait bien si quelqu'un pouvait valider ce que je viens de dire ^^
j'ai eu environ 18 mois pour faire face à cela (http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/)
Les solutions que j'avais (qui s'applique à vous) à la fin, étaient:
- ajuster la base de données selon MySQLTuner.
- défragmenter les tables de la semaine en fonction de ce post
défragmenter le script de bash post:
#!/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
assurez-vous de ne pas utiliser de connexions persistantes. C'est généralement une mauvaise idée..
Si vous avez que .. Au plus vous aurez à supporter autant de connexions que vous avez de processus apache. Pouvez-vous modifier le paramètre max_connections?
Êtes-vous sûr que le serveur de base de données est entièrement dédié pour vous?
connectez-vous à la base de données en tant que root et utilisez "SHOW PROCESSLIST" pour voir qui est connecté. Idéalement, accrochez ceci à votre système de surveillance pour voir combien de connexions il y a au fil du temps et alertez s'il y en a trop.
les connexions de base de données maximum peuvent être configurées dans my.cnf, mais attention à cours de mémoire ou d'espace d'adressage.
si vous avez accès à shell, utilisez netstat pour voir combien de sockets sont ouverts à votre base de données et d'où ils proviennent.
sous Linux, tapez:
netstat -n -a |grep 3306
Sur windows, tapez:
netstat -n -a |findstr 3306
la solution pourrait-elle l'une de celles-ci, je suis tombé sur cela dans un test MCQA, même je n'ai pas compris laquelle est bonne!
dans mon.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
les solutions possibles sont les suivantes:
1) augmentez le paramètre de connexion max en définissant la variable globale dans mysql.
set global max_connection=200;
Remarque: Il va augmenter la charge sur le serveur.
2) Videz votre pool de connexion comme suit:
FLUSH HOSTS;
3) vérifiez votre liste de processus et tuez la liste de processus spécifique si vous ne voulez pas ils.
Vous pouvez vous référer à ceci :-