Meilleures pratiques pour la sauvegarde d'une base de données MySQL

23

J'ai récemment découvert que nos serveurs Web de production qui fonctionnent avec MySQL ne sont pas sauvegardés régulièrement (ou pas du tout). J'ai l'habitude de sauvegarder des bases de données SQL Server mais je n'ai pas une tonne d'expérience avec les bases de données MySQL. Quelles sont les meilleures pratiques pour utiliser 'mysqldump' ou tout autre outil de sauvegarde DB?

Je vais probablement cron job le calendrier afin qu'il se fasse tous les soirs, puis sauvegarder les fichiers avec mon système de sauvegarde.

Merci.

Valien
la source

Réponses:

29

Meilleures pratiques pour effectuer une sauvegarde du serveur MySQL:

Réplication MySQL

Configuration de la réplication dans MySQL. Vous devrez configurer le serveur maître et esclave. Toutes les écritures en lecture dans la base de données peuvent aller sur votre serveur esclave. L'avantage de la réplication est que vous pouvez effectuer une sauvegarde de votre serveur esclave sans interrompre le serveur maître. Votre application continuera à fonctionner sur le maître sans aucun temps d'arrêt.

Utilisation de MySQL Dump

Si votre ensemble de données est petit (je me rends compte que "petit" est un terme relatif .. pour le qualifier, disons <10 Go), alors mysqldump fonctionnera probablement très bien. C'est facile, c'est en ligne et c'est très flexible. Juste quelques choses que mysqldump peut faire: sauvegarder tout ou simplement certaines bases de données ou tables sauvegarder uniquement le DDL optimiser le vidage pour une restauration plus rapide rendre le fichier sql résultant plus compatible avec d'autres SGBDR et bien d'autres choses.

Cependant, les options les plus importantes sont liées à la cohérence de votre sauvegarde. Mes options préférées sont: --single-transaction: cette option donne une sauvegarde cohérente, si (et seulement si) les tables utilisent le moteur de stockage InnoDB. Si vous avez des tables MyISAM non en lecture seule, n'utilisez pas cette option lorsque vous les sauvegardez. --master-data = 2: cette option s'assurera que votre vidage est cohérent (en effectuant un verrouillage de toutes les tables sauf si vous avez ajouté l'option --single-transaction). L'option --master-data enregistre également la position du journal binaire dans le fichier de vidage résultant (= 2 fait que cette ligne est un commentaire dans le fichier de vidage)

Remarque finale sur mysqldump: gardez à l'esprit que le temps de restauration peut être considérablement plus long que le temps de sauvegarde. Cela dépendra de plusieurs facteurs, par exemple le nombre d'index dont vous disposez.

Instantané LVM

Pour ceux qui ont des ensembles de données plus importants, une sauvegarde physique est la solution. Bien que vous puissiez effectuer une sauvegarde à froid (par exemple, arrêter le service MySQL, copier le répertoire de données, redémarrer le service), de nombreuses personnes ne veulent pas de temps d'arrêt. Ma solution préférée est les instantanés. Cela peut être chaud (pour InnoDB) ou nécessiter un bref verrouillage (pour MyISAM). N'oubliez pas d'inclure toutes vos données (notamment les ib_logfiles). Lenz fournit un bel utilitaire pour vous aider avec ceci: http://www.lenzg.net/mylvmbackup/

Utilisation de MySQL Enterprise Backup

Avantages de l'utilisation de MySQL Enterprise Backup:

  • Les sauvegardes "à chaud" des tables InnoDB ont lieu entièrement en ligne, sans bloquer la sauvegarde uniquement des tables ou des espaces de table particuliers
  • Sauvegarder uniquement les données modifiées depuis une sauvegarde précédente
  • Sauvegarde compressée - Économise le stockage jusqu'à 90% et bien plus encore.

Référence: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
la source
7

Je recommanderais de configurer une réplique dédiée à utiliser pour la sauvegarde. Cela vous permettra d'effectuer toutes les tâches de sauvegarde sans impact sur le principal. Comme cela ajoute de la complexité à votre architecture, vous souhaiterez surveiller le retard de réplication pour vous assurer que tout fonctionne.

En ce qui concerne le processus réel, vous disposez de quelques options sans outils tiers. Les instantanés peuvent être prises à l' aide de la mysqldumpcommande ( en supposant que vous utilisez InnoDB): mysqldump --all-databases --single-transaction > all_databases.sql. Selon la taille des données, il peut être préférable d'arrêter MySQL et de sauvegarder directement les fichiers de données. Lorsque la réplique est redémarrée, elle rejouera tous les événements que le principal a reçus pendant la durée de son interruption. Si vous utilisez MySQL Enterprise, l' mysqlbackuputilitaire le fait.

Des sauvegardes incrémentielles peuvent être effectuées en activant le journal binaire sur la réplique. De toute évidence, cela enregistre uniquement les événements qui mutent les données, vous devrez donc combiner cela avec les instantanés ci-dessus.

Rich Schumacher
la source
3
+1 pour --single-transactionmais n'oubliez pas d'ajouter --events --routineset j'utilise toujours --triggersaussi, même s'il est activé par défaut, car il peut être désactivé dans my.cnf. Je dirais qu'il est à peu près toujours bon de les utiliser comme pratique standard, que vous ayez actuellement ces types d'objets dans votre base de données ou non.
Michael - sqlbot
Remarque mysqldump --all-databases pourrait déclencher des erreurs lorsque vous avez défini un paramètre de tables ouvertes max. alors gardez un œil sur votre mysql.log. La réplication serait en effet le meilleur moyen de sauvegarde
Raymond Nijland
Comment conservez-vous alors des copies historiques des données? (Souvent, un client souhaite conserver un mois ou plus de sauvegardes, et lorsqu'un bogue d'application corrompt les données, les développeurs veulent une copie de la base de données avant le bogue.)
RonJohn