Erreur MySQL 2006: le serveur mysql est parti

238

J'exécute un serveur à mon bureau pour traiter certains fichiers et rapporter les résultats à un serveur MySQL distant.

Le traitement des fichiers prend un certain temps et le processus se termine à mi-chemin avec l'erreur suivante:

2006, MySQL server has gone away

J'ai entendu parler du paramètre MySQL, wait_timeout , mais dois-je le changer sur le serveur de mon bureau ou sur le serveur MySQL distant?

flotteur
la source
2
cela dépend de ce serveur de sorcière donne l'erreur
bksi
2
doublon possible d' ERREUR 2006 (HY000): le serveur MySQL est parti
Simon East
11
Pour les personnes arrivant ici de Google: si la modification de la max_allowed_packettaille ou du wait_timeoutmontant ne le résout pas, vérifiez votre utilisation de la mémoire. J'obtenais la même erreur et cela était dû à un manque de mémoire sur mon serveur. J'ai ajouté un fichier d'échange de 1 Go et cela l'a corrigé.
Pikamander2
2
@ Pikamander2 merci pour l'astuce!
ihsan
4
Oh! Ce ne sont donc que des mensonges? Le serveur Mysql n'est vraiment allé nulle part? C'est toujours là sur mon serveur? Whao! :))
Damilola Olowookere

Réponses:

32

Il peut être plus facile de vérifier la connexion et de la rétablir si nécessaire.

Voir PHP: mysqli_ping pour plus d'informations à ce sujet.

Niet l'Absolu Noir
la source
Bon point, si vous avez un processus intermittent, il est préférable de libérer votre connexion afin de ne pas utiliser toutes les connexions. La reconstruction de la connexion est généralement bon marché. +1
Yzmir Ramirez
1
en 2018: mysqli_ping est déprécié
fb
@fb qu'est-ce qui est utilisé pour faire ça avec PDO?
beppe9000
359

Je l'ai rencontré plusieurs fois et j'ai normalement trouvé que la réponse était un paramètre par défaut très bas max_allowed_packet.

L'augmentation de /etc/my.cnf(sous [mysqld]) à 8 ou 16M le corrige généralement. (La valeur par défaut dans MySql 5.7 est 4194304, qui est de 4 Mo.)

[mysqld]
max_allowed_packet=16M

Remarque: il suffit de créer la ligne si elle n'existe pas

Remarque: cela peut être défini sur votre serveur pendant son fonctionnement.

Utilisez set global max_allowed_packet=104857600. Cela le définit à 100 Mo.

George
la source
28
Notez que cela peut être défini sur votre serveur pendant son fonctionnement. Utilisez: "set global max_allowed_packet = 104857600". REMARQUE: ma valeur la définit à 100 Mo.
rickumali
26
Pour les utilisateurs de xampp, le my.cnf peut être trouvé à: C: \ xampp \ mysql \ bin \
Valentin Despa
3
sur WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, définissez max_allowed_packet = 500M sous [wampmysqld]
Elia Weiss
2
Correction de mon problème aussi :)
Altaf Hussain
2
Remarque importante: j'ai dû redémarrer mon serveur mysql pour que cet effet prenne effet. c'est-à mysql.server stop- dire , mysql.server start(octobre 2018, MySQL v5.7, MacOS)
Nitin Nain
41

J'ai eu le même problème mais en changeant max_allowed_packetle my.ini/my.cnffichier sous[mysqld] fait l'affaire.

ajouter une ligne

max_allowed_packet = 500M

maintenant restart the MySQL serviceune fois que vous avez terminé.

