Langsamer MySQL-Datenbankimport mit mysqldump und USE .. SOURCE

8

Ich habe ungefähr 12 Tabellen in MySQL innoDB, eine davon enthält 11 Millionen Datensätze.

Ich habe diesen Befehl verwendet, um Dinge zu sichern:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Und dieser Befehl zum Importieren von Dingen auf den neuen Server:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Hier ist der Schmerz, unter dem ich leide (die Zeit steigt mit jeder Anfrage!):

Geben Sie hier die Bildbeschreibung ein

Was kann ich tun, um die Dinge zu beschleunigen? Stimmt etwas mit meinem Befehl mysqldump nicht?

Kirk Ouimet
quelle

Antworten:

5

Für Ihren Dump- Befehl können Sie Folgendes verwenden

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Erweiterte Einsätze sind besser.

http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html#option_mysqldump_single-transaction Die Option Single Transaction eignet sich besser zum Dumping von InnoDB-Tabellen.

Nehmen Sie in Ihrer my.cnf- Datei vorübergehend die folgenden Änderungen vor

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

und auch

http://dev.mysql.com/doc/refman/5.0/de/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

Starten Sie MySQL neu und entfernen Sie diese Optionen nach dem Import und starten Sie MySQL erneut.

Speichertabellen

Wenn Ihre gesamte Datenbank in den Speicher passt, können Sie ENGINE = InnoDB in Ihrer Dump-SQL-Datei für jede Tabelle oder nur für die Tabellen, deren Import am längsten dauert, in ENGINE = MEMORY ändern. Importieren Sie die Dump-Datei wieder in Ihre Datenbank und dann den Motor wieder auf innodb stellen.

ALTER TABLE name_of_table ENGINE = InnoDB;

Befehl mysqlimport

http://linux.die.net/man/1/mysqlimport

Ich habe mysqlimport verwendet, um Daten zu importieren, die mit der Option für das Registerkartenformat in mysqldump gesichert wurden. Es hat sich als schneller als der Import über den Befehl mysql erwiesen.

Speichern Sie die Datenbank mit mysqldump

mysqldump --tab = / some_directory / -u [USERNAME] -p [DBNAME] [TABLENAME]

Importieren Sie die Daten in Ihre Datenbank.

mysqlimport -u [USERNAME] -p [DBNAME] /some_directory/tabellenname.sql

Craig Efrein
quelle
5

Das Laden von InnoDB in großen Mengen kann sehr entmutigend sein, wenn Sie InnoDB nicht richtig eingestellt haben.

Hier sind die Einstellungen, mit denen Sie sich befassen müssen:

Bis zur Hälfte des Pufferpools kann für Masseneinsätze verwendet werden. Dadurch werden zwischengespeicherte Daten ausgegeben. Während eines erneuten Ladens eines mysqldump in InnoDB-Tabellen wird der Pufferpool zu einer offenen Kriegszone zwischen neu geladenen InnoDB-Daten und Änderungen an Sekundärindizes. In Anbetracht dessen nimmt zu innodb_buffer_pool_sizeund innodb_log_file_sizeist lebenswichtig und zwingend.

Stellen Sie außerdem sicher, dass diese ausgelöst sind. Bei einem mysqldump sollten diese Variablen auf 0 gesetzt sein.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Sie können dies mit einer einfachen head -20Datei in der mysqldump-Datei überprüfen .

Es gibt noch einen weiteren wichtigen Aspekt: innodb_change_buffering

Gemäß der MySQL-Dokumentation können Sie festlegen, was während eines DML-Vorgangs gepuffert wird. Ausführliche Informationen hierzu finden Sie unter Steuern der InnoDB-Änderungspufferung .

Ich empfehle folgende Einstellungen:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
RolandoMySQLDBA
quelle