web-dev-qa-db-fra.com

MySQL - Problèmes MySQLDump avec une grande table

J'ai une base de données MySQL de 10,6 Go - qui contient à la fois des tables MyISAM et InnoDB. Un tableau particulier (appelé "réponses") est de 8 Go - ce tableau est InnoDB.

La base de données en direct est répliquée sur un autre serveur et je fais des sauvegardes à l'aide de MySQLDump à partir du serveur de réplication ... le serveur en direct exécute Windows, mais le serveur de réplication exécute CentOS.

La commande MySQLDump est:

mysqldump --verbose --lock-tables=true --max-allowed-packet=1024M --Host=192.168.1.182 --user=myusername --password=mypassword --opt --databases databasename > databasename.sql

La commande s'exécute jusqu'à mi-chemin dans la table des "réponses" - lorsque nous obtenons: Erreur 2013 - Perte de connexion au serveur MySQL lors de la requête lors du vidage des réponses de la table à la ligne 12891212

Après quelques recherches sur Google, j'ai essayé d'ajouter les commandes suivantes à MySQLDump (indépendamment et en même temps):

--net-buffer-length=32704

et

--skip-extended-insert

L'erreur s'est toujours produite au même endroit.

Pour être complet, j'ai essayé de vider la base de données dans NaviCat et MySQL Workbench - les deux renvoient la même erreur.

Alors, je me suis demandé si c'était un problème de corruption. J'ai essayé d'exécuter ce qui suit (sur le serveur de réplication):

CHECK TABLE responses;

et

CHECK TABLE responses EXTENDED;

Les deux ont renvoyé ce qui suit: Erreur 2013 - Perte de connexion au serveur MySQL pendant la requête.

La base de données en direct est TRÈS occupée, donc je suis un peu inquiet ... J'ai commencé CHECK TABLE sur la table en direct, mais sans surprise, cela a provoqué l'arrêt de l'application, j'ai donc dû l'arrêter.

Tout conseil serait le bienvenu ici ... le but ultime est de faire fonctionner les sauvegardes à l'aide de MySQLDump.

Merci

Mise à jour: j'ai essayé de copier la table (sur le serveur de réplication) vers une nouvelle base de données sur un autre serveur en utilisant NaviCat - elle a échoué avec le même message (enregistrements transférés: 12 889 214): Erreur 2013 - Perte de connexion au serveur MySQL pendant la requête

7
JezB

Votre problème provient du réseau. Dans ce cas, il ne s'agit pas du tampon utilisé pour la transmission de données sur le réseau. C'est la durée pendant laquelle le réseau essaie de rester en vie.

Veuillez noter ces options:

  • net_read_timeout (par défaut 30): Le nombre de secondes pour attendre plus de données d'une connexion avant d'interrompre la lecture. Lorsque le serveur lit à partir du client, net_read_timeout est la valeur de délai d'expiration contrôlant quand abandonner. Lorsque le serveur écrit sur le client, net_write_timeout est la valeur de délai d'expiration contrôlant le moment de l'abandon. Voir aussi slave_net_timeout.
  • net_write_timeout (Par défaut 60): Le nombre de secondes pour attendre qu'un bloc soit écrit sur une connexion avant d'interrompre l'écriture. Voir aussi net_read_timeout.

Vous avez un serveur occupé et, à un moment donné, les données que vous devez lire pour que mysqldump se poursuive expirent.

Ce que j'ai fait dans le passé, c'est exécuter ce qui suit sur les serveurs source et cible:

mysql> SET GLOBAL net_read_timeout = 31536000;
mysql> SET GLOBAL net_write_timeout = 31536000; 

Ensuite, lancez le mysqldump.

La définition de ces valeurs très élevées force la connexion à la base de données mysqldump à attendre longtemps avant que les données soient expédiées. Si vous vous demandez, le nombre 31536000 est le nombre de secondes dans une année (365 * 24 * 60 * 60). La connexion à la base de données mysqldump devra simplement rester et attendre, même pour votre serveur occupé, jusqu'à ce que les données arrivent (éventuellement). Veuillez consulter mon message de Jan 12, 2012: Le client expire, tandis que la requête MySQL continue de fonctionner?

Donnez-lui un essai !!!

MISE À JOUR 2018-01-04 09:53 EST

j'ai remarqué votre commentaire tout à l'heure

Veuillez noter le message d'erreur que vous avez reçu de mysqldump:

Erreur 2013 - Perte de connexion au serveur MySQL pendant la requête lors du vidage des réponses de la table à la ligne 12891212

Veuillez noter le numéro de ligne 12891212. Si ce numéro de ligne revient dans le message d'erreur à chaque fois que votre mysqldump échoue, alors vous pouvez peut-être soupçonner une corruption des données. Cependant, si vous obtenez un numéro de ligne différent à chaque tentative de mysqldump, cela suggère que la connexion mysqldump est capable de se déplacer le long de la grande table et juste de timeout et d'un point aléatoire.

Veuillez définir ces valeurs et réessayer le mysqldump. Revenez ensuite nous raconter ce qui s'est passé.

7
RolandoMySQLDBA