Sathish D
la source
5
L'autre gars a écrit 16M, vous écrivez 500M, quelle est la signification de ce paramètre?
pal4life
1
@ pal4life La taille maximale des instructions d'insertion est autorisée. Que se passe-t-il si votre instruction d'insertion est supérieure à 16 Mo (si l'instruction consiste en des colonnes longues ou plus) Pour être plus sûr, rendez-la énorme comme 500 Mo si vous insérez une énorme quantité de données.
Sathish D
Cela a fonctionné pour moi mais je ne sais pas pourquoi. La valeur par défaut était 1M mais quand je l'ai changé en 100M, l'erreur a disparu. Le problème a commencé lorsque j'ai défini wait_timeout = 30 pour tenter de réduire le nombre de threads inactifs sur mon serveur.
Vincent
36

J'ai utilisé la commande suivante dans la ligne de commande MySQL pour restaurer une base de données MySQL d'une taille supérieure à 7 Go, et cela fonctionne.

set global max_allowed_packet=268435456;
Geshan Ravindu
la source
me demande pourquoi cela a-t-il été rejeté? est logique que l'erreur soit liée à la taille du paquet ...
FlorinelChis
Cela a résolu mon problème, ce n'est pas directement lié à la question, mais cela devrait aider les gens à avoir cet autre problème.
Migerusantte
Pour vérifier si modifié ou afficher la valeur actuelle, on peut utilisershow variables like 'max_allowed_packet';
Marcin
16

Erreur: 2006 ( CR_SERVER_GONE_ERROR )

Message: le serveur MySQL est parti

En général, vous pouvez réessayer de vous connecter, puis refaire la requête pour résoudre ce problème - essayez 3-4 fois avant d'abandonner complètement.

Je suppose que vous utilisez PDO. Si tel est le cas, vous interceptez l'exception PDO, incrémentez un compteur, puis réessayez si le compteur est inférieur à un seuil.

Si vous avez une requête qui provoque un délai d'attente, vous pouvez définir cette variable en exécutant:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

Où 300 est le nombre de secondes que vous pensez que la durée maximale de la requête pourrait prendre.

Plus d'informations sur la façon de traiter les problèmes de connexion Mysql.

EDIT: Deux autres paramètres que vous pouvez également utiliser sont net_write_timeoutet net_read_timeout.

Yzmir Ramirez
la source
16

Dans MAMP (version non-pro) j'ai ajouté

--max_allowed_packet=268435456

à ...\MAMP\bin\startMysql.sh

Crédits et plus de détails ici

uwe
la source
Merci beaucoup pour cela!
TechyDude
Travaux! Je vous remercie!
Simon Franzen
11

Cette erreur est due à l'expiration de wait_timeout.

Allez simplement sur le serveur mysql vérifier son wait_timeout:

mysql> AFFICHER LES VARIABLES COMME 'wait_timeout'

mysql> set global wait_timeout = 600 # 10 minute ou délai d'attente maximum dont vous avez besoin

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

Saurabh Goyal
la source
Je ne comprends pas pourquoi quelqu'un voterait contre cette réponse?! Cela m'a été utile.
Basil Musa du
11

Il y a plusieurs causes à cette erreur.

Concernant MySQL / MariaDB:

  • wait_timeout - Durée en secondes pendant laquelle le serveur attend qu'une connexion devienne active avant de la fermer.
  • interactive_timeout - Durée en secondes pendant laquelle le serveur attend une connexion interactive.
  • max_allowed_packet- Taille maximale en octets d'un paquet ou d'une chaîne générée / intermédiaire. Définissez la taille du BLOB le plus grand, par multiples de 1024.

Exemple de my.cnf :

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

Concernant le serveur:

  • Votre serveur a une mémoire pleine - vérifiez les informations sur la RAM avec free -h

Concernant le cadre:

  • Vérifiez les paramètres de votre framework. Django par exemple utiliser CONN_MAX_AGE(voir docs )

Comment le déboguer:

  • Vérifiez les valeurs des variables MySQL / MariaDB.
    • avec sql: SHOW VARIABLES LIKE '%time%';
    • ligne de commande: mysqladmin variables
  • Activez la verbosité pour les erreurs:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Consultez la documentation pour plus d'informations sur l'erreur
jozo
la source
9

Sous Windows, les gars utilisant xampp doivent utiliser ce chemin xampp / mysql / bin / my.ini et changer max_allowed_packet (sous la section [mysqld]) à la taille de votre choix. par exemple

max_allowed_packet=8M

Encore une fois sur php.ini (xampp / php / php.ini), changez upload_max_filesize la taille choisie. par exemple

upload_max_filesize=8M

M'a donné un mal de tête pendant un certain temps jusqu'à ce que je découvre cela. J'espère que ça aide.

Kenneth mwangi
la source
ce devrait être la réponse choisie
bysanchy
Je ne trouve pas de upload_max_filesizevariable. Il est toujours méconnu dans mon mysql
Aminah Nuraini
9

J'obtenais cette même erreur sur mon serveur DigitalOcean Ubuntu.

J'ai essayé de changer les paramètres max_allowed_packet et wait_timeout mais aucun d'eux ne l'a corrigé.

Il s'avère que mon serveur était à court de RAM. J'ai ajouté un fichier d'échange de 1 Go et cela a résolu mon problème.

Vérifiez votre mémoire avec free -hpour voir si c'est la cause.

Pikamander2
la source
1
Merci beaucoup! J'ai eu le même problème sur mon DigitalOcean et cette solution a fonctionné! J'ai exécuté de nombreuses instances de mon script mais après quelques threads, il s'est soudainement arrêté et a tué toutes les connexions existantes. Maintenant, tout va bien.
Stalinko
7

C'était un problème de RAM pour moi.

J'avais le même problème même sur un serveur avec 12 cœurs de processeur et 32 ​​Go de RAM. J'ai fait plus de recherches et j'ai essayé de libérer de la RAM. Voici la commande que j'ai utilisée sur Ubuntu 14.04 pour libérer de la RAM:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Et, il a tout réparé. Je l'ai mis sous cron pour fonctionner toutes les heures.

crontab -e

0 * * * * bash /root/ram.sh;

Et, vous pouvez utiliser cette commande pour vérifier la quantité de RAM disponible disponible:

free -h

Et vous obtiendrez quelque chose comme ceci:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G
Rehmat
la source
5

Dans mon cas, c'était une faible valeur de open_files_limit variable, qui bloquait l'accès de mysqld aux fichiers de données.

Je l'ai vérifié avec:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

Après avoir changé la variable en grande valeur, notre serveur était de nouveau en vie:

[mysqld]
open_files_limit = 100000
Fedir RYKHTIK
la source
5

Si vous utilisez le WAMPSERVER 64 bits, veuillez rechercher plusieurs occurrences de max_allowed_packet car WAMP utilise la valeur définie sous [wampmysqld64] et non la valeur définie sous [mysqldump], ce qui pour moi était le problème, je mettais à jour la mauvaise. Définissez ceci sur quelque chose comme max_allowed_packet = 64M.

Espérons que cela aide les autres utilisateurs de Wampserver.

Enomatix24
la source
5

Cela indique généralement des problèmes de connexion au serveur MySQL ou des délais d'expiration. Peut généralement être résolu en modifiant wait_timeout et max_allowed_packet dans my.cnf ou similaire.

Je suggère ces valeurs:

wait_timeout = 28800

max_allowed_packet = 8M

Note
la source
4

Pour Vagrant Box, assurez-vous d'allouer suffisamment de mémoire à la boîte

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
Shadoweb
la source
1
Merci pour cela :)
SynackSA
4

