Soudain “MySQL server has gone away” erreur dans le PHP du site
Aujourd'hui l'un de mes sites web a commencé à montrer des
Numéro D'Erreur: 2006 MySQL server has gone away
C'est un faible trafic de site client fonctionnant sous Apache 2.2.9 (Debian), PHP 5.2.6-1+lenny3 (à l'aide de CodeIgniter 1.7.1 cadre) et MySQL 5.0.51 un. J'ai évidemment reasearched sur l'erreur, mais toutes les solutions possibles implique qu'il y a de grosses requêtes en cours qui peuvent de temps et de réinitialiser la connexion, ou de frapper le paquet de limites. Cependant, ce n'est pas le cas, c'est une petite base de données traitée avec le plus simple des requêtes. Pour être sûr de ce que j'ai fait un peu de requêtes pour retourner une ligne, toujours la même erreur.
Base de données d'informations d'identification sont très bien, je peux même vous connecter directement dans mysql, exécutez quelques du site des requêtes et obtenir les bonnes données instantanément. Il y a plusieurs autres sites sur le même serveur et les connexions à la base de données, beaucoup plus grands sites, et ils n'ont pas du tout les problèmes.
J'ai essayé:
- Le Redémarrage De MySQL
- De redémarrer le serveur tout entier
- À la recherche d'erreurs dans les logs (Apache et MySQL, aucun)
- Vérification db utilisateur des autorisations
- Changer
mysql.connect_timeout
etdefault_socket_timeout
en PHP - Changer
max_allowed_packet
dans MySQL - La lecture de la officiel docs, forum et tout ce DONC qui dit "MySQL server has gone away"
Nouveau:
- La désactivation des connexions persistantes dans PHP
- Changer
wait_timeout
etconnect_timeout
dans MySQL
Mise à jour:
Il semble être lié à la durée d'exécution de mon script: il récupère des informations en utilisant le Facebook PHP clients et cet appel semble pas au hasard aujourd'hui, donc, soit je n'ai pas de données à partir de Facebook ou de l'erreur MySQL. Mais à ma grande surprise, aucune des solutions proposées comme semble traiter avec le délai d'attente.
Des idées? je vous remercie pour votre temps!
J: Oui, et étonnamment pour moi, oui pour le 2ème aussi, il semble y avoir un problème porté par le cadre, puis..
Toute chance vous pourriez publier la requête générée en sortie? Je suppose que c'est en passant par CodeIgniter. Êtes-vous d'utiliser InnoDB ou exotique de page de code, par hasard?
Oui je pourrais, mais c'est juste quelques lignes avec pas beaucoup de bruit. Je suis en utilisant MyISAM et UTF-8 sur les bases de données/tables.
OriginalL'auteur lima | 2009-12-10
Vous devez vous connecter pour publier un commentaire.
Comme je l'ai dit dans ma mise à jour, j'en ai conclu que le problème avec MySQL se pose lorsque le lien de Facebook prend plus de temps que la durée maximale de temps de connexion à la DB. Aucune des suggestions pourrait battre cette limitation, j'ai donc décidé de travailler autour d'elle et de se reconnecter à chaque fois que je présume que le lien peut-être disparu.
Ainsi, après chaque appel à Facebook, j'ai utilisé de code suivant:
C'est la solution particulière lors de l'utilisation de CodeIgniter, et autant que je sache, le db->reconnect() fonction n'est disponible que depuis la version 1.7.2 j'ai donc mis à jour pour fonctionner.
Merci à tous pour vos réponses!
J'ai le même problème, et cela ne fonctionne pas, n'a rien de changer depuis 2009 ?
OriginalL'auteur lima
C'est probablement un délai de connexion affecter vos connexions persistantes en PHP. J'ai l'habitude de voir tout le temps. Le paramètre de délai d'expiration est dans MySQL lui-même.
Vos options comprennent:
- ne pas utiliser des connexions persistantes
- la désactivation du délai d'inactivité sur le serveur MySQL
- recouvrement de l'erreur
J'ai toujours envelopper de reconnexion dans ma propre classe PDO, donc je ne peux pas me souviens même pas si PHP se reconnecte ou pas. En tout cas, c'est une solution facile. Sur requête, catch & rebranchez-le.
J'ai "créé" cette erreur dans le passé avec InnoDB. Si vous utilisez ce moteur, quel est le résultat de
SHOW ENGINE INNODB STATUS
après un échec?Bon, le problème est toujours là, mais j'ai trouvé un modèle. Je vais mettre à jour la question.
La réinitialisation de mysql délais d'attente peuvent avoir des répercussions négatives sur glitch réseaux. Euh, le piégeage de l'erreur consisterait en un peu de la coutume dans la DB des gestionnaires pour votre cadre... ou un géant catch (), connectez-vous et réessayez. Étrange que le fait de désactiver les connexions persistantes ne pas faire l'affaire.
En fait... êtes-vous à l'aide de la réplication sur ce MySQL boîte?
Non, je l'ai fait une fois, juste pour migrer le serveur. J'ai mis à jour la question, le coupable semble être plus claire maintenant.
OriginalL'auteur pestilence669
Depuis les autres sites de travail, on peut supposer que c'est lié à votre site (et non sur le serveur). Les documents officiels mentionnent que cela peut se produire si vous essayez d'exécuter des requêtes après la connexion au serveur est fermé. Avez-vous des crochets dans CodeIgniter qui fait quelque chose vers la fin d'une requête lorsque la connexion de base de données peut être fermé?
OriginalL'auteur Christian P.
Vous mentionner que c'est une nuit de tâche et que vous obtenez FaceBook de données, etc. Est le processus en cours d'exécution pendant une longue période?
J'ai eu récemment l'script qui est de déplacer les données d'un cluster à un autre et de transformer les formats etc. Ce script fonctionne 24 /7 déplacement de ces données au travers. J'ai trouvé que, avec ou sans les connexions persistantes, MySQL bibliothèques vont encore tomber après quelques minutes (parfois 5 minutes, parfois plus).
Le seul moyen que j'ai trouvé pour contourner pour mon cas, il a été mis un temps de vérifier dans mon enveloppe et de vérifier combien de temps il a été depuis la dernière fois que j'ai reconnecté avant l'exécution de la requête. Je l'ai mis pour vérifier si il est supérieur à 2 minutes, et si oui, pour rétablir la connexion, s'assurer de régler la "new_link" drapeau (4e param) sur mysql_connect est définie sur false.
Puisque la modification de cela, je n'ai jamais eu la même erreur à nouveau.
Ne vous obtenez le message d'erreur instantanément - c'est à dire dès que vous faites une page vue? ou sont les cas où il échoue après le script a été en cours d'exécution un certain laps de temps?
Il peut échouer instantanément ou dans le milieu du script, en fonction de la cause de l'erreur. Il est détaillé dans ma réponse maintenant 🙂
OriginalL'auteur Lucas