it-swarm.com.de

Wie kann ich den Fortschritt eines Imports einer großen SQL-Datei überwachen?

Ich importiere eine 7 GB foobar.sql, um eine Tabelle in einer lokalen Datenbank wiederherzustellen.

$ 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

Wie kann ich den Fortschritt überwachen?

219
qazwsx

Wenn Sie nur aus einer Dump-Datei von der CLI auf * nix importieren, z.

mysql -uxxx -pxxx dbname < /sqlfile.sql

installieren Sie dann zuerst Pipe Viewer auf Ihrem Betriebssystem und versuchen Sie dann Folgendes:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

hier wird ein Fortschrittsbalken angezeigt, während das Programm ausgeführt wird.

Es ist sehr nützlich und Sie können es auch verwenden, um eine Schätzung für den Fortschritt von mysqldump zu erhalten.

pv gibt das sqlfile.sql und übergibt sie an mysql (wegen des Pipe-Operators). Während des Dumpings wird der Fortschritt angezeigt. Das Coole ist, dass MySQL die Daten nur so schnell nimmt, wie sie fortschreiten können, sodass pv den Fortschritt des Imports anzeigen kann. Ich habe keinen Beweis. Aber es scheint so. Ich denke, es wird ein Puffer verwendet, aber irgendwann denke ich, dass mysql keine Daten mehr liest, wenn es noch mit der Verarbeitung beschäftigt ist.

