ERREUR 2006 (HY000): le serveur MySQL est parti

309

J'obtiens cette erreur lorsque j'essaye de trouver un gros fichier SQL (une grosse INSERTrequête).

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 de restaurer 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 maximale de paquet:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

Voici la taille du fichier:

$ ls -s file.sql 
79512 file.sql

Quand j'essaye 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
bgcode
la source
2
Quelle est la taille d'un fichier? Dépasse-t-il peut-être le paramètre max_allowed_packet?
Marc B
1
Ok, ce n'est pas ça. Essayez d'extraire des requêtes individuelles du fichier et de les exécuter vous-même sur le moniteur. quelque chose là-dedans provoque un crash / déconnecté.
Marc B
Les requêtes que je tire aléatoirement du fichier fonctionnent correctement. J'ai généré le SQL par programme, et j'ai correctement échappé à tout. Je ne sais donc pas ce qui provoquerait une erreur s'il y en a une.
bgcode
1
Moi aussi j'ai le même problème ...
maaz

Réponses:

561
max_allowed_packet=64M

L'ajout de cette ligne dans un my.cnffichier résout mon problème.

Ceci est utile lorsque les colonnes ont de grandes valeurs, ce qui provoque des problèmes, vous pouvez trouver l'explication ici .

Sous Windows, ce fichier se trouve dans: "C: \ ProgramData \ MySQL \ MySQL Server 5.6"

Sous Linux (Ubuntu): / etc / mysql

Kurt Zhong
la source
3
cette solution a résolu le problème déclaré pour moi; rien ne pouvait être fait via la configuration / options côté client uniquement, et je n'étais pas disposé à descendre une solution de programmation via PHP ou autre.
Richard Sitze
154
Vous pouvez également vous connecter à la base de données en tant que root (ou privilège SUPER) et faire set global max_allowed_packet=64*1024*1024;- ne nécessite pas de redémarrage MySQL également
ébloui le
3
Cela m'a arrangé. my.cnf se trouve dans le dossier / etc.
Sam Vloeberghs
8
Vous devriez pouvoir mettre ceci sur la ligne de commande, ce qui évitera de modifier temporairement un fichier système: <code> mysql --max_allowed_packet = 1GM </code>
Jan Steinman
6
Si vous recherchez l'emplacement du fichier my.cnf, vous pouvez vérifier cette réponse . N'oubliez pas non plus de redémarrer mysql en tapant: sudo service mysql restartpour que les modifications du fichier my.cnf prennent effet.
consuela
148

Vous pouvez augmenter le nombre maximal de paquets autorisés

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

Nanhe Kumar
la source
3
Cela a fonctionné pour moi, mais pas la réponse acceptée. Je suppose que la valeur plus élevée de cette réponse est la racine de la solution pour moi.
John Bubriski
J'ai mis max_allowed_packet = 1024M dans my.cnf
Csaba Toth
1
Cela fait le serveur. Vous devez également le faire dans le client, comme "mysql --max_allowed_packet = 1073741824".
Jan Steinman
Cela a fonctionné pour moi. une question est "1073741824" en octets
user2478236
66

La mise à jour globale et les paramètres my.cnf n'ont pas fonctionné pour moi pour une raison quelconque. Passer la max_allowed_packetvaleur directement au client a fonctionné ici:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
Mario Peshev
la source
4
Selon le site Web MySQL, la réponse marquée et celle-ci doivent être utilisées.
Zenexer
2
N'oubliez pas de recharger les fichiers de configuration ou de redémarrer le serveur après avoir modifié ces paramètres
Csaba Toth
2
N'oubliez pas d'utiliser le --max_allowed_packetseul effet sur le client. Pensez également à modifier le serveur mysql (mysqld) en éditant max_allowed_packetle /etc/my.cnffichier et en redémarrant votre serveur mysql.
Fleuv
Notez que les valeurs conviviales de "50M" ou "1G" fonctionnent sur le cli et dans my.cnf. dev.mysql.com/doc/refman/8.0/en/using-system-variables.html
txyoji
36

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 importer

