web-dev-qa-db-fra.com

Sauvegarde rapide et restauration de la base de données MySQL pour revenir à des modifications récentes

J'ai un document décemment Big MySQL DB (Innodb) avec taille d'environ 400 Mo. Ainsi dumping Toute la base de données avec mysqldump et restauration le retour prend pour toujours (plus de 15 minutes, qui est inacceptable).

Pour déboguer, je dois exécuter mon code contre une certaine "version" de la DB, puis revenir toutes les modifications appuyées (le cas échéant) et essayez à nouvea (éventuellement plusieurs fois). Afin de reproduire un bogue, je dois toujours commencer à partir de la même version de DB.

Y a-t-il un moyen d'indiquer manuellement le dB à créer un instantané de point à temps et ensuite Restaurer la demande à la demande? Cela devrait idéalement prendre quelques secondes seulement (j'imagine qu'une méthode de copie-écriture serait utilisée).

Je cherche une solution indépendante de l'application finale. Imaginez une application Web que vous devez exécuter vos tests de robots sur (qui inclut plusieurs cycles de demande/réponse). De plus, si nous traitons la demande comme éventuellement de buggy, nous ne pouvons pas non plus lui faire confiance pour gérer de manière fiable les retombées sur les transactions.

J'ai juste essayé de sauvegarder /var/lib/mysql avec rsync. Impossible même de démarrer MySQL après la restauration, il y a probablement du fichier laissé quelque part qui enfreint l'intégrité. Quoi qu'il en soit, je cherchais une solution de niveau plus supérieure, recours aux sauvegardes de niveau FS uniquement comme dernier espoir.

4
Jozef

Copier le répertoire de données, comme vous l'avez mentionné, est un moyen d'accomplir ce dont vous avez besoin. Voici les étapes et si vous faites face à une erreur, veuillez le poster.

  1. Fermer le serveur MySQL. ou dans une borne de tables encastrées avec verrou FLUSH TABLES WITH READ LOCK [IMPORTANT : Gardez le terminal ouvert]
  2. Copiez le répertoire de données: cp ou rsync
  3. Redémarrez le serveur si vous le fermez; Ou retournez au terminal et déverrouillez les tables: UNLOCK TABLES
  4. Faire plusieurs copies de la copie que vous avez déjà faite
  5. Chnage le propriétaire des répertoires nouvellement créés pour MySQL: chown mysql:mysql dir_name (Je pense que c'est chown -r, donc ça marche récursivement)

Jusqu'à présent, vous avez plusieurs copies des données au moment où vous avez besoin.

Afin de "restaurer" une copie, vous pouvez faire l'une des opérations suivantes:

  • Modifiez la valeur de datadir dans my.cfg (ou my.ini) à un emplacement de l'une des copies de données et redémarrez le serveur; OU ALORS
  • Arrêtez le serveur et copiez le contenu d'une copie des données dans le répertoire de données d'origine et commencez à nouveau au serveur.
1
Jehad Keriaki

Établissez LVM sur le système de fichiers. Ensuite, un instantané prend moins d'une seconde, quelle que soit la taille du jeu de données. Vous obtenez une copie séparée du disque, mais avec des blocs inchangés partagés. Les blocs modifiés sont "Copy-on-write", vous devez donc souffler l'instantané avant de pousser trop gros. (Soudls comme ça n'est pas un problème.)

Puisqu'il y a essentiellement NO Copie de données (A la MySqldump ou les vidages de fichiers), il est très rapide. Vous auriez deux instances exécutées sur la même machine, mais dirigez-vous de "volumes logiques", afin qu'ils puissent fonctionner de manière indépendante. (Remarque: utilisez un autre port pour chaque instance.)

0
Rick James