Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/07218.jsonl.gz/1211

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.
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 !
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.
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.
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.
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.
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';
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.