MySQL Server a disparu lors de l'importation d'un gros fichier sql

259

J'ai essayé d'importer un gros fichier sql via phpMyAdmin ... Mais il continuait d'afficher une erreur

«Le serveur MySql est parti»

Que faire?

FrancisMV123
la source
3
Quelles sont vos valeurs pour max_allowed_packet et wait_timeout?
daemonofchaos
1
vous pouvez essayer de doubler max_allowed_packet. Un peu grossier, mais si cela fonctionne, vous pouvez trouver une valeur saine.
Nanne
1
Merci pour le rire Cole Johnson. C'était génial! LOL! :)
mbrinson
Je le vois souvent, par hasard. Mais je ne peux pas reproduire la même erreur à nouveau. Et, donc réalisé qu'il pourrait être dynamique. Parfois, si le client envoie trop de SQL au serveur (par exemple à partir d'une boucle), cela peut se produire. Il est important de trouver la raison réelle de cette erreur. Vérifiez également dans vos journaux de requête la répétition des modèles de SQL pour découvrir les indices.
Bimal Poudel
parfois, vous obtenez cela lorsque votre espace disque est faible
pramodtech

Réponses:

376

Comme indiqué ici :

Les deux raisons (et corrections) les plus courantes pour le serveur MySQL ont disparu (erreur 2006):

Le serveur a expiré et a fermé la connexion. Comment réparer:

  1. vérifiez que la variable wait_timeout dans le fichier de configuration my.cnf de votre mysqld est suffisamment grande. Sur Debian:, sudo nano /etc/mysql/my.cnfdéfinissez les wait_timeout = 600secondes (vous pouvez modifier / diminuer cette valeur lorsque l'erreur 2006 a disparu), puis sudo /etc/init.d/mysql restart. Je n'ai pas vérifié, mais la valeur par défaut de wait_timeout pourrait être d'environ 28800 secondes (8 heures).

  2. Le serveur a supprimé un paquet incorrect ou trop volumineux. Si mysqld obtient un paquet trop volumineux ou incorrect, il suppose que quelque chose s'est mal passé avec le client et ferme la connexion. Vous pouvez augmenter la limite maximale de taille de paquet en augmentant la valeur de max_allowed_packet dans le fichier my.cnf. Sur Debian:, sudo nano /etc/mysql/my.cnfdéfinissez max_allowed_packet = 64M(vous pouvez modifier / diminuer cette valeur lorsque l'erreur 2006 a disparu), puis sudo /etc/init.d/mysql restart.

Éditer:

Notez que les fichiers d'options MySQL n'ont pas leurs commandes déjà disponibles en tant que commentaires (comme dans php.ini par exemple). Donc , vous devez saisir tout changement / tweak dans my.cnfou my.iniet placez - les dans le mysql/datarépertoire ou dans l' une des autres voies, dans le groupe approprié d'options telles que [client], [myslqd], etc. Par exemple:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Redémarrez ensuite le serveur. Pour obtenir leurs valeurs, saisissez le client mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;
GBD
la source
72
Dans mon cas, c'était la variable max_allowed_packet . Il a été défini sur une valeur par défaut de 1 Mo (vous pouvez le voir en exécutant la SHOW VARIABLESrequête MySQL) et le fichier que j'importais avait quelques enregistrements très volumineux. J'ai ouvert le fichier my.ini (j'utilisais Windows) et ai défini la valeur à ceci :,max_allowed_packet = 64M redémarré MySQL et relancé l'importation.
Brent Matzelle
Je téléchargeais de gros fichiers dans la base de données avec des webissues. Cela a aidé, merci ... :-)
inf3rno
@BrentMatzelle Cela a certainement résolu le problème "Mysql a disparu". Merci!
asprin
2
Je ne trouve pas de wait_timeoutligne
Oki Erie Rinaldi
5
en cas de fenêtres (avec Xampp) c'était le fichier my.ini et innodb_lock_wait_timeout
Ananda
98

Pour moi, cette solution n'a pas fonctionné, j'ai donc exécuté

SET GLOBAL max_allowed_packet=1073741824;

dans mon client SQL.

Si vous ne pouvez pas changer cela avec le service MYSql en cours d'exécution, vous devez arrêter le service et modifier la variable dans le fichier "my.ini".

