18.2 Erreurs fréquentes avec MySQL

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.

18.2.3 Erreur Host '...' is blocked

Si vous recevez une erreur telle que :

Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

C'est que mysqld a reçu trop de demande de connexion (max_connect_errors) de la part de l'hôte 'hostname' est qu'elles ont été interrompue au cours du processus. Après max_connect_errors echecs de connexion, mysqld supppose que quelque chose ne va pas (une attaque éventuelle d'un hacker), et bloque toutes les connexions ultérieures, jusqu'à ce que quelqu'un exécute la commande mysqladmin flush-hosts.

Par défaut, mysqld se bloque après 10 erreurs de connexions. Vous pouvez modifier ce paramètre avec :

shell> safe_mysqld -O max_connect_errors=10000 &

Notez que si vous recevez cette erreur de la part d'un hôte donné, il vaut mieux vérifier qu'il n'y a pas de problème de connexion TCP/IP avec cet hôte.Si les connexions TCP/IP ne fonctionnent pas, augmenter la valeur de max_connect_errors n'y changera rien !

18.2.4 Erreur Out of memory

Si vous recevez une erreur telle que :

mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

Cette erreur est une erreur du client mysql. Le client manque tout simplement de mémoire pour enregistrer le résultat complet.

Pour remédier au problème, assurez vous que votre requête est correcte, et surtout, retourne t elle un nombre raisonnable de ligne ? Si c'est le cas, vous pouvez utiliser mysql --quick, qui utilise mysql_use_result() pour récupérer le résultat, en déplaçant la charge de travail du client vers le serveur.

18.2.5 Erreur Packet too large

Lorsqu'un client MySQL ou le serveur mysqld reçoit un paquet de taille supérieure à max_allowed_packet octets, il va générer une erreur Packet too large et fermer la connexion.

Si vous utilisez le client mysql, vous pouvez changer la taille du buffer en lançant le client avec l'option mysql --set-variable=max_allowed_packet=8M.

Si vous utilisez d'autres clients qui ne vous permettent pas de changer cette taille (comme DBI), il faut changer la taille du buffer sur le serveur. L'option a modifier est max_allowed_packet. Par exemple, démarrer le serveur avec l'option --set-variable=max_allowed_packet=24M.

18.2.6 Erreur The table is full

Cette erreur survient lorsqu'une table temporaire excède la taille de tmp_table_size octets. Pour éviter ce problème, vous pouvez utiliser l'option -O tmp_table_size=# de mysqld pour accroître la taille des tables temporaires, ou bien utiliser l'option SQL SQL_BIG_TABLES avant d'exécuter la requête. SET OPTION.

Vous pouvez aussi démarrer le serveur avec l'option --big-tables. Cela revient à utiliser la clause SQL_BIG_TABLES dans toutes les requêtes.

18.2.7 Erreur coté client Commands out of sync

L'erreur Commands out of sync; You can't run this command now vient du fait que vous appelez les commandes dans le mauvais ordre, dans votre client.

Cela arrive si, par exemple, vous utilisez mysql_use_result() puis essayez d'exécuter une nouvelle requête avant d'appeler mysql_free_result(). Cela peut aussi arriver si vous exécutez deux requête qui retourne des données, sans employer mysql_use_result() ou mysql_store_result() entre ces deux commandes.

18.2.8 Erreur Ignoring user

Lorsque l'erreur suivante s'affiche :

Found wrong password for user: 'some_user@some_host'; Ignoring user

Cela signifie que lorsque mysqld a été démarré, ou qu'il a recharger les tables de permissions, il a trouvé un entrée dans la table user avec un mot de passe invalide. Par conséquent, l'entrée est purement et simplement ignorée par le système de droits.

Quelques situations et leur solution :

  • Vous avez lancé une nouvelle version de mysqld avec une vieille table user. Vous pouvez le vérifier en exécutant la commande mysqlshow mysql user pour voir si le mot de passe contient moins de 16 caractères. Dans ce cas, corrigez le problème avec le script scripts/add_long_password.
  • L'utilisateur a un ancien mot de passe de 8 caractères, et vous n'avez pas démarré avec l'option --old-protocol. Modifiez l'entrée de l'utilisateur dans la table user en lui attribuant un nouveau mot de passe, ou redémarrez le serveur avec l'option --old-protocol.
  • Vous avez spécifié un mot de passe dans la table user sans utiliser la fonction PASSWORD(). Utilisez le client mysql pour modifier l'entrée de l'utilisateur dans la table user , et attribuez lui un nouveau mot de passe. Assurez vous que vous utilisez bien la fonction PASSWORD():
mysql> update user set password=PASSWORD('your password')
           where user='XXX';

18.2.9 Erreur Table 'xxx' doesn't exist

L'erreur Table 'xxx' doesn't exist ou Can't find file: 'xxx' (errno: 2) signifie que la table demandée n'existe pas dans la bas de données courante.

N'oubliez pas que MySQL utilise des dossiers et des fichiers pour enregistrer ses bases de données et tables, et que les noms de ces derniers sont sensibles à la casse. (Sous Win32 les noms des bases de données et tables ne sont pas sensibles à la casse mais toutes les références à une table donnée dans une même requête doivent avoir la même casse ! !).

Vous pouvez lister les tables disponibles avec la requête SHOW TABLES. Reportez vous à la section SHOW.