Le scénario peu probable est que vous disposez d'un pare-feu entre le client et le serveur qui force la réinitialisation TCP dans la connexion.

J'ai eu ce problème et j'ai trouvé que notre pare-feu F5 d'entreprise était configuré pour mettre fin aux sessions inactives inactives pendant plus de 5 minutes.

Encore une fois, c'est le scénario improbable.

Ahmed
la source
4

C'est toujours une bonne idée de vérifier les journaux du serveur Mysql, pour la raison pour laquelle il a disparu.

Cela vous le dira.

Alex
la source
4

Si vous utilisez un serveur xampp:

Allez dans xampp -> mysql -> bin -> my.ini

Modifier le paramètre ci-dessous:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Cela m'a beaucoup aidé :)

Archana Kamath
la source
3

décommentez la ligne ci-dessous dans votre my.ini/my.cnf, cela divisera votre gros fichier en portion plus petite

# binary logging format - mixed recommended
# binlog_format=mixed

À

# binary logging format - mixed recommended
binlog_format=mixed
Nico
la source
3

J'ai trouvé la solution à "# 2006 - Le serveur MySQL est parti" cette erreur. La solution consiste simplement à vérifier deux fichiers

  1. config.inc.php
  2. config.sample.inc.php

Le chemin de ces fichiers dans Windows est

C:\wamp64\apps\phpmyadmin4.6.4

Dans ces deux fichiers, la valeur de ceci:

$cfg['Servers'][$i]['host']must be 'localhost' .

Dans mon cas, c'était:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

changez-le en:

"$cfg['Servers'][$i]['host']" = 'localhost';

Assurez-vous dans les deux:

  1. config.inc.php
  2. fichiers config.sample.inc.php, il doit être «localhost».

Et dernier set:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Redémarrez ensuite Wampserver.


Pour modifier le nom d'utilisateur et le mot de passe phpmyadmin

Vous pouvez directement changer le nom d'utilisateur et le mot de passe de phpmyadmin via le fichier config.inc.php

Ces deux lignes

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

Ici, vous pouvez donner un nouveau nom d'utilisateur et un nouveau mot de passe. Après les modifications, enregistrez le fichier et redémarrez le serveur WAMP.

