Unterstützt mysqldump einen Fortschrittsbalken?

70

Gibt es eine Möglichkeit, während der mysqldumpAusführung festzustellen, wie viel der Sicherung abgeschlossen wurde oder wie viel noch übrig ist?

Sina
quelle

Antworten:

50

Ja, am 27. März 2010 wurde ein Patch festgeschrieben :

Dieser neue Patch verfügt über einen zusätzlichen Parameter --show-progress-size, der standardmäßig auf 10.000 eingestellt ist. Wenn also --verbose verwendet wird, erhalten Sie alle 10.000 Zeilen eine reguläre Statusausgabe der Anzahl der Zeilen für eine bestimmte ausgegebene Tabelle.

Überprüfen Sie also Ihre Version, aktualisieren Sie sie bei Bedarf und genießen Sie sie.

xelco52
quelle
5
Ich verwende mysqldump Ver 10.13 Distrib 5.5.11 für Win32 (x86) und es scheint nicht mit diesem Patch erstellt worden zu sein. Wie stelle ich fest, ob dieser Patch zu einer stabilen Version geworden ist?
Breck Fresen
14
mysqldump --help | grep progress # Keine Ausgabe von mysqldump --version mysqldump Ver 10.13 Distrib 5.6.10 für Linux (x86_64)
Jose Nobile
6
mysqldump --help | grep progressist leer für mysqldump Ver 10.13 Distrib 5.6.22, for osx10.10 (x86_64).
Andrew Ellis
5
leer auch für Ver 10.13 Distrib 5.5.43-37.2, for debian-linux-gnu (x86_64)von Percona
pawel7318
3
noch leerVer 10.13 Distrib 5.7.19, for Linux (x86_64)
Potherca
78

Installieren und verwenden pv(es ist als leckeres Paket für CentOS erhältlich)

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

PV ("Pipe Viewer") ist ein Tool zur Überwachung des Datenfortschritts über eine Pipeline. Es kann in jede normale Pipeline zwischen zwei Prozessen eingefügt werden, um visuell anzuzeigen, wie schnell Daten durchlaufen werden, wie lange es gedauert hat, wie kurz die Fertigstellung ist und wie lange es bis zur Fertigstellung dauern wird.

Unter der Annahme, dass die erwartete Größe der resultierenden Datei dumpfile.sql 100 m (100 Megabyte) beträgt, wird pvfolgende Verwendung verwendet:

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

Die Konsolenausgabe sieht folgendermaßen aus:

[===> ] 20%

man pvWeitere Optionen finden Sie auf der Manpage . Sie können die Übertragungsrate anzeigen oder wie viel Zeit vergangen ist oder wie viele Bytes übertragen wurden und mehr.

Wenn Sie die Größe Ihrer Dump-Datei nicht kennen, können Sie eine Größe der MySQL-Datenbank aus dem table_schema abrufen. Dies entspricht nicht der Größe Ihrer Dump-Datei, ist jedoch möglicherweise nah genug für Ihre Anforderungen:

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;

Aktualisieren

Nach meiner Erfahrung beträgt beim tatsächlichen Dumping des gesamten MySQL-Servers die tatsächliche unkomprimierte Größe des MySQL-Dumps (mit der Option mysqldump --hex-blob) ungefähr zwischen 75% und 85% der Live-Größe der aus information_schema erhaltenen MySQL-Daten. Für eine allgemeine Lösung könnte ich Folgendes versuchen:

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

Russell E Glaue
quelle
6
Da Indizes nicht im Dump angezeigt werden, index_lengthsollte weggelassen werden.
Mtoloo
7
Entfernen Sie das --progressArgument. In meinem Fall (Version 1.5.3), bedeutet es , die Fortschrittsbalken angezeigt werden nur , aber es gibt mehr Informationen , wenn ich es nicht geben.
Melebius
Seltsamerweise betrug in unserem Fall die Live-Größe der Datenbank 2,2 GB und der MySQL-Speicherauszug 3,2 GB.
Joshua Pinter
15

Eine vollständige Version der Russell E Glaue- Antwort. Holen Sie sich eine gerundete Datenbankgröße, da pv nur Ganzzahlen akzeptiert und die Datenlänge ohne Indizes gemäß @mtoloo- Kommentar berechnet :

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';")

Erstellen Sie ein Backup in den Dateinamen mit Zeitstempel:

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
pocheptsov
quelle
Dies ist nicht genau, auch die interne Größe in MySQL unterscheidet sich nicht vollständig von der tatsächlichen Größe in der Sicherungsdatei.
Corneliu Maftuleac
@CorneliuMaftuleac gibt es einen besseren Weg, um den Dump-Fortschritt zu verstehen, ich werde Ihre Eingabe schätzen.
Pocheptsov
Leider glaube ich nicht, dass es eine Möglichkeit gibt, im Voraus zu wissen, wie groß das Backup sein wird.
Corneliu Maftuleac
3

