backup sql, importer un fichier dump pour recréer une table sql

Nouveau WRInaute
Bonjour à tous,

Dans mon projet (et besoin) de backup de sauvegarde, je me pose certaines questions, notamment d'importation de fichier_dump pré produit pour recréer les tables désirées

Je m'explique: je veux par exemple sauvegarder ma table 'membres', les infos inscrites sur celle-ci sont censées ne jamais être modifiées une fois l'utilisateur inscrit.

Je compte donc faire une sauvegarde quotidienne de cette table mais uniquement à partir d'une certaine ligne censée représenté les nouveaux inscrits quotidien. Comme en théorie, l'utilisateur pourra vouloir modifier son mail, son password en cas d'oubli, se désinscrire... alors là je compte aussi faire une sauvegarde hebdomadaire de toute la table

Dans le cas où je devrais récupérer mes sauvegardes, je compte donc utiliser la dernière sauvegarde hebdomadaire auquel je rajouterai les sauvegardes quotidiennes des jours manquants

Or c'est ici que se trouve mon pb, si pour recréer une table entière avec le fichier dump hebdomadaire, je fais simplement
=> mysql -u user -ppass ma_bdd --tables membres < fichier_dump_hebdomadaire

Comment y rajouter les lignes supplémentaires contenues dans les fichiers_dump quotidiens ??

Ce que ma logique toute perso me pense à faire est-il correct ?
=> mysql -u user -ppass ma_bdd --tables membres -w"id>x" < fichier_dump_quotidien

En attendant vos avis et conseils
merci d'avance
 
WRInaute passionné
Hello,

backup quotidiens + logs binaires, ça semble effectivement plus simple et fiable que d'aller injecter des règles «métier» dans la procédure de sauvegarde.
 
Nouveau WRInaute
salut,

oui j'entend bien qu'un backup complet de la table est bien plus simple, mais pour reprendre mon exemple:

supposons que ma table membres possède des millions d'entrée à raison de plusieurs colonnes par lignes et qu'elle pèse donc son poids (quelques Go, ça reste une hypothèse), si je dois faire un dump complet de cette table tous les soirs (ainsi que d'autre tables en parallèle) et en conserver les sauvegardes des 15 derniers jours, ça va devenir une vrai usine à gaz.

Quand en plus, la table membre est en théorie très peu modifiée une fois les membres inscrits, ça me ferait beaucoup de doublons et donc d'espace de sauvegarde utilisé pour rien. D'où mon idée de sauvegarde complète une fois par semaine et partielle (les derniers inscrits) chaque jour

Le pb c l'ajout des backup quotidiens après avoir restauré la dernière sauvegarde complète de ma table hebdomadaire.

En imaginant un simple système D, on peut s'en sortir assez facilement :

je créé une table membres1 correspondant à la dernière save complète hebdomadaire, je créé autant de tables membres2, membres3... que de save partielle et je merge toutes les tables dans ma table finale membres qui est celle d'origine et utilisée en production

Je dois juste vérifier qu'il n'y ait aucune ligne en doublon au cas où, en regardant les id de chacune des premières entrés des tables partielles et les comparer aux derniers id de celles précédentes, pour les supprimer au cas où.

Je pense que ce système D est logique et faisable, mais biensur ça reste un système D, alors s'il existait un moyen possible de rajouter des entrées à une table directement à partir d'un fichier dump sans avoir à créer une nouvelle table et de faire un merge, ce serait cool, sinon tant pis

En attendant vos avis, critiques et autres,
merci d'avance
 
WRInaute passionné
Bonsoir,

si la BDD devient vraiment conséquente (1Go ?), de toutes façons tu n'utiliseras plus ce type de backup et passera à des outils plus adaptés (xtrabackup, mylvmbackup, etc).
Dès qu'il y a un peu de trafic, les problématiques d'intégrité des données te font oublier la plupart des solutions à coup de dump.

Bref, à mon avis il n'est pas judicieux de chercher à compliquer une procédure de sauvegarde (c'est même dangereux en terme d'oubli / capacité de restauration), d'autant plus si c'est pour résoudre un problème supposé futur, qui te forcera de toutes façons à changer de solution avant.

Maintenant si c'est juste un exercice de style, il faudrait déjà voir si mysqldump accepte de filtrer les résultats (à ma connaissance ce n'est pas le cas). Un man mysqldump sur ton serveur t'en dira beaucoup plus.
Et si mysqldump ne propose rien du genre, tu peux faire ça toi même, ne serait-ce qu'en utilisant la syntaxe SELECT ... INTO DUMPFILE ....
 