Dans votre cas spécifique lors de l'importation du fichier de base de données via mysql, cela signifie très probablement que certaines des requêtes dans le fichier SQL sont trop volumineuses pour être importées et qu'elles n'ont pas pu être exécutées sur le serveur, donc le client échoue lors de la première erreur survenue.

Vous avez donc les possibilités suivantes:

  • Ajoutez l'option force ( -f) pour mysqlcontinuer et exécuter le reste des requêtes.

    Cela est utile si la base de données contient de grandes requêtes liées au cache qui ne sont pas pertinentes de toute façon.

  • Augmentez max_allowed_packetetwait_timeout dans la configuration de votre serveur (par exemple ~/.my.cnf).

  • Vider la base de données à l'aide de l' --skip-extended-insertoption pour décomposer les grandes requêtes. Importez-le ensuite à nouveau.

  • Essayez d'appliquer l' --max-allowed-packetoption pour mysql.


Raisons courantes

En général, cette erreur peut signifier plusieurs choses, telles que:

  • une requête au serveur est incorrecte ou trop volumineuse,

    Solution: augmenter la max_allowed_packetvariable .

    • Assurez-vous que la variable est sous la [mysqld]section, non [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 que la valeur a été correctement définie par:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
  • Vous avez obtenu un délai d'expiration de la connexion TCP / IP côté client.

    Solution: augmenter la wait_timeoutvariable .

  • Vous avez tenté d'exécuter une requête après la fermeture de la connexion au serveur.

    Solution: une erreur logique dans l'application doit être corrigée.

  • Les recherches de nom d'hôte ont échoué (par exemple, problème de serveur DNS) ou le serveur a été démarré avec l' --skip-networkingoption.

    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é, essayez à nouveau.

  • Vous avez rencontré un bogue où le serveur est mort lors de l'exécution de la requête.

  • Un client s'exécutant sur un hôte différent n'a pas les privilèges nécessaires pour se connecter.

  • Et bien d'autres, alors apprenez-en plus sur: B.5.2.9 Le serveur MySQL est parti .


Débogage

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 mysql, telnetou les fonctions ping (par exemple mysql_pingen PHP).

  • Utilisez tcpdumppour renifler la communication MySQL (ne fonctionnera pas pour la connexion socket), par exemple:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Sous Linux, utilisez strace. Sur BSD / Mac, utilisez dtrace/ dtruss, par exemple

    sudo dtruss -a -fn mysqld 2>&1

    Voir: Premiers pas avec DTracing MySQL

Apprenez-en plus sur le débogage du serveur ou client MySQL sur: 26.5 Débogage et portage de MySQL .

Pour référence, vérifiez le code source dans le sql-common/client.cfichier responsable du lancement de l' CR_SERVER_GONE_ERRORerreur 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;
}
Kenorb
la source
--quick n'a pas fonctionné pour moi mais --skip-extended-insert l'a fait!
chiliNUT
20

Juste au cas où, pour vérifier les variables que vous pouvez utiliser

$> mysqladmin variables -u user -p 

Cela 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, donc le code SET GLOBAL a vraiment aidé.

lesolorzanov
la source
Super de pouvoir voir tous les paramètres de configuration en une seule fois. Merci!
DrB
20

J'ai résolu l'erreur ERROR 2006 (HY000) at line 97: MySQL server has gone awayet réussi à migrer un fichier sql> 5 Go en effectuant ces deux étapes dans l'ordre:

  1. 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
  2. Ajout des drapeaux --force --wait --reconnectà la commande (ie mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).

Remarque importante: Il était nécessaire d'effectuer les deux étapes, car si je ne prenais pas la peine d'apporter les modifications au fichier /etc/my.cnf ainsi que d'ajouter ces indicateurs, certaines tables manquaient 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)

Luke Schoen
la source
2
J'obtiens l'erreur même après avoir suivi toutes les instructions.
Santosh Hegde
Pour ceux qui exécutent ce problème dans un hôte partagé et ne peuvent pas modifier le fichier de configuration, cette solution fonctionne très bien.
Felipe Costa
@SantoshHegde Il est peut-être trop tard, mais après avoir modifié le my.cnf, vous devez redémarrer votre service mysql.
Jason Liu
11

