Ich habe eine mittelgroße MySQL-Datenbank mit etwa 30 Tabellen, von denen einige 10 Millionen Datensätze und einige 100 Millionen sind. Die mysqldump
von allen Tabellen (in separate Dateien) ist ziemlich schnell, dauert vielleicht 20 Minuten. Es werden ca. 15 GB Daten generiert. Die größten ausgelagerten Dateien liegen im Bereich von 2 GB.
Wenn ich die Daten auf einer anderen Box, einer 8-GB-Maschine mit sechs Kernen, in MySQL lade, dauert es ewig. Leicht 12 Uhr Stunden oder mehr.
Ich lasse gerade den Mysql-Klienten laufen, um die Akte zu laden, dh
mysql database < footable.sql
direkt mit der datei direkt aus mysqldump heraus
mysqldump database foo > footable.sql
Offensichtlich mache ich etwas falsch. Wo fange ich an, damit es in einer angemessenen Zeit fertig wird?
Ich benutze keine Schalter auf dem Dump oder der Last.
Antworten:
Berücksichtigen Sie diese Punkte, die Ihnen bei der Erstellung und Wiederherstellung des Speicherauszugs helfen können.
Extended inserts
in Deponien.--tab
Format, so dass Sie verwenden könnenmysqlimport
, was schneller ist alsmysql < dumpfile
.innodb_flush_log_at_trx_commit = 2
Ihre my.cnf temporär in die Datei einfügen, während der Import ausgeführt wird. Sie können es wieder auf 1 setzen, wenn Sie SÄURE benötigenVersuche es..
quelle
innodb_flush_log_at_trx_commit = 2
hat mir den Tag gerettet. Das Importieren eines 600-MB-Dumps (als einzelne große Transaktion) hätte 6 Stunden gedauert, aber mit dieser vorübergehenden Einstellung war dies in 30 Minuten erledigt!Zusätzlich zu Abdul's Antwort möchte ich die Wichtigkeit der
--disable-keys
Option betonen , die die Schlüssel ausschaltet, bis alle Daten für eine Tabelle geladen sind. Diese Option ist im Rahmen des--opt
Umschalters aktiviert, der standardmäßig aktiviert ist, es jedoch für wichtig erachtet, darauf hinzuweisen.Wenn Sie während der Einfügungen keine Schlüssel überspringen, erstellt jede eingefügte Zeile den Index neu. Ein extrem langsamer Prozess.
quelle
--opt
ist standardmäßig aktiviertThis option is effective only for nonunique indexes of MyISAM tables. It has no effect for other tables
Ich habe in letzter Zeit viel damit zu tun. Sie können die Importleistung definitiv verbessern, indem Sie die Importe parallel ausführen. Der größte Teil der Verlangsamung basiert auf E / A, aber Sie können immer noch eine 40% ige Verbesserung erzielen, indem Sie Daten in Tabellen speichern und diese dann beispielsweise mit 4 gleichzeitig importieren.
Sie können dies mit xargs wie folgt tun:
Wenn die Dateien komprimiert werden, bevor sie an mysql gesendet werden, wird dies hauptsächlich aufgrund der verringerten E / A-Leistung nicht verlangsamt. Meine Tabellen wurden auf etwa 10: 1 komprimiert, sodass viel Speicherplatz gespart wird.
Ich habe festgestellt, dass auf 4-Kern-Computern die Verwendung von 4 Prozessen optimal ist, obwohl dies nur unwesentlich besser ist als die Verwendung von 3. Wenn Sie über SSDs oder ein schnelles RAID verfügen, werden Sie wahrscheinlich besser skalieren.
Einige andere Dinge zu beachten. Wenn Sie 4k-Sektor-Laufwerke haben, stellen Sie sicher, dass Sie
key_cache_block_size=4096
und habenmyisam_block_size=4K
.Wenn Sie MyISAM-Tabellen verwenden, setzen Sie die
myisam_repair_threads = 2
oder höher. Auf diese Weise können Ihre zusätzlichen Kerne beim Neuaufbau von Indizes helfen.Stellen Sie sicher, dass Sie überhaupt nicht tauschen. Wenn ja, verkleinern Sie das
innodb_buffer_pool_size
.Ich denke, ich habe durch diese Optionen auch einiges an Speedup mit innnodb bekommen:
(Die letzten drei habe ich nicht ausgiebig getestet - ich glaube, ich habe sie als Vorschläge im Internet gefunden.) Beachten Sie, dass
innodb_flush_log_at_commit=0
dies zu einer Beschädigung von MySQL-Abstürzen oder einem Stromausfall führen kann.quelle
*_block_size
undmyisam_repair_threads
angeben? Wir sind uns auch nicht sicher, ob wir Ihnen einen Rat geben sollten, um Variablen basierend auf 'Vorschlägen aus dem Internet' abzustimmen :)Wenn Sie in erster Linie MyISAM - Tabellen haben, sollten Sie die Erhöhung Bulk Insert - Puffer . Folgendes steht in der MySQL-Dokumentation zum Festlegen von bulk_insert_buffer_size :
Sie müssen zwei Dinge tun
1) Fügen Sie es zu /etc/my.cnf hinzu
2) Stellen Sie den globalen Wert dafür ein
Wenn Sie nicht berechtigt sind, bulk_insert_buffer_size global festzulegen, führen Sie dies aus
Dies gilt natürlich nicht für InnoDB.
Aus einem anderen Blickwinkel, unabhängig davon, ob es sich bei den Tabellen um InnoDB oder MyISAM handelt, können zu viele Indizes vorhanden sein, wenn die Indizes größer als die Tabelle sind. Ich bin normalerweise der Meinung, dass das Neuladen eines MyISAM-MySQL-Speicherauszugs dreimal so lange dauern sollte, wie der MySQL-Speicherauszug benötigt. Ich bin auch der Meinung, dass das Neuladen eines InnoDB-mysqldump viermal so lange dauern sollte, wie der mysqldump benötigt.
Wenn Sie das Verhältnis 4: 1 zum erneuten Laden eines mysqldump überschreiten, haben Sie definitiv eines von zwei Problemen:
Sie können die Größe Ihrer Daten anhand der Speicher-Engine folgendermaßen messen:
Überprüfen Sie, ob die Indizes mindestens so groß wie die Daten sind
Sie können die binäre Protokollierung auch wie folgt deaktivieren:
bevor Sie das Skript neu laden
quelle
Wenn Sie das Dateisystem komplett umgehen und nur die Ausgabe von mysqldump direkt in einen MySQL-Prozess leiten, sollten Sie merkliche Leistungsverbesserungen feststellen. Wie viel letztendlich von der Art des verwendeten Laufwerks abhängt, aber ich verwende selten mehr Speicherauszugsdateien, unabhängig von der Datenbankgröße, allein aus diesem Grund.
quelle
Nach meinen Erfahrungen ist die Festplatte der Engpass. Vergiss rotierende Scheiben. SSD ist besser, aber bei weitem das Beste ist, dies im RAM durchzuführen - wenn Sie genug haben, um die gesamte Datenbank für eine kurze Zeit zu halten. Grob:
Für mich kann ein Speicherauszug von ~ 10G (/ var / lib / mysql, der ~ 20G verbraucht) in ungefähr 35 Minuten (mydumper / myloader), 45 Minuten (mysqldump --tab / mysqlimport), 50 Minuten (mysqldump / mysql) importiert werden. auf einem 2 x 6-Core-Xeon mit 3,2 GHz.
Wenn Sie nicht genug RAM auf einem einzelnen Computer haben, aber mehrere Computer mit schnellem Netzwerk nebeneinander haben, wäre es interessant zu sehen, ob ihre RAMs mit nbd (Network Block Device) verbunden werden können. Mit innodb_file_per_table können Sie den obigen Vorgang wahrscheinlich für jede Tabelle wiederholen.
quelle