WRInaute accro
Tu dis que tes sauvegardes quotidiennes ne débuteront qu'à partir d'un certain id

Donc au bout de 6 jours tu devras restaurer la sauvegarde hebdo que tu merges avec les 5 ou 6 sauvegardes quotidiennes. Et dans l'histoire tu perd toutes les mises à jour effectuées sur des id qui n'ont pas été créés dans la semaine.

Pourquoi n'utilises-tu pas une date de mise à jour dans ta base ?
Tu fais tes sauvegardes hebdo et ensuite, chaque jour, tu sauvegarde tout ce qui a été modifié depuis la derniere sauvegarde complete.
En cas de crash et de restauration au bout du 6° jour, tu auras en fait qu'à restaurer la sauvegarde hebdo puis d'appliquer les mises à jour (création ou modification) de la dernière sauvegarde journalière et uniquement de la dernière. Tu peux même te passer d'avoir 6 sauvegardes, il suffit d'alterner sur deux versions : la dernière et l'avant dernière (au cas où la dernière serait endommagée).
 
Nouveau WRInaute
Bonjour,

je reviens à vous avec une solution simple, bien qu'elle ne prend pas en compte les modifications effectuées sur la sauvegarde hebdomadaire. Il faudrait que je me penche sur les log binaires pour cela

Je rappelle mon idée: faire 1 sauvegarde hebdomadaire puis 1 save quotidienne de chaque nouvel enregistrement

Je comptais pour cela créer des tables différentes à partir des différents fichiers dump et faire un merge du tout pour obtenir ma table principale. C'est un peu compliqué je dois vous l'avouer.

En fait il existe avec mysqldump une option permettant de ne pas recréer systématiquement une table, ainsi si on fait un dump avec cette option, quand on importe le fichier.sql à la suite du précédent on obtient tout simplement notre table principale sans rien faire d'autre

Pour résumer:

1) je fais un save hebdo de toute la table:

Code:
mysqldump -u root -ppassword ma_base --tables ma_table  > $chemin_backup    
 // pour table principale (save hebdo)

2) puis des saves quotidiennes en précisant l'option --no-create-info, ainsi que l'id où la date du dernier précédant save

Code:
mysqldump -u root -ppassword ma_base --tables ma_table -w'id>5000' --no-create-info > $chemin_backup2
mysqldump -u root -ppassword ma_base --tables ma_table -w'id>9000' --no-create-info > $chemin_backup3
...

3) on importe juste les fichiers dans l'ordre et tout s'emboîte, pas besoin de merger les tables ou autres

Code:
mysql -h host -u user -ppass base_de_donnees --tables ma_table < fichier_dump1
// la save hebdo en premier !! Le reste dans l'ordre chronologique

mysql -h host -u user -ppass base_de_donnees --tables ma_table < fichier_dump2
mysql -h host -u user -ppass base_de_donnees --tables ma_table < fichier_dump3
...

En attendant de me renseigner sur les fichier log binaires pour n'enregistrer que les modifications éventuelles, cela me convient

En attendant vos avis,
merci d'avance
 
Nouveau WRInaute
J'ai je pense mieux que votre script, créez un bash nommé backup-bdd dans /usr/bin/ et placez-y:
Code:
#!/bin/bash

rm -R /home/backup-bdd/*
echo "# Dossier /home/backup-bdd/ néttoyé"
DATE=`date +%y_%m_%d`
LISTEBDD=$( echo 'show databases' | mysql -uUTILISATEUR -pMOTDEPASSE )
for SQL in $LISTEBDD
do
if [ $SQL != "information_schema" ] && [ $SQL != "mysql" ] && [ $SQL != "Databa$
mysqldump -uroot -pMOTDEPASSE $SQL | gzip > /home/backup-bdd/$SQL"_mysql_"$DATE.sq$
fi
done
echo "# Sauvegarde des bdd faite"
Replacez UTILISATEUR et MOTDEPASSE par vos identifiants sql. Et créer un dossier dans /home/ nommé backup

Ensuite créer une tache cron
Code:
contrab -e
et rajouter:
Code:
00 00 * * * /usr/bin/backup-bdd

Vous aurez maintenant vos backups dans le dossier /home/backup/ compressée et la sauvegarde sera journalière a 00:00.
En espérant que cela ai pu vous aider ^^
 
Discussions similaires
Haut