Par exemple:

max_allowed_packet=20M
salsinga
la source
1
Cela a fonctionné pour moi sur MAMP (OS X), contrairement aux autres réponses les plus populaires. Mais est-ce permanent?
atwixtor
2
@atwixtor no, la définition de variables comme celle-ci fonctionne jusqu'au redémarrage du serveur. puis ils sont réinitialisés à la valeur par défaut.
d.raev
1
Cela a fait l'affaire, sur une machine XAMPP de test sous Windows, j'ai dû modifier à la fois le php.inifichier (comme suggéré par @GBD dans la réponse) et le fichier de configuration MySQL my.inipour le faire fonctionner.
Gruber
2
Je suggère d'ajouter que vous pouvez vérifier la taille actuelle avecSHOW variables LIKE 'max_allowed_packet'
Arth
Ce n'est pas permanent dans la mesure où la valeur sera réinitialisée au redémarrage du serveur (éventuellement), mais ce n'est pas seulement pour la session en cours. Définir le max_allowed_packetdans un client puis importer le gros .sqlfichier dans une autre session fonctionnera correctement.
VoteyDisciple
21

Si vous travaillez sur XAMPP, vous pouvez résoudre le problème de disparition du serveur MySQL avec les modifications suivantes.

ouvrez votre fichier my.ini mon emplacement my.ini est (D: \ xampp \ mysql \ bin \ my.ini)

modifier les valeurs de variable suivantes

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500
Mohan Gathala
la source
samp for wamp, max_allowed_packet = 64M
Andrew
19

Si vous utilisez des valeurs par défaut, vous avez beaucoup de place pour optimiser votre configuration mysql.

La première étape que je recommande est d'augmenter le max_allowed_packet à 128M.

Téléchargez ensuite le script MySQL Tuning Primer et exécutez-le. Il fournira des recommandations à plusieurs facettes de votre configuration pour de meilleures performances.

Regardez également dans l'ajustement de vos valeurs de délai d'expiration à la fois dans MySQL et PHP.

Quelle est la taille (taille du fichier) du fichier que vous importez et pouvez-vous importer le fichier à l'aide du client de ligne de commande mysql au lieu de PHPMyAdmin?

daemonofchaos
la source
Merci, j'avais déjà max_allowed_packet réglé sur 16M, puis j'ai trouvé cette question et l'a élevée à 32M en pensant que ce serait sûrement suffisant, mais j'ai ensuite vu votre réponse et 128M fonctionnent définitivement. Je suppose que la totalité de l'instruction SQL à l'intérieur du fichier * .sql est traitée comme un seul paquet?
Elijah Lynn
8

Si vous utilisez MAMP sur OS X, vous devrez modifier la max_allowed_packetvaleur dans le modèle pour MySQL.

  1. Vous pouvez le trouver sur: Fichier> Modifier le modèle> MySQL my.cnf

  2. Ensuite, recherchez max_allowed_packet, modifiez la valeur et enregistrez.

askthebigo
la source
6

J'ai résolu mon problème avec ce court fichier /etc/mysql/my.cnf:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M
Dan.faudemer
la source
1
a confirmé que cela fonctionne également pour MySQL v5.6.12 sur WAMP: sous Windows, ajoutez les lignes "wait_timeout" et "max_allowed_packet" ci-dessus à la section [mysqld] de: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok
Merci @dan a résolu mon problème d'un an haha, je n'ai jamais ajouté ces paramètres dans la section[mysqld]
shivgre
Cela fonctionne pour MySQL v5.7. my-default.ini n'est pas créé par défaut, vous devez donc le créer.
Rodolfo Velasco
5

L'autre raison pour laquelle cela peut arriver est le manque de mémoire. Vérifiez / var / log / messages et assurez-vous que votre my.cnf n'est pas configuré pour que mysqld alloue plus de mémoire que votre machine.

Votre processus mysqld peut en fait être tué par le noyau puis redémarré par le processus "safe_mysqld" sans que vous vous en rendiez compte.

Utilisez top et regardez l'allocation de mémoire pendant qu'il fonctionne pour voir votre marge.

effectuez une sauvegarde de my.cnf avant de le modifier.

