it-swarm.com.de

Wie kann MySQL einen riesigen SQL-Dump (32 GB) schneller importieren?

Ich habe diesen riesigen 32-GB-SQL-Dump, den ich in MySQL importieren muss. Ich musste noch nie einen so großen SQL-Dump importieren. Ich habe das Übliche getan:

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 angewachsen ist. Es scheint also, dass das Ganze 600 Stunden (das sind 24 Tage) dauern würde und unpraktisch ist. Meine Frage ist also, gibt es einen schnelleren Weg, dies zu tun?

Weitere Infos/Befunde

  1. Die Tabellen sind alle InnoDB und es sind keine Fremdschlüssel definiert. Es gibt jedoch viele Indizes.
  2. Ich habe keinen Zugriff auf den ursprünglichen Server und die Datenbank, daher kann ich keine neue Sicherung erstellen oder eine "heiße" Kopie usw. erstellen.
  3. Einstellung innodb_flush_log_at_trx_commit = 2 wie vorgeschlagen hier scheint keine (deutlich sichtbare/exponentielle) Verbesserung zu bewirken.
  4. Serverstatistiken während des Imports (von MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. MySQL-Version ist 5.6.20 Community.
  6. innodb_buffer_pool_size = 16M und innodb_log_buffer_size = 8M. Muss ich diese erhöhen?
81
SBhojani

Perconas Vadim Tkachenko machte diese schöne bildliche Darstellung von InnoDB

InnoDB Architecture

Sie müssen auf jeden Fall Folgendes ändern

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

Warum diese Einstellungen?

Starten Sie MySQL so neu

service mysql restart --innodb-doublewrite=0

Dies deaktiviert den InnoDB Double Write Buffer

Importieren Sie Ihre Daten. Wenn Sie fertig sind, starten Sie mysql normal neu

service mysql restart

Dadurch wird der InnoDB Double Write Buffer wieder aktiviert

Versuche es !!!

SEITLICHER HINWEIS: Sie sollten für die neuesten Sicherheitspatches auf 5.6.21 aktualisieren.

97
RolandoMySQLDBA

Müssen Sie wirklich die gesamte Datenbank wiederherstellen? Wenn nicht, mein 2c:

Sie können bestimmte Tabellen extrahieren, um Ihre Wiederherstellung für "Chunks" durchzuführen. Etwas wie das:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

Ich habe es einmal gemacht und es dauerte ungefähr 10 Minuten, um die Tabelle zu extrahieren, die ich brauchte - meine vollständige Wiederherstellung dauerte 13 bis 14 Stunden mit einem 35-GB-Speicherauszug (gziped).

Das /pattern/,/pattern/p Mit dem Parameter -n Macht einen Slice "zwischen den Mustern" - einschließlich dieser.

Um die 35 GB wiederherzustellen, habe ich einen AWS EC2-Computer (c3.8xlarge) verwendet, Percona über yum (Centos) installiert und gerade die folgenden Zeilen auf my.cnf Hinzugefügt/geändert:

max_allowed_packet=256M
wait_timeout=30000

Ich denke, die Zahlen sind viel zu hoch, haben aber für mein Setup funktioniert.

13
Bruno J. Araujo

Der schnellste Weg, Ihre Datenbank zu importieren, besteht darin, die (.frm, .MYD, .MYI) Dateien von MyISAM direkt in den/var/lib/mysql/"Datenbanknamen" zu kopieren.

Andernfalls können Sie versuchen: mysql > use database_name; \. /path/to/file.sql

Das ist eine andere Möglichkeit, Ihre Daten zu importieren.

6
Alex

eine Möglichkeit, den Import zu beschleunigen, besteht darin, die Tabelle während des Imports zu sperren. Verwenden Sie die Option --add-locks für mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

oder Sie können einige nützliche Parameter mit - opt aktivieren. Dadurch werden einige nützliche Dinge für den Speicherauszug aktiviert.

mysqldump --opt --database db > db.sql

Wenn Sie ein anderes Speichergerät auf dem Server haben, verwenden Sie dieses - das Kopieren von einem Gerät auf ein anderes ist eine Möglichkeit, die Übertragung zu beschleunigen.

sie können auch Tabellen herausfiltern, die mit - ignore-table nicht benötigt werden

1
pgee70