Ich habe diesen riesigen 32 GB SQL-Speicherauszug, den ich in MySQL importieren muss. Ich musste noch nie einen so großen SQL-Dump importieren. Ich habe das übliche gemacht:
mysql -uroot dbname < dbname.sql
Es dauert zu lange. Es gibt eine Tabelle mit ungefähr 300 Millionen Zeilen, die in ungefähr 3 Stunden auf 1,5 Millionen angestiegen ist. Es scheint also, dass das Ganze 600 Stunden dauern würde (das sind 24 Tage) und unpraktisch ist. Meine Frage ist also, gibt es einen schnelleren Weg, dies zu tun?
Weitere Infos / Befunde
- Die Tabellen sind alle InnoDB und es sind keine Fremdschlüssel definiert. Es gibt jedoch viele Indizes.
- Ich habe keinen Zugriff auf den ursprünglichen Server und die ursprüngliche Datenbank, daher kann ich keine neue Sicherung erstellen oder eine "heiße" Kopie usw. erstellen.
- Die hier
innodb_flush_log_at_trx_commit = 2
vorgeschlagene Einstellung scheint keine (deutlich sichtbare / exponentielle) Verbesserung zu bewirken. - Serverstatistiken während des Imports (von MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- MySQL-Version ist 5.6.20 Community.
- innodb_buffer_pool_size = 16M und innodb_log_buffer_size = 8M. Muss ich diese erhöhen?
Antworten:
Perconas Vadim Tkachenko hat diese schöne bildliche Darstellung von InnoDB gemacht
Sie müssen auf jeden Fall Folgendes ändern
Warum diese Einstellungen?
.ibd
Dateien. Gemäß der MySQL-DokumentationConfiguring the Number of Background InnoDB I/O Threads
kann jeder Thread bis zu 256 ausstehende E / A-Anforderungen verarbeiten. Standard für MySQL ist 4, 8 für Percona Server. Max ist 64.Starten Sie mysql so neu
Dies deaktiviert den InnoDB Double Write Buffer
Importieren Sie Ihre Daten. Wenn Sie fertig sind, starten Sie mysql normal neu
Dadurch wird der InnoDB Double Write Buffer wieder aktiviert
Versuche es !!!
SEITLICHER HINWEIS : Sie sollten ein Upgrade auf 5.6.21 durchführen, um die neuesten Sicherheitspatches zu erhalten .
quelle
Müssen Sie wirklich die gesamte Datenbank wiederherstellen? Wenn nicht, mein 2c:
Sie können bestimmte Tabellen extrahieren, um die Wiederherstellung für "Chunks" durchzuführen. Etwas wie das:
Ich habe es einmal gemacht und es dauerte ungefähr 10 Minuten, um die benötigte Tabelle zu extrahieren - meine vollständige Wiederherstellung dauerte 13 bis 14 Stunden, mit einem 35-GB-Speicherauszug (gziped).
Die
/pattern/,/pattern/p
mit dem-n
Parameter macht eine Scheibe „zwischen den Mustern“ - auch sie.Wie auch immer, um die 35 GB wiederherzustellen, habe ich eine AWS EC2-Maschine (c3.8xlarge) verwendet, Percona über yum (Centos) installiert und gerade die folgenden Zeilen hinzugefügt / geändert
my.cnf
:Ich denke, die Zahlen sind viel zu hoch, aber für mein Setup funktioniert.
quelle
Der schnellste Weg, Ihre Datenbank zu importieren, besteht darin, die Dateien (.frm, .MYD, .MYI) unter MyISAM direkt in das Verzeichnis / var / lib / mysql / "database name" zu kopieren.
Ansonsten können Sie versuchen:
mysql > use database_name; \. /path/to/file.sql
Das ist eine andere Möglichkeit, Ihre Daten zu importieren.
quelle
Eine Möglichkeit, den Import zu beschleunigen, besteht darin, die Tabelle beim Import zu sperren. Verwenden Sie die Option --add-locks für mysqldump.
Oder Sie können einige nützliche Parameter mit --opt aktivieren. Dies aktiviert eine Reihe nützlicher Dinge für den Dump.
Wenn Sie ein anderes Speichergerät auf dem Server haben, verwenden Sie dieses. Durch Kopieren von einem Gerät auf ein anderes können Sie die Übertragung beschleunigen.
Sie können mit --ignore-table auch Tabellen herausfiltern, die nicht benötigt werden
quelle