Ich suchte nach einem ähnlichen Tool (PV), aber ich entleere keine DBs. Beim Zusammenführen von zwei großen Datenbanken mit einigen zusätzlichen Berechnungen und Formeln wurde der Prozess weder in TOP- noch in HTOP-Dienstprogrammen aufgeführt, sondern nur in der Kopfzeile als io% (Wird beim Startvorgang nur in der Liste angezeigt und verschwindet dann). Zeigt ständig eine hohe Auslastung an, befindet sich jedoch in diesem Fall auf der E / A-Seite und ist nicht in der Bodylist der Dienstprogramme aufgeführt, da andere Prozesse angezeigt werden. Ich musste stattdessen IOSTAT verwenden, um den Schreibfortschritt der Ausgabedatenbank zu sehen, konnte aber nicht herausfinden, ob tatsächlich in die Datei geschrieben wurde (zeigt nur xfer-Raten an). Ich fand den alten Weg heraus, indem ich Filezilla FTP verwendete, die Größe der Quelldatenbanken verglich, und da ich eine Zusammenführung durchführe, musste die Ausgabedatei angezeigt werden, während die Dateien zusammengeführt wurden. Ich konnte das Inkrement beim Aktualisieren des Inhalts des FileZilla-Verzeichnisses beobachten, bis der Prozess erfolgreich beendet wurde und die Größe der Summe beider DBs wie erwartet zusammengeführt wurde. (Sie können tatsächlich eine Aktualisierung pro Minute durchführen und die Zeit Ihrer Hardware und die Verarbeitungsgeschwindigkeit manuell berechnen.)

Ich ging zum MySQL-Verzeichnis (wo die eigentliche Datenbank als Dateien gespeichert ist, in meinem Fall ../mysql/database/tabellenname.MYD ... (Dateien in MYSQL werden mit einer entsprechenden .FRM-Datei gespeichert, die die Daten im Tabellenformat enthält und eine .MYI-Datei, die als Datenbankindex dient) und aktualisieren Sie einfach die Seite, um die tatsächliche Größe der zusammengeführten Ausgabedatei zu sehen, die tatsächlich für mich ausgearbeitet wurde.

Übrigens zeigten TOP und HTOP nur, dass MYSQLD einen Backgroud-Prozess durchführte, aber das Arbeitspferd wurde zur Ausgabe auf die E / A-Seite übertragen. Meine beiden zusammengeführten DBs bestanden aus ungefähr 20 Millionen Zeilen mit jeweils etwa 5 Gigs. Die Zusammenführung auf meinem CPU-Dual-Core dauerte Stunden, und es wurden nirgendwo Fortschritte erzielt (selbst bei phpmyadmin trat eine Zeitüberschreitung auf, aber der Prozess wurde fortgesetzt). Es wurde versucht, PV mit PID-Nummern zu verwenden, aber da ich kein Dumping durchführe, erfolgt keine Übertragung auf das Rohr. Schreiben Sie dies auf jeden Fall für jemanden, der nach einer effektiven und einfachen Möglichkeit sucht, den Fortschritt der Erstellung der Ausgabedatei zu überprüfen. Es sollte auch für Dumps und Wiederherstellungen funktionieren. Seien Sie geduldig, sobald es startet, wird es sicher enden, es sei denn, es liegt ein Fehler in der SQL-Sintax vor (mir ist zuvor passiert, dass in früheren Versuchen überhaupt keine Zeilen zusammengeführt wurden, es hat seine süße Zeit in Anspruch genommen, aber am Ende ist nichts passiert, und ohne Werkzeuge,

Sie können Ihre Frage zum Fortschrittsbalken in einem C ++ - Programm nicht vollständig beantworten. Sie können dies jedoch verwenden, um die Dateigröße der erstellten MYD-Datei zu ermitteln und einen Fortschrittsbalken anhand der Größe der Quelldatei geteilt durch die xfer-Rate zu berechnen, um die verbleibende Zeit zu berechnen. Freundliche Grüße.

Luis H Cabrejo
quelle
Übrigens, mehr Speicher desto besser. Durch Hinzufügen von zusätzlichem Speicher und Konfigurieren von my.cnf für E / A- und Cache-Puffer können Merge, Xfer, Indizierung und Dumping erheblich verbessert werden. Sie können einen temporären Superspeicherserver für temporäre zeitaufwändige Aufgaben einrichten. Ich fand diesen Rechner nützlich, um die Einstellungen vorzunehmen. Überprüfen Sie Ihre Version unter MySQL, da die Parameter möglicherweise unterschiedlich sind. mysqlcalculator.com
Luis H Cabrejo
2

Nach MySQL 5.7+ können Sie mysqlpump verwenden . Obwohl kein Fortschrittsbalken angezeigt wird, werden dennoch einige Fortschritte wie folgt angezeigt:

Dump progress: 1/1 tables, 0/191 rows
Dump progress: 16/17 tables, 19959/116836 rows
Dump progress: 18/19 tables, 22959/117032 rows
Dump progress: 19/21 tables, 24459/118851 rows
Dump progress: 19/22 tables, 26959/118852 rows
Dump progress: 21/23 tables, 28545/119020 rows
Dump progress: 22/23 tables, 30045/119020 rows
...
Stephen Chen
quelle
1

Gerade erstelltes Bash-Skript MySQL / MariaDB Dump Helper, inspiriert von Russell E Glaue und Pocheptsov .

Es gibt ein Beispiel für die Ausgabe:

❯ ./bin/db/dump xxx
[2020-08-19 09:54:59+02:00] [INFO] Dumping database 'master' (≈5.4GiB) into ./bin/db/master.sql...
5.40GiB 0:07:56 [11.6MiB/s] [===========================================================================>] 100%
[2020-08-19 10:02:56+02:00] [INFO] Done.
[2020-08-19 10:02:56+02:00] [INFO] Dumping database 'second_db' (≈2.2GiB) into ./bin/db/second_db.sql...
 905MiB 0:01:38 [1.34MiB/s] [==============================>                                              ] 41% ETA 0:02:17
Petr Bugyík
quelle