Importation lente de bases de données MySQL avec mysqldump et USE .. SOURCE

8

J'ai environ 12 tables dans MySQL innoDB, l'une d'elles contient 11 millions d'enregistrements.

J'ai utilisé cette commande pour sauvegarder les choses:

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

Et cette commande pour importer des choses sur le nouveau serveur:

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

Voici la douleur qui m'afflige (le temps passe avec chaque requête!):

entrez la description de l'image ici

Que puis-je faire pour accélérer les choses? Quelque chose ne va pas avec ma commande mysqldump?

Kirk Ouimet
la source

Réponses:

5

Pour votre commande de vidage , vous pouvez utiliser ce qui suit

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

Les inserts allongés sont meilleurs.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction L'option de transaction unique est préférable pour vider les tables InnoDB.

Dans votre fichier my.cnf , apportez temporairement les modifications suivantes

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

innodb_doublewrite = 0

et aussi

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

innodb_flush_log_at_trx_commit = 2

Redémarrez MySQL, puis supprimez ces options après votre importation et redémarrez à nouveau MySQL.

Tables de mémoire

Si votre base de données entière peut tenir en mémoire, vous pouvez remplacer ENGINE = InnoDB par ENGINE = MEMORY dans votre fichier sql de vidage pour chaque table ou uniquement les tables dont l'importation est la plus longue, réimportez le fichier de vidage dans votre base de données puis changez le moteur en innodb.

ALTER TABLE name_of_table ENGINE = InnoDB;

commande mysqlimport

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

J'ai utilisé mysqlimport pour importer des données sauvegardées en utilisant l'option de format d'onglet dans mysqldump. Il s'est avéré plus rapide que l'importation via la commande mysql.

Vider la base de données à l'aide de mysqldump

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

Importez les données dans votre base de données.

mysqlimport -u [NOM D'UTILISATEUR] -p [DBNAME] /some_directory/tablename.sql

Craig Efrein
la source
5

Le chargement en masse d'InnoDB peut être très intimidant si vous n'avez pas InnoDB correctement réglé.

Voici les paramètres dont vous devez vous préoccuper:

Jusqu'à la moitié du pool de tampons peut être utilisée pour des inserts en vrac. Cela repousse les données mises en cache. Lors du rechargement d'un mysqldump dans les tables InnoDB, le pool de tampons devient une zone de guerre ouverte entre les données InnoDB nouvellement chargées et les modifications des index secondaires. À la lumière de cela, l'augmentation innodb_buffer_pool_sizeet innodb_log_file_sizeest vitale et impérative.

Assurez-vous également que ceux-ci sont activés. Un mysqldump devrait avoir ces variables mises à 0.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Vous pouvez vérifier cela avec un simple head -20sur le fichier mysqldump.

Il y a un autre aspect d'importation: innodb_change_buffering

Selon la documentation MySQL , vous pouvez dicter ce qui sera mis en mémoire tampon lors de toute opération DML. Pour plus de précisions à ce sujet, voir Contrôle de la mise en mémoire tampon des modifications InnoDB .

Je recommande les paramètres suivants:

[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
la source