2009-08-18 5 views
3

J'utilise rsync pour sauvegarder les fichiers sur mon serveur, et mysqldump pour sauvegarder ma base de données. Voici ma préoccupation:Assurer l'intégrité des données de mysqldump <-> rsync

Un mysqldump sur ma base de données prend environ 30 secondes. J'ai une table appelée photos qui stocke des informations sur les images qu'un utilisateur a téléchargées, y compris le chemin d'accès au fichier. Je suis inquiet de ce qui se passera quand les photos seront téléchargées ou supprimées pendant les 30 secondes nécessaires pour compléter mysqldump. Si cela arrivait et que je devais ensuite restaurer les fichiers rsync'd et les données mysqldump, je pourrais alors regarder une base de données qui contient des lignes pointant vers des photos supprimées, ou des lignes manquantes pour les photos qui ont été téléchargées avec succès.

Comment puis-je m'assurer que mysqldump correspond exactement à rsync?

Merci à l'avance, Brian

Répondre

1

Utilisez LOCK TABLES pour bloquer toute activité d'écriture à partir des tables que vous sauvegardez. Puis déverrouillez-les une fois que votre mysqldump est terminée.

+1

Verrouiller les tables pendant la durée de mysqldump n'est pas suffisant - vous devez également les garder verrouillées pendant que rsync est en cours d'exécution. Sinon, si par ex. le rsync suit la sauvegarde, les fichiers peuvent être supprimés sur le disque que les revendications de vidage devraient être là; Pourtant, ces fichiers ne finissent pas dans le rsync. –

+0

Donc, si les tables sont verrouillées et qu'un utilisateur télécharge un fichier, la requête INSERT pour créer l'enregistrement se poursuivra une fois les tables déverrouillées? Est-ce mauvais si la requête doit attendre 30+ secondes? – Brian

0

Vous pouvez MD5 le résultat mysqldump (sur le serveur) et le transféré (localement) par rsync, puis comparez les deux hachages pour s'assurer qu'ils correspondent. Une autre alternative, est de définir mysqldump sur un fichier de version contrôlée (avec git ou svn ou vos vcs préférés). L'avantage avec git, par exemple, est que vous pouvez facilement configurer des hooks post-commit pour pousser les changements sur un serveur distant, et le téléchargement sera juste les différences entre les versions, pas la sauvegarde complète. De cette façon, vous pourriez penser à diminuer la période de sauvegarde.

1

Je pense que la réponse est simple, il suffit de lancer rsync APRES avoir terminé mysqldump :) De cette façon, au pire, vous aurez quelques nouveaux fichiers qui ne sont pas dans le db, mais vous n'aurez pas d'entrées db incohérentes.

Questions connexes