Gibt es eine Möglichkeit, während der mysqldump
Ausführung festzustellen, wie viel der Sicherung abgeschlossen wurde oder wie viel noch übrig ist?
70
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.
mysqldump --help | grep progress
ist leer fürmysqldump Ver 10.13 Distrib 5.6.22, for osx10.10 (x86_64)
.Ver 10.13 Distrib 5.5.43-37.2, for debian-linux-gnu (x86_64)
von PerconaVer 10.13 Distrib 5.7.19, for Linux (x86_64)
Installieren und verwenden
pv
(es ist als leckeres Paket für CentOS erhältlich)http://www.ivarch.com/programs/pv.shtml
Unter der Annahme, dass die erwartete Größe der resultierenden Datei dumpfile.sql 100 m (100 Megabyte) beträgt, wird
pv
folgende Verwendung verwendet:mysqldump <parameters> | pv --progress --size 100m > dumpfile.sql
Die Konsolenausgabe sieht folgendermaßen aus:
[===> ] 20%
man pv
Weitere 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
quelle
index_length
sollte weggelassen werden.--progress
Argument. In meinem Fall (Version 1.5.3), bedeutet es , die Fortschrittsbalken angezeigt werden nur , aber es gibt mehr Informationen , wenn ich es nicht geben.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
quelle
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.
quelle
Nach MySQL 5.7+ können Sie mysqlpump verwenden . Obwohl kein Fortschrittsbalken angezeigt wird, werden dennoch einige Fortschritte wie folgt angezeigt:
quelle
Gerade erstelltes Bash-Skript MySQL / MariaDB Dump Helper, inspiriert von Russell E Glaue und Pocheptsov .
Es gibt ein Beispiel für die Ausgabe:
quelle