Sauvegarder quotidiennement une base de données MySQL de 22 Go

28

En ce moment, je suis capable de faire la sauvegarde en utilisant mysqldump. Mais je dois arrêter le serveur Web ET cela prend environ 5 minutes pour faire la sauvegarde. Si je ne supprime pas le serveur Web, cela prend une éternité et ne se termine jamais + le site Web devient inaccessible pendant la sauvegarde.

Existe-t-il un moyen plus rapide / meilleur de sauvegarder mes 22 Go et une base de données croissante?

Toutes les tables sont MyISAM.

anon
la source
jetez un oeil à ce lien c'est à une question similaire serverfault.com/questions/8044/backup-mysql-server
Charles Faiga

Réponses:

28

Oui.

Configurez la réplication sur une deuxième machine. Lorsque vous devez effectuer une sauvegarde, vous pouvez verrouiller la machine secondaire, exécuter mysqlhotcopy ou mysqldump, puis la déverrouiller. Il rattrapera votre maître et vous n'aurez jamais à le mettre hors ligne.

Vous pouvez même le faire sur la même machine, si cela ne vous dérange pas de doubler les E / S d'écriture, mais idéalement, vous devez les sauvegarder en temps réel sur un deuxième serveur physique et effectuer vos sauvegardes de clichés aussi souvent que vous le souhaitez. sans déranger votre serveur de production.

Il est également théoriquement possible de restaurer une base de données en utilisant un état connu et des binlogs. Je ne l'ai jamais fait, alors veuillez d'abord enquêter, mais vous pouvez sauvegarder un état connu de votre base de données, puis simplement sauvegarder tous les nouveaux binlogs et les relire si vous avez besoin de restaurer. Les binlogs étant écrits de manière linéaire, la synchronisation de nouveaux binlogs sur un ordinateur distant serait très rapide.

Edit: En effet, il semble que l'utilisation de binlogs pour la sauvegarde soit documentée.

Cette question est fortement liée

John Douthat
la source
Oui, cela fonctionne très bien et allait être ma réponse. Le seul inconvénient majeur est que vous devez vous assurer que la réplication fonctionne correctement au quotidien. Nous prenons des instantanés de notre base de données d'esclaves pendant les heures ouvrables et une sauvegarde nocturne du maître.
5

Pardonnez-moi d'avoir supposé que le système d'exploitation est Linux. Si vous n'utilisez pas LVM, vous devriez l'être. Si vous l'êtes, voici un moyen très simple de faire des sauvegardes via un instantané.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Cela vous permettra de faire des sauvegardes nocturnes sans avoir à ajouter de serveur esclave. Je suis très favorable à un serveur esclave pour la haute disponibilité, mais je ne veux pas que vous pensiez que vous êtes bloqué jusqu'à ce que vous puissiez créer cet esclave.

Bruno Bronosky
la source
2

TABLES DE RINÇAGE AVEC VERROUILLAGE EN LECTURE n'est pas quelque chose que vous voulez faire de façon régulière (ou même semi-régulière) sur un système de production. Ce ne devrait être qu'un dernier recours.

Configurez au moins deux esclaves de réplication (cela nécessitera bien sûr un FLUSH TABLES WITH READ LOCK). Une fois qu'ils sont configurés, vous pouvez supprimer une sauvegarde tandis que l'autre reste synchronisé en tant que maître de rechange.

De plus, si l'un de vos esclaves tombe en panne, vous pouvez alors utiliser un instantané de celui-ci pour reconstruire un deuxième (ou troisième) esclave. Si tous vos esclaves échouent, vous êtes de retour à RINCER LES TABLES AVEC LECTURE VERROU.

N'oubliez pas de toujours avoir un processus qui vérifie régulièrement que les données sont synchronisées - utilisez quelque chose comme mk-table-checksum pour ce faire (ce n'est pas trivial à configurer, consultez la documentation Maatkit pour plus de détails).

Comme 22 Go sont relativement petits, vous n'aurez aucun problème à le faire. Le faire avec une grande base de données pourrait être plus problématique.

MarkR
la source
1

La solution ici est double, comme décrit ci-dessus:

  1. Configurez la réplication de votre serveur vers un esclave que vous pouvez mettre hors ligne. La meilleure façon de procéder consiste à effectuer un vidage de la base de données à l'aide de mysqldump et du paramètre --master-data.
  2. Configurez des sauvegardes nocturnes sur l'esclave. Vous pouvez soit utiliser mysqldump avec les drapeaux --master-data --flush-logs et --single-transaction, soit arrêter le serveur mysql, copier les fichiers de données sur le disque et le redémarrer (la réplication reprendra où il s'est arrêté).
  3. Exécutez un script sur l'esclave toutes les (par exemple 5, 10, 20 minutes) pour vérifier et vous assurer que mysql est toujours en train de se répliquer. J'ai écrit un script python simple pour le faire, que vous êtes invités à utiliser.

Notez que si vous utilisez InnoDB pour vos tables, vous pouvez utiliser l'indicateur --single-transaction pour éviter d'avoir à verrouiller les tables et toujours obtenir un vidage cohérent de la base de données, même sur le maître, et donc effectuer vos sauvegardes sans démonter le serveur. Cependant, la solution ci-dessus est meilleure.

De plus, si vous utilisez LVM sous Linux, vous pouvez prendre un instantané LVM de la partition, puis le sauvegarder. Les instantanés LVM sont atomiques, donc si vous effectuez un `` vidage de tables avec verrouillage en lecture '' puis prenez votre instantané et déverrouillez, vous obtiendrez un instantané cohérent.

Si vous êtes préoccupé par la contention d'E / S rendant le vidage trop long, vous pouvez ajouter une troisième machine et exécuter mysqldump sur celle-ci sur le réseau pour éviter de saturer vos disques.

Dan Udey
la source
0

Selon votre environnement, les instantanés sont généralement une excellente façon de procéder. Surtout si vous devez sauvegarder le maître pour une raison quelconque. Nous exécutons des paires maître et esclave et utilisons des sauvegardes instantanées sur les deux.

  1. FLUSH TABLES WITH READ LOCK;
  2. Tirez un instantané sur la base de données et les systèmes de fichiers journaux.
  3. UNLOCK TABLES;
  4. Copiez vos fichiers de données de l'instantané à votre guise.

Avec les tables InnoDB, vous voudrez exécuter SET AUTOCOMMIT=0;avant d'exécuter le verrou de lecture.

jasonjwwilliams
la source
-1

Vous pouvez effectuer une sauvegarde progressive. Sauvegardez 1 / 24ème des enregistrements toutes les heures. Le seul problème avec cette approche est que si elle se bloque pendant les premières heures de la journée, vous perdrez quoi que ce soit entre ce moment et le moment de l'accident. De toute façon, c'est moins de 24 heures de records perdus (je ne sais pas à quel point c'est important pour vous).

musicfreak
la source