Quel est le moyen le plus rapide de vider & amp; charger une base de données MySQL InnoDB en utilisant mysqldump?

StackOverflow https://stackoverflow.com/questions/131085

  •  02-07-2019
  •  | 
  •  

Question

Je voudrais créer une copie d'une base de données avec environ 40 tables InnoDB et environ 1,5 Go de données avec mysqldump et MySQL 5.1.

Quels sont les meilleurs paramètres (c'est-à-dire: --single-transaction) qui entraîneront le vidage et le chargement les plus rapides des données?

De même, lors du chargement des données dans le deuxième DB, est-il plus rapide de:

1) dirigez les résultats directement vers la seconde instance du serveur MySQL et utilisez l'option --compress

ou

2) chargez-le à partir d'un fichier texte (par exemple: mysql < my_sql_dump.sql)

Était-ce utile?

La solution

Dirigez-le directement vers une autre instance pour éviter les frais de disque. Ne vous embêtez pas avec - compresser sauf si vous utilisez un réseau lent, car sur un réseau local rapide ou en boucle, la surcharge du réseau importe peu.

Autres conseils

VIDÉO vider rapidement une base de données mise au repos:

Utilisation du " -T " Avec l'option mysqldump, beaucoup de fichiers .sql et .txt se trouvent dans le répertoire spécifié. C’est environ 50% plus rapide pour vider des tables volumineuses qu’un seul fichier .sql avec des instructions INSERT (prend 1/3 de moins que le temps d’horloge).

De plus, la restauration permet de charger plusieurs tables en parallèle et de saturer plusieurs cœurs. Sur un boîtier à 8 cœurs, cela pourrait représenter une différence de 8X entre le temps passé par l'horloge murale pour restaurer le vidage, en plus des améliorations d'efficacité apportées par "-T". Parce que " -T " Chaque table est stockée dans un fichier séparé. Il est donc plus facile de les charger en parallèle que de scinder un fichier .sql volumineux.

En prenant les stratégies ci-dessus à leur extrême logique, on pourrait créer un script pour vider une base de données en parallèle. Eh bien, c’est exactement ce que le maakit mk-parallel-dump (voir http: // www .maatkit.org / doc / mk-parallel-dump.html ) et les outils mk-parallel-restore sont; les scripts perl qui font plusieurs appels au programme mysqldump sous-jacent. Cependant, lorsque j’ai essayé de les utiliser, j’ai eu du mal à terminer la restauration sans dupliquer les erreurs de clé qui ne se produisaient pas avec les vidages à la vanille. N'oubliez donc pas que votre kilométrage peut varier.

Transfert de données d'une base de données LIVE (sans interruption de service):

Le commutateur --single-transaction est très utile pour effectuer un dump d’une base de données en direct sans avoir à la mettre au repos ou pour effectuer un dump d’une base de données esclave sans avoir à arrêter d’asservir.

Malheureusement, -T n’est pas compatible avec --single-transaction, vous n’en obtenez donc qu’une.

Habituellement, prendre le dump est beaucoup plus rapide que le restaurer. Il reste encore de la place pour un outil qui prend le fichier de vidage monolithique entrant et le divise en plusieurs parties à charger en parallèle. À ma connaissance, un tel outil n'existe pas encore.

Le transfert de la copie sur le réseau est généralement une victoire

Pour écouter un vidage entrant lors d'une exécution d'hôte:

nc -l 7878 > mysql-dump.sql

Ensuite, sur votre hôte de base de données, exécutez

mysqldump $OPTS | nc myhost.mydomain.com 7878

Cela réduit les conflits entre les disques sur le maître et l'écriture du dump sur le disque, ce qui accélère légèrement le dump (en supposant que le réseau soit suffisamment rapide pour suivre le rythme, hypothèse relativement sûre pour deux hôtes dans le même centre de données). De plus, si vous construisez un nouvel esclave, cela évite d'avoir à transférer le fichier de vidage à la fin.

Mises en garde - de toute évidence, vous devez disposer de suffisamment de bande passante réseau pour ne pas ralentir la tâche de manière insupportable. Si la session TCP est interrompue, vous devez tout recommencer, mais pour la plupart des dumps, ce n'est pas une préoccupation majeure.

Enfin, je souhaite éclaircir un point de confusion commune.

Malgré la fréquence à laquelle vous voyez ces drapeaux dans les exemples et les tutoriels de mysqldump, ils sont superflus car ils sont activés par défaut:

  • - opt
  • - add-drop-table
  • - add-locks
  • - options de création
  • - touches de désactivation
  • - insert étendu
  • - tables de blocage
  • - rapide
  • - set-charset .

De http://dev.mysql.com/doc/refman /5.1/en/mysqldump.html :

  

L'utilisation de --opt revient à spécifier --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables , --quick, et --set-charset. Toutes les options que --opt représente sont également activées par défaut car --opt est activé par défaut.

Parmi ces comportements, " - quick " est l'un des plus importants (ignore la mise en cache de l'ensemble des résultats dans mysqld avant de transmettre la première ligne), et peut être associé à "mysql" (qui n’active pas --quick ON par défaut) accélère considérablement les requêtes renvoyant un jeu de résultats volumineux (par exemple, le vidage de toutes les lignes d’un grand tableau).

Je pense que ce sera beaucoup plus rapide et vous permettra d'économiser de l'espace disque si vous essayez réplication de la base de données au lieu d'utiliser mysqldump. Personnellement, j'utilise entreprise sqlyog pour mon travail très difficile, mais aussi un certain nombre de d'autres outils pouvant fournir les mêmes services. à moins bien sûr que vous souhaitiez utiliser uniquement mysqldump.

Pour innodb, "order-by-primary" --extended-insert est généralement la meilleure combinaison. Si votre tout dernier niveau de performance et la boîte cible ont plusieurs cœurs de processeur, vous pouvez scinder le fichier de vidage résultant et effectuer des insertions parallèles dans de nombreux threads, jusqu'à innodb_thread_concurrency / 2.

Réglez également innodb_buffer_pool_size sur la cible autant que vous le pouvez et augmentez innodb_log_file_size à 128 ou 256 Mo (attention, vous devez supprimer les anciens fichiers journaux avant de redémarrer le démon mysql, sinon il ne redémarrera pas)

Utilisez l'outil mk-parallel-dump de Maatkit.

Au moins, ce serait probablement plus rapide. Je ferais davantage confiance à mysqldump.

À quelle fréquence faites-vous cela? Est-ce vraiment un problème de performance d'application? Peut-être devriez-vous concevoir un moyen de le faire sans qu'il soit nécessaire de vider l'intégralité des données (réplication?)

D'un autre côté, 1.5G est une base de données assez petite, donc ce ne sera probablement pas un problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top