TekOps
la source
C'est ce qui causait mon problème. J'ai ajouté un fichier d'échange de 1 Go et je l'ai complètement corrigé.
Pikamander2
5

J'ai eu cette erreur et d'autres liées lorsque j'ai importé un fichier SQL de 16 Go. Pour moi, éditer my.ini et définir ce qui suit (basé sur plusieurs articles différents) dans la section [mysqld]:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Si vous exécutez sous Windows, accédez au panneau de configuration, aux services et examinez les détails de MySQL et vous verrez où se trouve my.ini. Ensuite, après avoir modifié et enregistré my.ini, redémarrez le service mysql (ou redémarrez l'ordinateur).

Si vous utilisez HeidiSQL, vous pouvez également définir tout ou partie de ceux-ci en utilisant cela.

BenV136
la source
2

J'ai mis à jour "max_allowed_packet" à 1024M, mais cela ne fonctionnait toujours pas. Il s'avère que mon script de déploiement était en cours d'exécution:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Assurez-vous de spécifier explicitement un plus grand nombre à partir de la ligne de commande si vous le donnez de cette façon.

coderama
la source
2

Si vos données incluent des BLOBdonnées:

Notez qu'une importation de données à partir de la ligne de commande semble s'étouffer avec les données BLOB, ce qui entraîne l'erreur «Le serveur MySQL est parti».

Pour éviter cela, recréez mysqldump mais avec le --hex-blobdrapeau:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

qui écrira le fichier de données avec des valeurs hexadécimales plutôt que binaires entre autres textes.

PhpMyAdmin a également l'option "Dump des colonnes binaires en notation hexadécimale (par exemple," abc "devient 0x616263)" qui fonctionne bien.

Notez qu'il existe un bogue de longue date (en décembre 2015) qui signifie que les GEOMcolonnes ne sont pas converties: Sauvegarder une table avec une colonne GEOMETRY en utilisant mysqldump? donc l'utilisation d'un programme comme PhpMyAdmin semble être la seule solution de contournement (l'option notée ci-dessus convertit correctement les colonnes GEOM).

fooquency
la source
1

Si l'échec est long, agrandissez la wait_timeoutvariable.

S'il échoue immédiatement, agrandissez la max_allowed_packetvariable; Si cela ne fonctionne toujours pas, assurez-vous que la commande est valide en SQL. Le mien avait des citations sans faille qui ont tout foiré.

En outre, si possible, envisagez de limiter le nombre d'insertions d'une seule commande SQL à, disons, 1000. Vous pouvez créer un script qui crée plusieurs instructions à partir d'une seule en réintroduisant la partie INSERT ... toutes les n insertions.

e18r
la source
1

j'ai une erreur similaire .. pour résoudre ce problème, ouvrez simplement mon fichier .ini .. ici, à la ligne no 36, changez la valeur de la taille de paquet maximale autorisée, c'est-à-dire. max_allowed_packet = 20M

parag jain
la source
1

Assurez-vous que le processus mysqld ne redémarre pas à cause de gestionnaires de services comme systemd.

J'ai eu ce problème dans vagrant avec centos 7. Les réglages de configuration n'ont pas aidé. Il s'est avéré que c'était systemd qui tuait le service mysqld à chaque fois qu'il prenait trop de mémoire.

tvorog
la source
0

J'ai eu une erreur similaire aujourd'hui lors de la duplication de la base de données (le serveur MySQL est parti ...), mais lorsque j'ai essayé de redémarrer le redémarrage de mysql.server, j'ai eu une erreur

ERROR! The server quit without updating PID ...

Voici comment je l'ai résolu: j'ai ouvert Applications / Utilitaires / et j'ai exécuté Activity Monitor

 quit mysqld

a ensuite pu résoudre le problème d'erreur avec

mysql.server restart
Kingsley Ijomah
la source
0

Je fais de gros calculs qui impliquent la connexion mysql pour rester longtemps et avec des données lourdes. je faisais face à ce "problème de rejets de Mysql". J'ai donc essayé d'optimiser les requêtes mais cela ne m'a pas aidé alors j'ai augmenté la limite des variables mysql qui est définie sur une valeur inférieure par défaut.

wait_timeout max_allowed_packet

