web-dev-qa-db-fra.com

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

J'importe un 7 Go foobar.sql pour restaurer 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 sa progression?

219
qazwsx

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

mysql -uxxx -pxxx dbname < /sqlfile.sql

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

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 vide le sqlfile.sql et les passe à mysql (à cause de l'opérateur pipe). Alors qu'il s'agit de dumping, il montre les progrès. Ce qui est cool, c'est que mysql prend les données aussi vite qu'il peut les faire progresser, donc pv peut montrer la progression de l'importation. Je n'ai aucune preuve. Mais il semble que oui. Je suppose qu'il y a un tampon utilisé, mais à un moment donné, je pense que mysql ne lit plus de données alors qu'il est encore occupé à traiter.

Pipe Viewer screenshot

288
Rob

Si vous avez déjà commencé 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 MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

Merci à: http://forums.mysql.com/read.php?108,201578,201578


MySQL 8.0 Reference indique ce qui suit concernant la précision:

DATA_LENGTH

Pour MyISAM, DATA_LENGTH est la longueur du fichier de données, en octets.

Pour InnoDB, DATA_LENGTH est la quantité approximative de mémoire allouée à l'index cluster, en octets. Plus précisément, il s'agit de la taille de l'index cluster, en pages, multipliée par la taille de la page InnoDB.

INDEX_LENGTH

Pour MyISAM, INDEX_LENGTH est la longueur du fichier d'index, en octets.

Pour InnoDB, INDEX_LENGTH est la quantité approximative de mémoire allouée aux index non clusterisés, en octets. Plus précisément, il s'agit de la somme des tailles d'index non groupées, en pages, multipliée par la taille de la page InnoDB.

32
Josh Grinberg

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

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

Vous pouvez simplement faire une LISTE DE PROCESSUS AFFICHER; et découvrez la connexion DB exécutant mysqldump. Lorsque le vidage est rechargé, la connexion DB disparaît.

Si vous voulez savoir quelles tables se trouvent dans le fichier de vidage, exécutez-le sur 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, la seule façon de surveiller est du point de vue du système d'exploitation. La raison? La table est verrouillée en écriture tout au long du rechargement. Qu'est-ce que tu cherches? La taille du .MYD et .MYI des dossiers. Bien sûr, vous devez comparer cela avec la taille de la table précédente sur l'autre serveur de base de données à partir duquel vous avez importé.

Si la table est InnoDB et que vous avez innodb_file_per_table activé, la seule façon de surveiller est du point de vue du système d'exploitation. La raison? La table est verrouillée en écriture tout au long du rechargement. Qu'est-ce que tu cherches? La taille du .ibd fichier. Bien sûr, vous devez comparer cela avec la taille de la table précédente sur l'autre serveur de base de données à partir duquel vous avez importé.

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

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

J'ai abordé quelque chose comme ça l'année dernière: Comment obtenir% de progression pour "type db.sql | mysql"

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

Puisqu'un mysqldump standard verrouille la table comme ceci:

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'y a aucun moyen d'obtenir une progression avec mysql jusqu'à ce que le verrou de table soit libéré.

Si vous pouvez obtenir LOCK TABLES et UNLOCK TABLES a commenté le fichier de vidage ...

  • si la table est MyISAM, SELECT COUNT (*) fonctionnerait
  • si la table est InnoDB, SELECT COUNT (*) ralentirait/arrêterait probablement la charge jusqu'à ce que le comptage soit terminé
17
RolandoMySQLDBA

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équent, ajoutez -n xx est le nombre de secondes. 5 secondes seraient:

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

Si vous voulez simplement vérifier s'il est bloqué, vous pouvez interroger

show processlist; 

et voyez ce qui est exécuté.

7
SCL

En tant que solution pour quelqu'un qui ne peut pas faire fonctionner le PV ou pour qui le PV dit des mensonges. Vous pouvez surveiller la taille du fichier ibdata1 dans/var/lib/mysql qui contient les données. Cela aboutira à 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 également les voir apparaître une par une dans/var/lib/mysql/<nom de la base de données>.

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 âges et j'ai utilisé cette technique pour suivre les progrès.

Je pense qu'il est très peu probable que le jour se lève quand une base de données n'implique pas un fichier quelque part ou autre. Pendant ce temps, vous pouvez surveiller le fichier pour voir comment un transfert progresse. La méthode que j'ai suggérée a été quelque chose que vous pouviez 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 sorte de technique "officielle" sur laquelle un jockey manuel pourrait se rabattre. Il suppose un niveau général de maîtrise des ordinateurs en général et d'Unix en particulier.

5
nerak99

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<Host>-uroot -p<yourpass> 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).

2
user113373

Pour quelqu'un qui recherche l'exemple de visualiseur de tuyaux en utilisant mysqldump, vous feriez simplement quelque chose comme ceci:

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

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

1
Mauricio Trajano

si vous avez la version gnu coreutils/dd> = 8.24 (sortie le 3 juillet 2015), vous pouvez utiliser l'argument status = progress de dd,

par exemple

cat dbdump.gz | gzip -d | mysql --password=root -v | time dd of=/dev/null status=progress

* PS: ne pas fonctionne avec busybox, busybox dd ne comprend pas "status = progress"

0
hanshenrik

Ok, un autre travail autour. Mais cela peut être la pire option et inexacte.

Cela dit, voici ma solution pour Windows:

Ouvrez le Gestionnaire des tâches en appuyant sur

CTRL + SHIFT + ESC

Copiez la vitesse de la valeur du disque "mysqld.exe"

e.g. 11mb/s

Mettez cela dans une calculatrice comme celle-ci: https://techinternets.com/copy_calc?do

Estimez l'ETA. Mon cas était:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

Résultats:

Beg -> 11:19
ETA -> 11:31
End -> 11:39
0
Daniel

J'avais un fichier SQL de 500 Mo à importer. Cela m'a pris environ 2 heures. L'utilisation du processeur mysqld était proche de 100% au début du processus d'importation. Mais après quelques minutes, l'utilisation du processeur était tombée à 15%.

J'ai essayé de nombreux réglages, mais seul celui-ci m'a aidé: innodb_flush_log_at_trx_commit = 0

Après avoir appliqué ce paramètre et redémarré mysql, l'importation n'a pris que 3 minutes! L'utilisation du processeur était de 100% tout le temps.

Si vous souhaitez utiliser ce paramètre, vous devrez éditer le fichier "/etc/mysql/my.cnf" et redémarrer le serveur mysql en utilisant "Sudo service mysql restart".

Voici les paramètres de mon fichier "my.conf":

    [mysqld]
    innodb_log_buffer_size = 256M
    innodb_fast_shutdown = 0
    innodb-doublewrite = OFF
    innodb_io_capacity = 1000
    innodb_flush_log_at_trx_commit = 0

Veuillez noter: "innodb_flush_log_at_trx_commit = 0" ne fera un commit que toutes les secondes. Ce n'est donc pas conforme à ACID, mais pour une importation en masse acceptable. Après l'importation, vous pouvez redéfinir la valeur de "innodb_flush_log_at_trx_commit" sur 1 et redémarrer votre base de données. Lien vers la documentation mySQL

0
MaFli

J'utilise https://github.com/Xfennec/progress pour cela et le surveille via watch

watch progress

Après avoir lancé l'importation zcat example.sql.gz | mysql -u root -proot -h localhost example

0
michalzuber

Vous pouvez surveiller une importation dans le dossier\Msql\Data [nom de la base de données]

0
Hotcronchy