y a-t-il un moyen d'avoir la barre de progression mysqldump qui montre aux utilisateurs l'état de leurs sauvegardes?

je me demandais s'il y avait un moyen de déterminer, pendant que mysqldump est en cours d'exécution, combien de la sauvegarde a été terminée ou combien il reste?

j'aimerais fournir à mes utilisateurs une barre de progression de la console pour leur montrer l'état de leurs sauvegardes...

par la façon dont je veux écrire le programme ci-dessus en c++ standard et la plate-forme va être linux. merci!

55
demandé sur Sina 2011-01-31 18:55:36

3 réponses

Oui, un patch a été commis le 27 Mars 2010:

Ce nouveau patch a un paramètre supplémentaire --show-progrès-taille qui, par le réglage par défaut est de 10 000. Donc quand -- verbose est utilisé, tous les 10 000 lignes vous obtiendrez une sortie de statut régulière du nombre de lignes pour un une table en particulier a été vidée.

alors vérifiez votre version, mettez à jour si nécessaire et profitez.

41
répondu xelco52 2016-03-10 20:18:14

installer et utiliser pv (il est disponible en paquet yum pour CentOS)

http://www.ivarch.com/programs/pv.shtml

PV ("Pipe Viewer") est un outil de suivi de l'évolution des données par le biais d'un pipeline. Elle peut être insérée dans n'importe quel pipeline normal. entre deux processus pour donner une indication visuelle de la vitesse des données est de passage, combien de temps cela a pris, combien près de une fois achevé, il il s'agit d'une estimation du temps qu'il faudra pour l'achever.

en supposant la taille attendue du fichier dump résultant.fichier sql est de 100m( 100 mégaoctets), l'utilisation de pv serait comme suit:

mysqldump <parameters> | pv --progress --size 100m > dumpfile.sql

la sortie de la console ressemblera à:

[===> ] 20%

regardez la page de manuel man pv pour plus d'options. Vous pouvez afficher l' taux de transfert, ou combien de temps s'est écoulé, ou le nombre d'octets transférés, et plus encore.

si vous ne connaissez pas la taille de votre fichier dump, il y a un moyen d'obtenir une taille de la base de données MySQL à partir du table_schema - ce ne sera pas la taille de votre fichier dump, mais il peut être assez proche pour vos besoins:

SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;

mise à Jour

d'après mon expérience, lorsque vous déchargez L'ensemble du serveur MySQL, le la taille réelle non compressée du dump mysql (en utilisant l'option mysqldump --hex-blob) est approximativement entre 75% et 85% de la taille réelle des données MySQL obtenues à partir d'information_schema. Donc, pour une solution générale, je pourrais essayer ce qui suit:

SIZE_BYTES=$(mysql --skip-column-names <parameters> <<< 'SELECT ROUND(SUM(data_length) * 0.8) AS "size_bytes" FROM information_schema.TABLES;')

mysqldump <parameters> --hex-blob | pv --progress --size $SIZE_BYTES > dumpfile.sql

45
répondu Russell E Glaue 2018-05-04 16:20:54

Une version complète de Russell E Glaue réponse. Obtenir la taille de db arrondie comme pv accepte entier seulement et calculer la longueur de données sans indexes, par @mtoloo commentaire:

db_size=$(mysql  -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --silent \
    --skip-column-names \
    -e "SELECT ROUND(SUM(data_length) / 1024 / 1024, 0) \
        FROM information_schema.TABLES \
        WHERE table_schema='$DB_NAME';")

créer une sauvegarde dans le nom de fichier timestampé:

mysqldump -h"$DB_HOST" \
    -u"$DB_USERNAME" \
    -p"$DB_PASSWORD" \
    --single-transaction \
    --order-by-primary \
    --compress \
    $DB_NAME | pv --progress --size "$db_size"m > "$(date +%Y%m%d)"_backup.sql
4
répondu pocheptsov 2017-07-13 16:29:17