J'ai eu le même problème mais changer max_allowed_packet dans le fichier my.ini / my.cnf sous [mysqld] a fait l'affaire.

ajouter une ligne

max_allowed_packet=500M

redémarrez maintenant le service MySQL une fois que vous avez terminé.

Sathish D
la source
@babonk oui mais cette réponse est plus utile car elle indique dans quelle section elle doit aller
Jason Wheeler
11

Vous pouvez également vous connecter à la base de données en tant que root (ou privilège SUPER) et faire

set global max_allowed_packet=64*1024*1024;

ne nécessite pas de redémarrage MySQL également. Notez que vous devez corriger votre my.cnffichier comme indiqué dans d'autres solutions:

[mysqld]
max_allowed_packet=64M

Et confirmez la modification après avoir redémarré 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 / d'arrêt qui peuvent ne pas survivre aux mises à jour et aux correctifs du système.

Comme demandé, j'ajoute ma propre réponse ici. Heureux de voir que cela fonctionne!

ébloui
la source
9

La solution augmente les valeurs données par le wait_timeoutet les connect_timeoutparamètres dans votre fichier d'options, sous l' [mysqld]étiquette.

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 obtenez 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
set GLOBAL delayed_insert_timeout=100000

Blockquote

RGA
la source
1
Génial. Cela m'aide à obtenir une autre erreur que je peux résoudre :)
jrosell
6

Deux choses pourraient se produire ici;

  • Votre INSERTfonctionne depuis longtemps et le client se déconnecte. Lorsqu'il se reconnecte, il ne sélectionne pas de base de données, d'où l'erreur. Une option ici consiste à exécuter votre fichier de commandes à partir de la ligne de commande et à sélectionner la base de données dans les arguments, comme ceci;

$ mysql nom_base <source.sql

  • Une autre consiste à exécuter votre commande via phpou dans 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.
Chris Henry
la source
Une autre chose à noter est que j'obtiens l'erreur presque immédiatement après la sourcecommande
bgcode
Si vous obtenez l'erreur immédiatement après la commande source, alors il est probable que MySQL n'aime pas quelque chose à propos de la requête. Avez-vous vérifié le journal général?
Chris Henry
Je dois comprendre comment vérifier le journal général .. Im sur MAMP et je ne suis pas sûr qu'il l'écrit par défaut.
bgcode
J'ai choisi de le résoudre avec des requêtes PHP et de le découper.
bgcode
5

Si vous êtes sur Mac et avez installé mysql via brew comme moi, ce qui suit a fonctionné.

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

Source: Pour les installations homebrew mysql, où est my.cnf?

  1. ajouter max_allowed_packet=1073741824à/usr/local/etc/my.cnf

  2. mysql.server restart

Rahul
la source
2

J'ai rencontré cette erreur lorsque j'utilise Mysql Cluster, je ne sais pas si cette question provient d'une utilisation de cluster ou non. Comme l'erreur est exactement la même, donnez ma solution ici. Obtention de cette erreur car les nœuds de données se bloquent soudainement. Mais lorsque les nœuds se bloquent, vous pouvez toujours obtenir le résultat correct en utilisant cmd:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

Et le mysqld fonctionne également correctement. Donc, au début, je ne peux pas comprendre ce qui ne va pas. Et environ 5 minutes plus tard, le résultat ndb_mgm montre qu'aucun nœud de données ne fonctionne. Ensuite, je me rends compte du problème. Alors, essayez de redémarrer tous les nœuds de données, puis le serveur mysql est de retour et tout est OK.

Mais une chose est bizarre pour moi, après avoir perdu le serveur mysql pour certaines requêtes, lorsque j'utilise cmd like 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.

zhihong
la source
1

Pour amazon RDS (c'est mon cas), vous pouvez changer la max_allowed_packetvaleur du paramètre en n'importe quelle valeur numérique en octets qui a du sens pour les plus grandes données dans n'importe quel insert que vous pourriez avoir (par exemple: si vous avez des valeurs de blob de 50 Mo dans votre insert, définissez le max_allowed_packetà 64M = 67108864), dans un nouveau ou existant parameter-group. Ensuite, appliquez ce groupe de paramètres à votre instance MySQL (peut nécessiter un redémarrage de l'instance).