À la limite de ce qui vous convient, ce devrait être n'importe quel nombre * 1024 (octets). vous pouvez vous connecter au terminal en utilisant la commande ' mysql -u username - p ' et pouvez vérifier et modifier ces limites de variables.

Ashish Dev swami
la source
0

Pour l'hébergement partagé GoDaddy

Sur les comptes d'hébergement partagé GoDaddy, il est difficile de modifier les fichiers PHP.ini, etc. Cependant, il existe un autre moyen et cela a parfaitement fonctionné pour moi. (Je viens de télécharger avec succès un fichier texte .sql de 3,8 Mo, contenant 3100 lignes et 145 cols. En utilisant la commande IMPORT dans phpMyAdmin, j'obtenais l' erreur redoutée du serveur MySQL et aucune autre information.)

J'ai trouvé que Matt Butcher avait la bonne réponse. Comme Matt, j'avais essayé toutes sortes de trucs, de l'exportation de bases de données MySQL en petits morceaux jusqu'à l'écriture de scripts qui divisent les grandes importations en plus petites. Mais voici ce qui a fonctionné:

(1) CPANEL ---> FICHIERS (groupe) ---> SAUVEGARDE

(2a) Sous la rubrique "Sauvegardes partielles" ...
(2b) Sous "Télécharger une sauvegarde de base de données MySQL"
(2c) Choisissez votre base de données et téléchargez une sauvegarde (cette étape est facultative, mais sage)

(3a) Directement à droite de 2b, sous la rubrique "Restaurer une sauvegarde de base de données MySQL"
(3b) Choisissez le fichier d'importation .SQL depuis votre disque local
(3c) Le vrai bonheur sera le vôtre (peu de temps ....) Le mien a pris environ 5 secondes

J'ai pu utiliser cette méthode pour importer une seule table. Rien d'autre dans ma base de données n'a été affecté - mais c'est ce contre quoi l'étape (2) ci-dessus est destinée à se protéger.

Remarques:
a. Si vous ne savez pas comment créer un fichier d'importation .SQL, utilisez phpMyAdmin pour exporter une table et modifier cette structure de fichier.

SOURCE: Article de Matt Butcher 2010

cssyphus
la source
D'accord, donc un downvote immédiat, mais aucun commentaire sur la raison. Cette information n'a-t-elle pas fonctionné pour quelqu'un? Si oui, veuillez partager - cela a fonctionné pour moi, c'est pourquoi j'ai ajouté cette réponse. Les autres réponses ci-dessus n'ont pas fonctionné pour moi, mais cette solution a fonctionné. Alors pourquoi le downvote? Si vous êtes sur GoDaddy et que cela ne fonctionne pas pour vous, je voudrais savoir pour que je puisse vous aider. Cependant, si vous n'utilisez pas l'hébergement partagé GoDaddy, pourquoi rejeteriez-vous cette réponse simplement parce qu'elle ne s'applique pas à vous ?
cssyphus
0

Si l'augmentation max_allowed_packetn'aide pas.

J'obtenais la même erreur que vous lors de l'importation d'un .sqlfichier dans ma base de données via Sequel Pro.

L'erreur a persisté après avoir augmenté le max_allowed_packetto 512M, j'ai donc exécuté l'importation dans la ligne de commande à la place avec:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Il a donné l'erreur suivante:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

J'ai trouvé quelques questions utiles sur StackOverflow:

Dans mon cas, mon .sqlfichier était un peu corrompu ou quelque chose. Le vidage MySQL que nous obtenons est livré dans deux fichiers zip qui doivent être concaténés ensemble puis décompressés. Je pense que la décompression a été interrompue au départ, laissant le fichier avec quelques caractères et encodages étranges. Obtenir un nouveau vidage MySQL et le décompresser correctement a fonctionné pour moi.

Je voulais juste ajouter ceci ici au cas où d'autres trouveraient que l'augmentation de la max_allowed_packetvariable n'aidait pas.

Joshua Pinter
la source
0

J'ai le même problème avec

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

Dans le fichier \ xampp \ mysql \ bin \ my.ini de phpmyadmin nous obtenons seulement

[mysqldump]
max_allowed_packet=110M

qui est juste pour mysqldump -u root -p dbname. J'ai résolu mon problème en remplaçant le code ci-dessus par

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
Amir Khan
la source