(Pipe Viewer screenshot

288
Rob

Wenn Sie den Import bereits gestartet haben, können Sie diesen Befehl in einem anderen Fenster ausführen, um die aktuelle Größe Ihrer Datenbanken anzuzeigen. Dies kann hilfreich sein, wenn Sie die Gesamtgröße der zu importierenden SQL-Datei kennen.

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;  

Gutschrift an: http://forums.mysql.com/read.php?108,201578,201578


Die MySQL 8.0-Referenz gibt Folgendes zur Genauigkeit an:

DATA_LENGTH

Für MyISAM ist DATA_LENGTH die Länge der Datendatei in Bytes.

Für InnoDB ist DATA_LENGTH die ungefähre Speichermenge, die für den Clustered-Index in Bytes zugewiesen ist. Insbesondere ist dies die Clustered-Indexgröße in Seiten multipliziert mit der InnoDB-Seitengröße.

INDEX_LENGTH

Für MyISAM ist INDEX_LENGTH die Länge der Indexdatei in Byte.

Für InnoDB ist INDEX_LENGTH die ungefähre Speichermenge für nicht gruppierte Indizes in Byte. Insbesondere ist dies die Summe der nicht gruppierten Indexgrößen in Seiten, multipliziert mit der InnoDB-Seitengröße.

32
Josh Grinberg

Wenn Sie einen mysqldump einer einzelnen Datenbank ausführen, werden alle Tabellen in alphabetischer Reihenfolge ausgegeben.

Natürlich würde das Neuladen des mysqldump in eine Datenbank auch in alphabetischer Reihenfolge erfolgen.

Sie können einfach eine SHOW-PROZESSLISTE erstellen. und finden Sie die DB-Verbindung heraus, auf der mysqldump ausgeführt wird. Wenn der Speicherauszug neu geladen wird, verschwindet die DB-Verbindung.

Wenn Sie wissen möchten, welche Tabellen sich in der Dumpfile befinden, führen Sie dies für foobar.sql aus

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

UPDATE 2012-05-02 13:53 EDT

Es tut uns leid, dass Sie nicht bemerkt haben, dass es nur einen Tisch gibt.

Wenn es sich bei der Tabelle um MyISAM handelt, besteht die einzige Möglichkeit zur Überwachung aus Sicht des Betriebssystems. Der Grund? Die Tabelle ist während des Neuladens schreibgeschützt. Was suchst du? Die Größe der Dateien .MYD Und .MYI. Natürlich müssen Sie dies mit der vorherigen Tabellengröße auf dem anderen DB-Server vergleichen, von dem Sie importiert haben.

Wenn die Tabelle InnoDB ist und Sie innodb_file_per_table aktiviert haben, ist die einzige Möglichkeit zur Überwachung aus Sicht des Betriebssystems. Der Grund? Die Tabelle ist während des Neuladens schreibgeschützt. Was suchst du? Die Größe der Datei .ibd. Natürlich müssen Sie dies mit der vorherigen Tabellengröße auf dem anderen DB-Server vergleichen, von dem Sie importiert haben.

Wenn die Tabelle InnoDB ist und Sie innodb_file_per_table deaktiviert haben, kann nicht einmal die Sichtweise des Betriebssystems helfen.

UPDATE 2012-05-02 13:56 EDT

Ich habe letztes Jahr so ​​etwas angesprochen: Wie erhalte ich% Fortschritt für "Typ db.sql | mysql"

UPDATE 2012-05-02 14:09 EDT

Da ein Standard-mysqldump die Tabelle wie folgt schreibt:

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;

dann gibt es keine Möglichkeit, mit MySQL einen Fortschritt zu erzielen, bis die Tabellensperre aufgehoben wird.

Wenn Sie LOCK TABLES Und UNLOCK TABLES Aus dem Dumpfile kommentieren können ...

  • wenn die Tabelle MyISAM ist, würde SELECT COUNT (*) funktionieren
  • wenn die Tabelle InnoDB ist, würde SELECT COUNT (*) das Laden wahrscheinlich verlangsamen/anhalten, bis die Zählung abgeschlossen ist
17
RolandoMySQLDBA

Alle 2 Sekunden werden die Prozesse ausgeführt.

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

Wenn Sie es weniger häufig möchten, fügen Sie -n x wobei x die Anzahl der Sekunden ist. 5 Sekunden wären:

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

Wenn Sie nur überprüfen möchten, ob es blockiert ist, können Sie abfragen

show processlist; 

und sehen, was ausgeführt wird.

7
SCL

Als Lösung für jemanden, der pv nicht zum Laufen bringen kann oder für den pv Lügen erzählt. Sie können die Größe der Datei ibdata1 in/var/lib/mysql überwachen, die die Daten enthält. Dadurch wird die Dateigröße auf Ihrem Quellserver in etwa gleich groß (oder ungefähr so ​​groß).

Wenn es viele Tabellen gibt, können Sie auch sehen, wie sie einzeln in/var/lib/mysql/<Datenbankname> angezeigt werden.

Ich habe diese Tatsache kürzlich genutzt, als eine Langzeitdatenbank über einen Zeitraum von drei oder vier Jahren eine Protokolldatei von etwa 20 G erstellt hatte. Ich bemerkte, dass die Übertragung ewig dauerte und benutzte diese Technik, um den Fortschritt zu überwachen.

Ich denke, dass es höchst unwahrscheinlich ist, dass der Tag beginnt, an dem eine Datenbank nicht irgendwo eine Datei enthält. In der Zwischenzeit können Sie die Datei überwachen, um zu sehen, wie eine Übertragung fortschreitet. Die von mir vorgeschlagene Methode konnte in der einen oder anderen Form ausgeführt werden, seit die erste SQL-Datenbank geschrieben wurde. Ich wollte nie vorschlagen, dass es irgendeine "offizielle" Technik ist, auf die ein manueller Jockey zurückgreifen kann. Es setzt ein allgemeines Niveau der Kenntnisse mit Computern im Allgemeinen und Unix im Besonderen voraus.

5
nerak99

Wenn Ihre Datenbank ansonsten leise ist (d. H. Es sind keine anderen Benutzer aktiv) und Sie nur Lese-/Schreibaktivitäten sehen möchten, warum nicht einfach Folgendes tun:

mysqladmin -h<Host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

Sie sehen die Anzahl der Lese-/Schreibvorgänge/Einfügungen/Wartezeiten/Aktualisierungen.

Wenn Sie zum Beispiel einfügen, sehen Sie etwas wie:

Innodb_rows_inserted                          | 28958 

Dabei ist 28958 die Anzahl der Zeilen, die für Ihr Intervall eingefügt wurden (in meinem Fall 10 Sekunden).

2
user113373

Für jemanden, der nach dem Pipe Viewer-Beispiel mit mysqldump sucht, würden Sie einfach so etwas tun:

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

Das -W flag weist pv nur an, auf das erste Byte zu warten, bevor der Fortschritt angezeigt wird (nach der Eingabeaufforderung)

1

wenn Sie gnu coreutils/dd version> = 8.24 (veröffentlicht am 03. Juli 2015) haben, können Sie das Argument status = progress von dd verwenden.

z.B

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

* PS: funktioniert nicht arbeitet mit Busybox, Busybox dd versteht "Status = Fortschritt" nicht

0
hanshenrik

Ok, noch eine Abhilfe. Dies kann jedoch die schlechteste und ungenaueste Option sein.

Das heißt, hier ist meine Lösung für Windows:

Öffnen Sie den Task-Manager und drücken Sie

CTRL + SHIFT + ESC

Kopieren Sie die Geschwindigkeit des Festplattenwerts "mysqld.exe"

e.g. 11mb/s

Setzen Sie das in einen Taschenrechner wie diesen ein: https://techinternets.com/copy_calc?do

Schätzen Sie die ETA. Mein Fall war:

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

Ergebnisse:

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

Ich musste eine 500 MB SQL-Datei importieren. Ich habe ungefähr 2 Stunden gebraucht. Die mysqld-CPU-Auslastung lag zu Beginn des Importvorgangs bei nahezu 100%. Nach wenigen Minuten war die CPU-Auslastung jedoch auf 15% gesunken.

Ich habe viele Optimierungen versucht, aber nur diese hat mir geholfen: innodb_flush_log_at_trx_commit = 0

Nach dem Anwenden dieser Einstellung und dem Neustart von mysql dauerte der Import nur 3 Minuten! Die CPU-Auslastung betrug ständig 100%.

Wenn Sie diese Einstellung verwenden möchten, müssen Sie die Datei "/etc/mysql/my.cnf" bearbeiten und den MySQL-Server mit "Sudo Service MySQL-Neustart" neu starten.

Hier sind die Einstellungen meiner "my.conf" -Datei:

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

Bitte beachten Sie: Das "innodb_flush_log_at_trx_commit = 0" führt nur jede Sekunde ein Commit durch. Es ist also nicht ACID-konform, aber für einen Massenimport akzeptabel. Nach dem Import können Sie den Wert von "innodb_flush_log_at_trx_commit" auf 1 zurücksetzen und Ihre Datenbank neu starten. Link zur mySQL-Dokumentation

0
MaFli

Ich benutze https://github.com/Xfennec/progress dafür und überwache über watch

watch progress

Nach dem Auslösen des Imports zcat example.sql.gz | mysql -u root -proot -h localhost example

0
michalzuber

Sie können einen Import im Ordner\Msql\Data [DB-Name] überwachen.

0
Hotcronchy