18.2.1 Erreur MySQL server has gone away

Cette section couvre aussi l'erreur Lost connection to server during query .

La raison la plus probable qui conduit à une erreur MySQL server has gone away est que le serveur a dépassé le délai d'attente, et qu'il a terminé la connexion. Par défaut, les connexions sont terminée après 8 heures d'inaction.

Vous pouvez vous assurez qu le serveur MySQL fonctionne toujours avec la commande mysqladmin version et en observant le temps de vie.

Si vous avez un script en cours, vous n'avez qu'à le relancer, et le client se reconnectera automatiquement.

Dans cette situation vous pouvez obtenir les erreurs suivantes (suivant l'OS) :

Vous pouvez voir ces erreurs survenir si vous émettez une erreur trop grande, ou de taille incorrecte. Si mysqld recoit un paquet trop grand ou hors service, il suppose alors que quelque chose n'a pas fonctionné du coté du client, et il termine la connexion. Si vous avez des requêtes de grande taille (par exemple, si vous avez des colonnes de type BLOB), il vaut mieux augmenter la taille maximale des requête lors du démarrage de mysqld avec l'option -O max_allowed_packet=# option (par défaut : 1M). La mémoire supplémentaire est allouée à la volée, ce qui permet à mysqld de n'utiliser plus de mémoire que lorsque vous émettrez une énorme requête, ou que vous vous attendrez à une énorme réponse.@node Can not connect to server, Blocked host, Gone away, Common errors

18.2.2 Erreur Can't connect to [local] MySQL server

Les clients MySQL peuvent se connecter à un serveur mysqld de deux manières différentes : soit les sockets Unix, qui se connecte via un fichier système (par défaut ``/tmp/mysqld.sock''), ou par TCP/IP, qui se connecte à un numéro de port. Les sockets Unix sont beaucoup plus rapides que les sockets TCP/IP mais uniquement sur le même ordinateur. Les sockets Unix sont utilisées par défaut si vous ne spécifiez par de nom d'hôte, ou si vous vous connectez à localhost.

L'erreur Can't connect to ... signifie normalement qu'il n'y a pas de serveur MySQL sur le système, ou que vous utilisez un faux fichier de socket Unix ou un mauvais port TCP/IP lorsque vous vous connectez au serveur mysqld.

Commencez par vérifier (avec ps) qu'il y a bien un processus nommé mysqld sur votre serveur! Si il n'y en a pas, il vaut mieux le démarrer. 4.15.2 Problèmes avec le serveur MySQL.

Si un serveur mysqld tourne, vous pouvez vérifier le serveur avec les connexions suivantes (le numéro de port ou le nom de fichier de socket Unix peuvent différer de votre système, bien sur...) :

shell> mysqladmin version
shell> mysqladmin -h `hostname` version
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --socket=/tmp/mysql.sock version

Notez que l'utilisation de guillemets arrière (backquotes) plutôt que des guillemets simples autour de hostname; force l'affichage de hostname (i.e., l'hôte courant), à utiliser ultérieurement dans la commande mysqladmin.

Voici quelques raisons qui causent l'erreur Can't connect to local MySQL server :

  • mysqld n'est pas lancé
  • Vous utilisez un système qui utilise MIT-pthreads. Si vous un système qui n'a pas de threads natifs, mysqld utilise le package MIT-pthreads. 4.2 Systèmes d'exploitation supportés par MySQL. Cependant, MIT-pthreads ne supporte pas les sockets Unix sockets, ce qui fait que sur ces systèmes, vous devez obligatoirement spécifier un nom d'hôte explicitement, lorsque vous vous connectez à un serveur. Essayez la commande suivante, pour vérifier la connexion au serveur :
shell> mysqladmin -h `hostname` version
  • Quelqu'un a supprimé le fichier de sockets Unix utilisé par mysqld (par défaut ``/tmp/mysqld.sock''). Il est aussi possible que la table de cron supprime automatiquement la socket MySQL (e.g., une tche qui va supprimer les anciens fichiers dans le dossier ``/tmp'' directory). Vous pouvez aussi lancer la commande mysqladmin version et vérifier que la socket mysqladmin que vous tentez d'utiliser existe vraiment. La solution dans ce cas est de modifier la tche de la table de cron pour qu'elle ne supprime par ``mysqld.sock'' ou encore de placer le fichier de socket ailleurs. Vous pouvez ainsi placer le fichier de socket dans un autre dossier avec la commande suivante :
shell> ./configure --with-unix-socket-path=/path/to/socket

Vous pouvez aussi lancer safe_mysqld avec l'option --socket=/path/to/socket et assigner une valeur à la variable d'environnement MYSQL_UNIX_PORT avant de démarrer votre client MySQL. Puis vous lancez le serveur mysqld avec l'option --socket=/path/to/socket. Si vous changez le chemin de la socket sur le serveur, vous devez le notifier aux clients MySQL. Vous pouvez le faire avec la variable d'environnement MYSQL_UNIX_PORT ou en fournissant aux clients un chemin jusqu'à la socket. Ainsi, vous pouvez tester la commande suivante :

shell> mysqladmin --socket=/path/to/socket version
  • Si vous utilisez Linux et qu'un des thread s'est terminé (core dumped), vous devrez terminer les autres threads mysqld (avec le script mysql_zap), avant de pouvoir redémarrer un nouveau serveur MySQL. Reportez vous à la section Crashing

Si vous avez le message d'erreur Can't connect to MySQL server on un_nom_d_hote, vous pouvez essayer les solutions suivantes :

  • Verifiez que le serveur est en état de fonctionnement, avec une commande telnet your-host-name tcp-ip-port-number et RETURN (plusieurs fois). Si il y a un serveur MySQL sur ce port, vous allez recevoir une réponse qui comportera notamment un numéro de version (celui du serveur en fonctionnement). Si vous recevez une erreur du style : telnet: Unable to connect to remote host: Connection refused, C'est qu'il n'y a pas de serveur sur ce port.
  • Essayer de vous connecter au serveur depuis la machine locale et vérifiez le port TCP/IP dans la configuration de mysqld (variable port) avec la commande mysqladmin variables.
  • Vérifiez que votre serveur mysqld n'a pas été lancé avec l'option --skip-networking.