euh la vie
la source
2

J'ai reçu le message d'erreur 2006 dans différents logiciels clients MySQL sur mon bureau Ubuntu. Il s'est avéré que ma version de pilote JDBC était trop ancienne.

Bo Guo
la source
2

Cela peut être dû à la taille de votre fichier .sql.

Si vous utilisez xampp. Allez dans le panneau de configuration de xampp -> Cliquez sur MySql config -> Open my.ini.

Augmentez la taille du paquet.

max_allowed_packet = 2M -> 10M
Nikunj Dhimar
la source
2

Il existe un moyen plus simple si vous utilisez XAMPP. Ouvrez le panneau de configuration XAMPP et cliquez sur le bouton de configuration dans la section mysql.
entrez la description de l'image ici

Maintenant, cliquez sur my.ini et il s'ouvrira dans l'éditeur. Mettez à jour le max_allowed_packet à votre taille requise.

entrez la description de l'image ici

Redémarrez ensuite le service mysql. Cliquez sur Arrêter sur le service Mysql, cliquez à nouveau sur Démarrer. Attendez quelques minutes. entrez la description de l'image ici entrez la description de l'image ici

Essayez ensuite d'exécuter à nouveau votre requête Mysql. J'espère que cela fonctionnera.

Hriju
la source
2

MAMP 5.3, vous ne trouverez pas my.cnf et les ajouter ne fonctionne pas car max_allowed_packet est stocké dans des variables.

Une solution peut être:

  1. Accédez à http: // localhost / phpmyadmin
  2. Accédez à l'onglet SQL
  3. Exécutez SHOW VARIABLES et vérifiez les valeurs, si elles sont petites, exécutez-les avec de grandes valeurs
  4. Exécutez la requête suivante, il a défini max_allowed_packet sur 7 Go:

    set global max_allowed_packet = 268435456;

Pour certains, vous devrez peut-être également augmenter les valeurs suivantes:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;
Rupak Nepali
la source
0

Pour les utilisateurs utilisant XAMPP, il y a 2 paramètres max_allowed_packet dans C: \ xampp \ mysql \ bin \ my.ini.

Subhash
la source
0

Cette erreur se produit essentiellement pour deux raisons.

  1. Vous avez une RAM trop faible.
  2. La connexion à la base de données est fermée lorsque vous essayez de vous connecter.

Vous pouvez essayer ce code ci-dessous.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

Il atténue l'erreur quelle qu'en soit la raison, en particulier pour la deuxième raison.

Si cela est dû à une faible RAM, vous devez soit augmenter l'efficacité de la connexion à la base de données à partir du code, de la configuration de la base de données, soit simplement augmenter la RAM.

Aminah Nuraini
la source
0

Juste au cas où cela aiderait quelqu'un:

J'ai eu cette erreur lorsque j'ai ouvert et fermé des connexions dans une fonction qui serait appelée depuis plusieurs parties de l'application. Nous avons obtenu trop de connexions, nous avons donc pensé que ce serait une bonne idée de réutiliser la connexion existante ou de la jeter et d'en créer une nouvelle comme ceci:

  public static function getConnection($database, $host, $user, $password)
 {
 if (!self::$instance) {
  return self::newConnection($database, $host, $user, $password);
 } elseif ($database . $host . $user != self::$connectionDetails) {

self :: $ instance-> query ('KILL CONNECTION_ID ()'); self :: $ instance = null; return self :: newConnection ($ base de données, $ hôte, $ utilisateur, $ mot de passe); } return self :: $ instance; } Eh bien, il s'avère que nous avons été un peu trop minutieux avec le massacre et que les processus faisant des choses importantes sur l'ancienne connexion n'ont jamais pu terminer leurs affaires. Nous avons donc abandonné ces lignes

  self::$instance->query('KILL CONNECTION_ID()');
  self::$instance = null;

et comme le matériel et la configuration de la machine le permettent, nous avons augmenté le nombre de connexions autorisées sur le serveur en ajoutant

max_connections = 500

à notre fichier de configuration. Cela a résolu notre problème pour l'instant et nous avons appris quelque chose sur la suppression des connexions mysql.

Max
la source
-5

Si vous savez que vous vous déconnectez pendant un certain temps, vous pouvez fermer votre connexion, effectuer votre traitement, vous reconnecter et rédiger vos rapports.

Joshua Martell
la source
2
C'est en fait une réponse viable, car MySQL ferme la connexion inactive après huit heures.
Bojan Hrnkas