SebaGra
la source
Si vous travaillez avec Amazon RDS, cela fonctionne. Vous ne pouvez pas définir de valeurs globales dans RDS, comme indiqué par SebaGra, si vous modifiez le groupe de paramètres personnalisés de votre base de données, recherchez le max_allowed_packet parameteret définissez-le à la taille appropriée (ou si vous avez de très gros blobs, définissez-le simplement sur la valeur maximale 1073741824 ) cela devrait fonctionner.
G_Style
Avez-vous obtenu un échec cohérent lors du chargement du même ensemble de données ou complètement aléatoire? demander parce que j'ai le même problème mais son complètement aléatoire, échouera 5 fois et fonctionnera le 5. De plus, passer à ma machine locale et exécuter à partir de Visual Studio semble aider, mais je vais toujours rencontrer l'erreur de temps en temps.
BilliD
0

S'il se reconnecte et obtient l'ID de connexion 2, le serveur vient presque définitivement de planter.

Contactez l'administrateur du serveur et demandez-lui 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 ait commis de grosses erreurs opérationnelles telles que l'attribution de tailles de mémoire tampon supérieures aux limites de l'espace d'adressage 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.

MarkR
la source
0

C'est plus un problème rare mais je l'ai vu si quelqu'un a copié tout le répertoire / var / lib / mysql comme moyen de migrer leur base de données vers un autre serveur. La raison pour laquelle cela ne fonctionne pas est 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 également à copier les fichiers / var / log / mysql.

Areeb Soo Yasir
la source
0

Pour les utilisateurs de Drupal 8 à la recherche d'une solution pour l'échec de l'importation de base de données:

À la fin du fichier de vidage sql, il peut y avoir des commandes insérant des données dans la table "webprofiler". C'est, je suppose, un fichier journal de débogage et ce n'est pas vraiment important pour que le site fonctionne, donc tout cela peut être supprimé. J'ai supprimé toutes ces insertions, y compris LOCK TABLES et UNLOCK TABLES (et tout le reste). C'est tout en bas du fichier sql. Le problème est décrit ici:

https://www.drupal.org/project/devel/issues/2723437

Mais il n'y a pas d'autre solution que de tronquer ce tableau.

BTW J'ai essayé toutes les solutions des réponses ci-dessus et rien d'autre n'a aidé.

MilanG
la source
0

J'ai essayé toutes les solutions ci-dessus, toutes ont échoué.

J'ai fini par utiliser -h 127.0.0.1au lieu d'utiliser par défaut var/run/mysqld/mysqld.sock.

osexp2003
la source
0

Ce message d'erreur se produit également lorsque vous avez créé le SCHEMA avec une COLLATION différente de celle qui est utilisée dans le vidage. Donc, si le vidage contient

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

vous devez également en tenir compte dans le classement SCHEMA:

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

J'utilisais utf8mb4_general_ci dans le schéma, car mon script provenait d'une nouvelle installation V8, le chargement d'une base de données sur l'ancien 5.7 s'est écrasé et m'a rendu presque fou.

Donc, peut-être que cela vous aide à économiser des heures frustrantes ... :-)

(MacOS 10.3, mysql 5.7)

4braincells
la source
-1

si aucune de ces réponses ne vous résout le problème, je l'ai résolu en supprimant les tables et en les recréant automatiquement de cette manière:

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

utilisez ensuite cette sauvegarde avec votre base de données et elle supprimera et recréera les tables dont vous avez besoin.

Ensuite, vous sauvegardez uniquement les données, et faites de même, et cela fonctionnera.

El Abogato
la source
-3

Que diriez-vous d'utiliser le client mysql comme ceci:

mysql -h <hostname> -u username -p <databasename> < file.sql
ErJab
la source
Cela ne fonctionnera pas si le fichier sql est trop gros ... c'est de cela qu'il s'agit.
lesolorzanov