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?
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.
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.
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}'
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.
J'ai abordé quelque chose comme ça l'année dernière: Comment obtenir% de progression pour "type db.sql | mysql"
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 ...
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 x
où x est le nombre de secondes. 5 secondes seraient:
watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';
Si vous voulez simplement vérifier s'il est bloqué, vous pouvez interroger
show processlist;
et voyez ce qui est exécuté.
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.
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).
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)
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"
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
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
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
Vous pouvez surveiller une importation dans le dossier\Msql\Data [nom de la base de données]