Je reçois cette erreur lorsque j'essaie de créer un gros fichier SQL (une requête INSERT
volumineuse).
mysql> source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Rien dans le tableau n'est mis à jour. J'ai essayé de supprimer et d'annuler la suppression de la table/base de données, ainsi que de redémarrer MySQL. Aucune de ces choses ne résout le problème.
Voici ma taille de paquet maximum:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Voici la taille du fichier:
$ ls -s file.sql
79512 file.sql
Quand j'essaie l'autre méthode ...
$ ./mysql -u root -p my_db < file.sql
Enter password:
ERROR 2006 (HY000) at line 1: MySQL server has gone away
max_allowed_packet=64M
L'ajout de cette ligne dans le fichier my.cnf
résout mon problème.
Ceci est utile lorsque les colonnes ont de grandes valeurs, ce qui cause les problèmes, vous pouvez trouver l'explication ici .
Sous Windows, ce fichier se trouve à l'emplacement suivant: "C:\ProgramData\MySQL\MySQL Server 5.6"
Sous Linux (Ubuntu):/etc/mysql
Vous pouvez augmenter le nombre maximum de paquets autorisés
SET GLOBAL max_allowed_packet=1073741824;
http://dev.mysql.com/doc/refman/5.5/fr/server-system-variables.html#sysvar_max_allowed_packet
La mise à jour globale et les paramètres my.cnf ne m'ont pas fonctionné pour une raison quelconque. Passer la valeur max_allowed_packet
directement au client travaillé ici:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
En général l'erreur:
Erreur: 2006 (
CR_SERVER_GONE_ERROR
) - Le serveur MySQL est parti
signifie que le client n'a pas pu envoyer de question au serveur.
mysql
importDans votre cas spécifique, lors de l'importation du fichier de base de données via mysql
, cela signifie probablement que certaines des requêtes du fichier SQL sont trop volumineuses pour pouvoir être importées et qu'elles ne peuvent pas être exécutées sur le serveur. Par conséquent, le client échoue lors de la première erreur survenue.
Donc, vous avez les possibilités suivantes:
Ajoutez l'option de force (-f
) pour que mysql
continue et exécute le reste des requêtes.
Ceci est utile si la base de données contient des requêtes volumineuses liées au cache qui ne sont de toute façon pas pertinentes.
Augmentez max_allowed_packet
et wait_timeout
dans la configuration de votre serveur (par exemple ~/.my.cnf
).
Videz la base de données en utilisant l'option --skip-extended-insert
pour décomposer les requêtes volumineuses. Puis importez-le à nouveau.
Essayez d’appliquer l’option --max-allowed-packet
pour mysql
.
En général, cette erreur peut signifier plusieurs choses, telles que:
une requête sur le serveur est incorrecte ou trop volumineuse,
Solution: Augmenter max_allowed_packet
variable.
Assurez-vous que la variable est sous la section [mysqld]
et non pas [mysql]
.
N'ayez pas peur d'utiliser de grands nombres pour les tests (comme 1G
).
N'oubliez pas de redémarrer le serveur MySQL/MariaDB.
Vérifiez à nouveau que la valeur a été définie correctement par:
mysql -sve "SELECT @@max_allowed_packet" # or:
mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
Vous avez un délai d'attente de la connexion TCP/IP côté client.
Solution: Augmenter wait_timeout
variable.
Vous avez essayé d'exécuter une requête après la fermeture de la connexion au serveur.
Solution: Une erreur de logique dans l'application doit être corrigée.
La recherche du nom d'hôte a échoué (par exemple, un problème de serveur DNS) ou le serveur a été démarré avec l'option --skip-networking
.
Une autre possibilité est que votre pare-feu bloque le port MySQL (par exemple, 3306 par défaut).
Le thread en cours d'exécution a été tué, alors réessayez.
Vous avez rencontré un bogue provoquant la mort du serveur lors de l'exécution de la requête.
Un client s'exécutant sur un hôte différent ne dispose pas des privilèges nécessaires pour se connecter.
Et bien d’autres encore, apprenez-en plus à l’adresse: B.5.2.9 Le serveur MySQL est parti .
Voici quelques idées de débogage de niveau expert:
Vérifiez les journaux, par exemple.
Sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
Testez votre connexion via les fonctions mysql
, telnet
ou ping (par exemple, mysql_ping
en PHP).
Utilisez tcpdump
pour renifler la communication MySQL (cela ne fonctionnera pas pour une connexion socket), par exemple:
Sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
Sous Linux, utilisez strace
. Sous BSD/Mac, utilisez dtrace
/dtruss
, par exemple.
Sudo dtruss -a -fn mysqld 2>&1
Découvrez comment déboguer un serveur ou un client MySQL à l’adresse: 26.5 Débogage et portage de MySQL .
Pour référence, vérifiez le code source dans sql-common/client.c
fichier responsable de la génération de l'erreur CR_SERVER_GONE_ERROR
pour la commande client.
MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
arg, arg_length))
{
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
goto end;
}
Juste au cas où, pour vérifier les variables, vous pouvez utiliser
$> mysqladmin variables -u user -p
Ceci affichera les variables actuelles, dans ce cas, max_allowed_packet, et comme quelqu'un l'a dit dans une autre réponse, vous pouvez le définir temporairement avec
mysql> SET GLOBAL max_allowed_packet=1072731894
Dans mon cas, le fichier cnf n'a pas été pris en compte et je ne sais pas pourquoi, le code SET GLOBAL m'a vraiment aidé.
J'ai résolu l'erreur ERROR 2006 (HY000) at line 97: MySQL server has gone away
et migré avec succès un fichier SQL> 5 Go en effectuant les deux étapes suivantes:
Créé /etc/my.cnf comme d'autres l'ont recommandé, avec le contenu suivant:
[mysql]
connect_timeout = 43200
max_allowed_packet = 2048M
net_buffer_length = 512M
debug-info = TRUE
Ajout des indicateurs --force --wait --reconnect
à la commande (c'est-à-dire mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect
).
Remarque importante: Il était nécessaire d'exécuter les deux étapes, car si je ne m'occupais pas de modifier le fichier /etc/my.cnf ni d'ajouter ces indicateurs, certaines tables étaient manquantes après l'importation.
Système utilisé: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 pour osx10.8 (i386)
Vous pouvez également vous connecter à la base de données en tant que root (ou privilège SUPER) et
set global max_allowed_packet=64*1024*1024;
ne nécessite pas non plus un redémarrage de MySQL. Notez que vous devez corriger votre fichier my.cnf
comme indiqué dans les autres solutions:
[mysqld]
max_allowed_packet=64M
Et confirmez les modifications après le redémarrage de MySQL:
show variables like 'max_allowed_packet';
Vous pouvez également utiliser la ligne de commande, mais cela peut nécessiter la mise à jour des scripts de démarrage/arrêt qui risquent de ne pas survivre aux mises à jour et correctifs du système.
Comme demandé, j'ajoute ma propre réponse ici. Content de voir que ça marche!
J'ai eu le même problème mais la modification de max_allowed_packet dans le fichier my.ini/my.cnf sous [mysqld] a rendu l'astuce difficile.
ajouter une ligne
max_allowed_packet=500M
redémarrez maintenant le service MySQL une fois que vous avez terminé.
La solution augmente les valeurs en fonction des paramètres wait_timeout
et connect_timeout
dans votre fichier d'options, sous la balise [mysqld]
.
J'ai dû récupérer une sauvegarde mysql de 400 Mo et cela a fonctionné pour moi (les valeurs que j'ai utilisées ci-dessous sont un peu exagérées, mais vous comprenez le point):
[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
Quelques choses pourraient se passer ici;
INSERT
est longue et le client est en train de se déconnecter. Lorsqu'il se reconnecte, il ne sélectionne pas de base de données, d'où l'erreur. Une option consiste ici à exécuter votre fichier de commandes à partir de la ligne de commande et à sélectionner la base de données dans les arguments, comme suit;$ mysql nom_base <source.sql
php
ou une autre langue. Après chaque instruction longue, vous pouvez fermer et rouvrir la connexion, en vous assurant que vous êtes connecté au début de chaque requête.Pour plus d'informations à ce sujet, reportez-vous à http://dev.mysql.com/doc/refman/5.5/en/gone-away.html Ou http: // dev.mysql.com/doc/refman/5.1/en/gone-away.html selon les cas.
J'ai rencontré cette erreur lorsque j'utilise Mysql Cluster, je ne sais pas si cette question provient d'un cluster ou non. Comme l'erreur est exactement la même chose, donnez ma solution ici . Cette erreur survient car les nœuds de données se bloquent brusquement. Mais lorsque les nœuds tombent en panne, vous pouvez toujours obtenir le résultat correct à l'aide de cmd:
ndb_mgm -e 'ALL REPORT MEMORYUSAGE'
Et le mysqld fonctionne également correctement.Alors au début, je ne peux pas comprendre ce qui ne va pas. Et environ 5 minutes plus tard, le résultat de ndb_mgm ne montre aucun nœud de données en fonctionnement. Ensuite, je réalise le problème. Essayez donc de redémarrer tous les nœuds de données, puis le serveur mysql est de retour et tout va bien.
Mais une chose m'est bizarre, après que j'ai perdu le serveur mysql pour certaines requêtes, quand j'utilise cmd comme show tables
, je peux toujours obtenir les informations de retour comme 33 rows in set (5.57 sec)
, mais aucune information de table n'est affichée.
Il s’agit plus d’un problème rare, mais j’ai vu cela si une personne a copié le répertoire/var/lib/mysql en entier comme moyen de migrer sa base de données vers un autre serveur. Cela ne fonctionne pas parce que la base de données était en cours d'exécution et utilisait des fichiers journaux. Cela ne fonctionne pas parfois s'il y a des journaux dans/var/log/mysql. La solution consiste à copier également les fichiers/var/log/mysql.
Pour Amazon RDS (c'est mon cas), vous pouvez remplacer la valeur du paramètre max_allowed_packet
par une valeur numérique exprimée en octets, ce qui est logique pour les données les plus volumineuses d'une insertion (par exemple, si le max_allowed_packet
à 64M = 67108864), dans un parameter-group
nouveau ou existant. Appliquez ensuite ce groupe de paramètres à votre instance MySQL (vous devrez peut-être redémarrer l'instance).
S'il s'agit de se reconnecter et d'obtenir l'ID de connexion 2, le serveur est presque définitivement tombé en panne.
Contactez l'administrateur du serveur et demandez-leur de diagnostiquer le problème. Aucun SQL non malveillant ne devrait planter le serveur, et la sortie de mysqldump ne devrait certainement pas.
Il est probable que l'administrateur du serveur a commis une grosse erreur opérationnelle, telle que l'attribution de tailles de mémoire tampon supérieures aux limites d'espace adresse de l'architecture ou supérieures à la capacité de mémoire virtuelle. Le journal des erreurs MySQL contiendra probablement des informations pertinentes. ils surveilleront cela s'ils sont compétents de toute façon.