Mysql-Dump-Import unglaublich langsam auf dem Rechner meines Entwicklers

20

Ich habe ein SQL-Dump, es ist ziemlich groß (411 MB) und es dauerte 10 Minuten, um auf Server A zu importieren, der gleiche Import auf meiner Workstation B hat eine Schätzung (Pipeviewer) von 8 Stunden, um zu importieren (es importierte 31 MB in 40 Minuten) ) Das ist also Faktor 53 langsamer.

Die Spezifikationen:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

Die mysql / maria-Konfiguration ist die Standardkonfiguration.

Ich bin gestern auf meiner Workstation auf MariaDB umgestiegen - aber vor MariaDB waren die Statistiken noch schlimmer.

Ich habe bereits alle Datenbanken auf meiner Workstation entfernt - kein Unterschied.

Die große Frage ist: Wie kann die Leistung um den Faktor 53 langsamer sein? Ich kann nicht so arbeiten :-(

Mein Importbefehl:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

Server A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

Arbeitsstation B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

Server A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

Arbeitsstation B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
Alex
quelle
Können Sie mir beschreiben, wie Sie die Datenbank importieren möchten? (Was ist Ihre konkrete mysql-Anweisung?) Was bedeutet "show processlist;" sagen? Haben Sie sich angesehen, was der Prozess konkret macht? Können Sie bitte auch nachsehen, ob Ihre Maschine vielleicht tauscht?
Ich habe meine Frage bearbeitet.
Alex
InnoDB? Was ist der Wert innodb_buffer_pool_sizeauf jeder Maschine?
Rick James

Antworten:

46

Diese Antwort hat alles sehr beschleunigt:

/programming//a/2167641/292408

Ich habe einfach

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

am Anfang und

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

Am Ende.

Jetzt hat es 3 Minuten gedauert.

(Mit freundlicher Genehmigung von @andreasemer via Twitter)

Alex
quelle
Tolle Tricks. Was ich wissen muss, gibt es irgendwelche Nebenwirkungen, wenn ich das tue?
Dharma Saputra
1
Falls Ihre Daten beschädigt sind, werden Fremdschlüssel-Einschränkungen nach dem Import möglicherweise nicht erfüllt.
Alex
Großartige Arbeit. Du hast mir buchstäblich Stunden gespart.
Jafo
Hat die Leistung für mich nicht beschleunigt. Ohne dies waren es 23 Minuten und danach 23 Minuten (3 GB .sql-Datei).
Joshua Pinter
4

Ergänzt das, was ich oben sehe ... Ich habe meine Dump-Datei bereits automatisch generiert durch etwas wie:

mysqldump my_db > db-dump-file.sql

Ich möchte diesen Import automatisieren , damit ich erstellt zwei Dateien in meinem Computer genannt default-start-import.sqlund default-end-import.sqlund deren Inhalte sind default-Start-import.sql :

SET autocommit=0;

und default-end-import.sql :

COMMIT;
SET autocommit=1;

und das Skript, das ich ausführe, ist ungefähr so;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

Gleicher Befehl, aber leichter zu lesen:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

In diesem Fall catwerden diese Dateien verkettet, bevor sie an die Pipe gesendet werden. Ich halte es für wichtig, dass alle Dateien mit einem Zeilenumbruchszeichen enden (eine leere Zeile am Ende der Datei, wenn sie in einem Texteditor angezeigt wird), damit der catBefehl keine Zeilen zwischen Dateien zusammenfügt.

Der Import funktioniert einwandfrei. Ich habe nicht getestet, ob er aufgrund der Verbesserung der Funktion zum Aktivieren und Deaktivieren der automatischen Festschreibung tatsächlich schneller ist. Wenn dies jedoch zu einer Beschleunigung führt, erleichtern diese zusätzlichen Schritte die Arbeit.

Santiago Arizti
quelle
0

Ich habe es --compressgenauso gut versucht SET autocommit=0;und sie halfen jedoch eine kleine Menge ...

Ich habe festgestellt, dass das Konvertieren mehrerer INSERT INTO ...Anweisungen in eine große Anweisung mit mehreren VALUES(...), (...)Geschwindigkeitsverbesserungen erheblich ist.

Ich verwende mysqlüber SSL über WAN. Die entfernte MySQL-Datenbank wird auf Amazon gehostet.

Mit 9 Spalten und 2.100 Zeilen:

  • 2.100 separate INSERTAussagen: 82s
  • 2 Konzernabschlüsse INSERT: <1s

Mit 7 Spalten und 42.000 Zeilen:

  • 42.000 separate INSERTAussagen: 1.740er
  • 42 Konzernabschluss INSERT: 105s

Je nach dem Tool, das den Datenbankspeicherauszug generiert (oder genauer gesagt, dem Format der INSERTAnweisungen), kann die Geschwindigkeit beeinflusst werden.

Hinweis: Dadurch .sqlwird die Speicherauszugsdatei in meinen Tests um über 60% verringert , sodass auch E / A eingespart werden.

Warnung: Diese Technikmysql unterliegt physischen Einschränkungen und ist nur für diejenigen geeignet, die Portabilität benötigen. SQL Server ist anscheinend auf jeweils nur 1.000 Zeilen beschränkt .

Wenn Sie jedoch für 42.000 Zeilen jeweils 1.000 Zeilen gleichzeitig ausführen, ergibt sich eine Verbesserung von 1.657%!

tresf
quelle