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
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 tche 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 tche 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
.