Comment puis-je surveiller la progression d'une importation d'un fichier .sql volumineux?


145

J'importe un 7 Gofoobar.sqlrestaurer une table dans une base de données locale.

 $mysql -h localhost -u root 'my_data' < foobar.sql$ mysql --version
/usr/local/mysql/bin/mysql Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

Comment puis-je suivre ses progrès?

187

Si vous importez simplement à partir d'un fichier de vidage à partir de la CLI sous * nix, par exemple

mysql -uxxx -pxxx dbname < /sqlfile.sql

Ensuite, installez d'abord pipe viewer sur votre système d'exploitation, puis essayez quelque chose comme ça:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

qui affichera une barre de progression pendant l'exécution du programme.

C'est très utile et vous pouvez également l'utiliser pour obtenir une estimation de la progression de mysqldump.

pv dumps le sqlfile.sql et les passe à mysql (à cause de l'opérateur de pipe).Bien que ce soit le dumping, il montre les progrès.La chose intéressante est que mysql utilise les données aussi rapidement qu’il peut les faire progresser, de sorte que pv puisse afficher la progression de l’importation.Je n'ai aucune preuve.Mais il semble que oui.J'imagine que certains tampons sont utilisés, mais à un moment donné, je pense que mysql ne lit plus de données alors qu'il est encore occupé à traiter.

Pipe Viewer screenshot

  0

Je suppose que mysql pourrait avoir un tampon, dans lequel certaines données pourraient être transférées, sans être complètement "traitées" (c'est-à-dire que s'il échoue, pv peut avoir légèrement sur-rapporté ce qui entre réellement).Mais en général, c'est comme ça que les tuyaux fonctionnent.C'est la même raison pour laquelle vous pouvez faire '' 'sudo hd/dev/sda1 |less''' et ne pas avoir toute votre partition système en mémoire. 21 août. 152015-08-21 15:34:47

+1

@snapfractalpop 'pv' ne sera pas très précis dans la plupart des cas, car certains morceaux de code SQL prendront plus de temps que d’autres.Une ligne qui constitue une simple insertion sera beaucoup plus rapide qu'une ligne qui crée un index sur une table qui a déjà plusieurs lignes, par exemple.* Mais * une idée approximative de la progression de la sortie devrait être utile à moins que le tampon de lecture utilisé par 'mysql' soit particulièrement volumineux (pour une entrée de 7 Go, le tampon devrait être très volumineux pour rendre la sortie de' pv' inutile . 20 janv.. 162016-01-20 14:38:00

+1

@ DavidSpillett en effet.Votre commentaire reflète mon sentiment.Fondamentalement, pv est brut, mais efficace.Ce que j'aime le plus c'est sa généralité.Telle est la beauté des pipes Unix (merci McIlroy). 20 janv.. 162016-01-20 15:19:12

+1

@rob C'est un mec génial, pourriez-vous également donner un exemple avec 'mysqldump'? 26 mai. 162016-05-26 18:03:37

  0

Très belle solution!Si le mot de passe est manuel, pv n'attend pas qu'il affiche sa progression 10 févr.. 172017-02-10 14:40:46


15

Lorsque vous exécutez un mysqldump d'une base de données unique, toutes les tables sont vidées dans l'ordre alphabétique.

Naturellement, le rechargement de mysqldump dans une base de données se ferait également par ordre alphabétique.

Vous pouvez simplement faire une SHOW PROCESSLIST;et découvrez la connexion à la base de données exécutant mysqldump.Lorsque le vidage est rechargé, la connexion à la base de données disparaîtra.

Si vous voulez savoir quelles tables se trouvent dans le fichier de vidage, exécutez ceci contre foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

MISE À JOUR 2012-05-02 13:53 EDT

Désolé de ne pas avoir remarqué qu'il n'y a qu'une seule table.

Si la table est MyISAM, le seul moyen de surveiller est du point de vue du système d'exploitation.La raison?La table est verrouillée en écriture pendant le rechargement.Qu'est-ce que tu cherches?La taille des fichiers .MYD et .MYI .Bien sûr, vous devez comparer cela avec la taille de la table auparavant sur l'autre serveur de base de données que vous avez importé.

Si la table est InnoDB et que vous avez activé innodb_file_per_table , le seul moyen de surveiller le système est du point de vue du système d'exploitation.La raison?La table est verrouillée en écriture pendant le rechargement.Qu'est-ce que tu cherches?La taille du fichier .ibd .Bien sûr, vous devez comparer cela avec la taille de la table auparavant sur l'autre serveur de base de données que vous avez importé.

Si la table est InnoDB et que vous avezinnodb_file_per_tabledésactivé, même pas le point de vue du système d'exploitation peut aider.

MISE À JOUR 2012-05-02 13:56 EDT

Je me suis adressé à quelque chose comme ça l'année dernière: How do I get % progress for "type db.sql | mysql"

MISE À JOUR 2012-05-02 14:09 EDT

Depuis un mysqldump standard, le tableau est verrouillé de la manière suivante:

LOCK TABLES 'a' WRITE;
/*!40000 ALTER TABLE 'a' DISABLE KEYS */;
INSERT INTO 'a' VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE 'a' ENABLE KEYS */;
UNLOCK TABLES;

ensuite, il n’ya aucun moyen d’avancer avec mysql tant que le verrou de la table n’est pas libéré.

Si vous pouvez obtenir LOCK TABLES et UNLOCK TABLES commentés à partir du fichier de vidage ...

  • si la table est MyISAM, SELECT COUNT (*) fonctionnerait
  • Si la table est InnoDB, SELECT COUNT (*) ralentirait/arrêterait la charge jusqu'à ce que le décompte soit terminé.
  0

Ça a marché.Merci.Une dernière question est, par expérience, savez-vous si le temps d’importation est à peu près ** linéaire ** par rapport aux tailles de fichier '.MYD' et' .MYI'? 02 mai. 122012-05-02 21:06:12

+1

Le rechargement de la table est linéaire.Les reconstructions d'index sont linéaires.Il y a des années, ce n'était pas comme si j'avais osé poser cette question à MySQL (http://lists.mysql.com/mysql/202489) et j'en ai parlé dans DBA StackExchange (http://dba.stackexchange.com/a/2697/877) 02 mai. 122012-05-02 21:12:20


16

Si vous avez déjà lancé l'importation, vous pouvez exécuter cette commande dans une autre fenêtre pour voir la taille actuelle de vos bases de données.Cela peut être utile si vous connaissez la taille totale du fichier .sql que vous importez.

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB" 
FROM information_schema.TABLES GROUP BY table_schema; 

Crédit pour: http://forums.mysql.com/read.php?108,201578,201578


4

Comme solution pour quelqu'un qui ne peut pas faire travailler le pv ou pour qui le pv raconte des mensonges.Vous pouvez surveiller la taille du fichier ibdata1 dans/var/lib/mysql, qui contient les données.Cela aura la même taille (ou à peu près) de la taille du fichier sur votre serveur source.

S'il y a beaucoup de tables, vous pouvez aussi les regarder apparaître une par une dans/var/lib/mysql/.

Il m'est arrivé d'utiliser ce fait récemment lorsqu'une base de données à long terme avait constitué un fichier journal d'environ 20G sur une période de trois ou quatre ans.J'ai remarqué que le transfert prenait des siècles et utilisais cette technique pour suivre les progrès.

Je pense qu'il est hautement improbable que le jour se lève lorsqu'une base de données n'implique pas un fichier quelque part ou autrement.En attendant, vous pouvez surveiller le fichier pour voir comment un transfert progresse.La méthode que j’ai suggérée est quelque chose que vous pouvez faire sous une forme ou une autre depuis l’écriture de la première base de données SQL.Je n’ai jamais eu l’intention de suggérer que c’était une technique «officielle» à laquelle un jockey manuel pourrait avoir recours.Il suppose un niveau général de maîtrise de l’informatique en général et de l’unix en particulier.


1

Si vous voulez juste vérifier s’il est bloqué, vous pouvez interroger

show processlist; 

et voir ce qui est en cours d'exécution.


-3

Je suis tellement surpris que personne n'ait simplement posté l'option 'mysql -v'.Si cela reste bloqué, la sortie s'arrête.

+3

"Surveiller les progrès" signifie généralement essayer d'estimer l'état d'avancement du processus ou son achèvement, ce que 'mysql -v' n'offrira pas.De plus, l'envoi de 7 Go de données au terminal ralentira considérablement la restauration. 03 févr.. 162016-02-03 19:25:49

  0

Je vois, merci pour l'explication.C’est vrai, la sortie de 7 Go ne serait pas bonne pour la sortie dans le terminal.Je suppose que l’utilisation de -v était juste pour un petit cas de test local où ma base de données restait bloquée. 03 févr.. 162016-02-03 20:46:23

+1

Cette suggestion m'a aidé à identifier un problème, même si cela n'était pas pratique pour une utilisation avec des fichiers volumineux.(Le mien était petit). 26 févr.. 162016-02-26 15:46:28


2

Toutes les 2 secondes, vous verrez les processus en cours d'exécution.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

Si vous le souhaitez moins fréquemment, ajoutez -n xx est le nombre de secondes.5 secondes seraient:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';
  0

Pouvez-vous poster un exemple de sortie?En outre, cela montre-t-il simplement le processus ou indique-t-il vraiment la progression de l'importation, ce que je demandais vraiment? 09 déc.. 162016-12-09 17:29:21

  0

C'est un code tellement utile.Je vous remercie 05 août. 172017-08-05 20:52:08


0

Si votre base de données est par ailleurs silencieuse (c’est-à-dire qu’il n’y a pas d’autres utilisateurs actifs) et que vous voulez simplement voir l’activité de lecture/écriture, pourquoi ne pas simplement faire quelque chose comme:

mysqladmin -h-uroot -p extended -r -i 10 |grep 'row'

Vous verrez le nombre de lectures/écritures/insertions/attentes/mises à jour.

Si vous insérez par exemple, vous verrez quelque chose comme:

Innodb_rows_inserted             | 28958 

Où 28958 est le nombre de lignes insérées pour votre intervalle (10 secondes dans mon cas).


1

Pour quelqu'un qui recherche l'exemple du lecteur de pipe en utilisantmysqldumpvous feriez juste quelque chose comme ça:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

le-Wflag indique simplement à pv d'attendre le premier octet avant de montrer la progression (après l'invite)