Comment accélérer une restauration MySQL à partir d'un fichier de vidage?

28

Je restaure une base de données de 30 Go à partir d'un fichier mysqldump vers une base de données vide sur un nouveau serveur. Lors de l'exécution du SQL à partir du fichier de vidage, la restauration démarre très rapidement, puis commence à devenir de plus en plus lente. Les insertions individuelles prennent maintenant plus de 15 secondes. Les tables sont principalement MyISAM avec un petit InnoDB. Le serveur n'a aucune autre connexion active. SHOW PROCESSLIST;affiche uniquement l'insertion de la restauration (et la liste de processus d'exposition elle-même).

Quelqu'un at-il une idée de ce qui pourrait être à l'origine du ralentissement spectaculaire?

Y a-t-il des variables MySQL que je peux changer pour accélérer la restauration pendant qu'elle progresse?

Dave Forgac
la source
Modifié pour corriger les types de table
Dave Forgac

Réponses:

26

Une chose qui peut ralentir le processus est le key_buffer_size , qui est la taille du tampon utilisé pour les blocs d'index. Réglez cela sur au moins 30% de votre RAM ou le processus de réindexation sera probablement trop lent.

Pour référence, si vous utilisiez InnoDB et des clés étrangères, vous pouvez également désactiver les vérifications de clés étrangères et les réactiver à la fin (en utilisant SET FOREIGN_KEY_CHECKS=0et SET FOREIGN_KEY_CHECKS=1).

Marco Ramos
la source
1
J'ai trouvé deux choses: le key_buffer_size était réglé sur 8 Mo et il y avait une table InnoDB dans le mix avec des clés étrangères. Augmentation de la taille de key_buffer_size à 1 Go et désactivation temporaire des vérifications de clés étrangères. La restauration s'est terminée en 5 minutes. Merci!
Dave Forgac
Hou la la! Heureux que cela ait aidé :)
Marco Ramos
2
Je viens de remarquer que j'ai tapé «5» minutes. Je suis à peu près sûr que c'était plus comme 50 minutes mais toujours beaucoup plus raisonnable ;-)
Dave Forgac
5
key_buffer_size est pour MYISAM.
Fernando Fabreti
@FernandoFabreti - c'est un point important pour de nombreux lecteurs, mais l'OP a précisé qu'ils avaient surtout MyISAM
mc0e
22

Ce lien montre ce que l'on peut faire pour accélérer le processus de restauration.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

On peut mettre les commandes en haut du fichier de vidage

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

Et mettez ces instructions à la fin du fichier de vidage

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Cela a fonctionné pour moi. Bonne restauration :-)

Dharmesh Tailor
la source
8
Cela a beaucoup aidé. Plutôt que de modifier le fichier, j'ai créé pre.sql et post.sql à partir des extraits de code ci-dessus et utilisé cela pour restaurer la base de données:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs
1

La seule raison pour laquelle je peux imaginer pourquoi la restauration ralentirait progressivement est l'indexation. Envisagez de désactiver l'indexation jusqu'à la fin, puis laissez-le faire le tout à la fois.

John Gardeniers
la source
1

Si vous avez la copie physique du fichier de vidage (le répertoire DB), vous pouvez simplement la copier sur le nouveau serveur si le nouveau serveur a la même version MySQL et cela fonctionnera correctement. Cela fonctionne bien avec MyISAM et pour moi, je pense que c'est mieux que de restaurer les données basées sur le fichier de vidage SQL logique.

usef_ksa
la source
0

si vous avez plusieurs tables, vous pourriez bénéficier de mk-parallel-restore .

pQd
la source
Ceci est désormais obsolète et ne doit être utilisé que pour restaurer les données de test, pas pour restaurer les sauvegardes réelles.
svandragt
0

Cela fera:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u racine -p <Backup_Database.mysql

Matiss
la source
-1

Je vous ai suggéré,

  1. Vérifiez vos tableaux: a-t-il des déclencheurs? Supprimer tous les déclencheurs
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( ET NE PAS OUBLIER DE CHANGEMENTS ROLLBACK CE )
  3. UTILISER LA LIGNE DE COMMANDE COMME mysql -u root -pPasss requests < mydb.sql
  4. Vérifiez la taille de votre fichier de base de données

Bonne chance

Ferhat KOÇER
la source