Je fais cela depuis plusieurs années dans différents contextes, avec des bases de données petites à moyennes (1 G à 100 G). Le principe de base mysqldump
fonctionne pour les petits ensembles de données ; plus ils sont petits, mieux c'est.
Lorsque vous dépassez 5 à 10 Go, selon la charge de MySQL, rapide et sale ne fait plus l'affaire.
pourquoi mysqldump
pourrait ne pas suffire
Le problème avec MySQLdump est que pendant qu'il effectue le dump, la base de données active est soit inutilisable, soit très difficile à utiliser, soit la sauvegarde ne sera pas cohérente. À moins que vous ne disposiez d'une fenêtre temporelle suffisamment large pour que le caractère inutilisable de la base de données en direct ne soit pas important, car la base de données ne doit pas être utilisée de toute façon (par exemple, tard dans la nuit).
Les options par défaut ( aquí une discussion sur le pourquoi) rendent la base de données presque inutilisable pendant qu'elle est vidée, sauf si l'utilisation se limite à la lecture de données et à peu de choses. Sur un site de commerce électronique très fréquenté, vous risquez d'être confronté à un carambolage de clients.
Donc, vous utilisez InnoDB et les options modernes (pas par défaut, pour autant que je sache)
--single-transaction --skip-lock-tables
qui permettent au site de fonctionner, bien que plus lentement que la normale, pendant le vidage. En fonction de l'utilisation, cela peut être visiblement plus lent.
Pendant que vous y êtes, videz également les autres données qui pourraient être importantes :
--events --triggers --routines
(...oh, et cela n'aura toujours pas vidé les permissions des utilisateurs. Pour servir de test, peut-être que ce n'était pas si important).
Il existe une solution de contournement que j'ai trouvée "conseillée" ( !) comme un "super hack", qui consiste essentiellement à désactive l'intégrité transactionnelle permettant à la base de données de fonctionner à pleine vitesse pendant qu'elle est vidée. Un peu comme si vous enleviez les freins de votre voiture pour l'alléger et la faire rouler plus vite, oui, ça marchera, mais cela aura des effets secondaires que vous ne remarquerez peut-être pas immédiatement. Vous sera Vous les remarquerez presque sûrement tôt ou tard - et comme pour les freins, ce sera au moment où vous en aurez le plus besoin, et ce ne sera pas joli.
Toutefois, pour un test base de données, ça peut toujours marcher.
Xtrabackup
Si vous avez une base de données "sérieuse", quelle est la raison de ne pas avoir une sauvegarde "sérieuse ?
Réplication esclave
Une autre possibilité si vous avez de l'espace libre - et, de nos jours, 20 Go, ce n'est pas beaucoup - est d'utiliser une base de données auxiliaire.
Vous pouvez installer une deuxième copie de MySQL Server sur le même serveur sur un port différent, et qu'il soit l'esclave (le serveur subira une baisse de performance, en termes de vitesse de stockage). Vous aurez alors deux bases de données identiques (maître vivant, esclave vivant). La première fois vous devrez toujours effectuer une vidange complète pour les synchroniser, avec tous les problèmes que cela implique.
Lorsque vous avez besoin de cloner la base de données de test, arrêtez la réplication de l'esclave - l'esclave vivant restera désormais "gelé" dans le temps - et sauvegardez l'esclave vivant sur la base de données de test, en utilisant MySQLbackup ou en copiant simplement les fichiers de données. Une fois cela fait, vous redémarrez la réplication.
L'impact sur le maître en direct est négligeable, et l'esclave peut en fait être utilisé pour des sélections non critiques pour la mise à jour.
0 votes
12,9 Go pour le moment et en pleine croissance.
0 votes
Dans le cas peu probable où vous n'auriez pas
auto_increment
Vous pourriez mettre en place une réplication, mais garder l'esclave arrêté la plupart du temps. Périodiquement alors, vousSTART SLAVE;
et il se met à jour. Si vous avez des champs à incrémentation automatique, cela entraînera des collisions de clés.