La solution la plus simple est de faire des backup via PHPMyAdmin, c'est fonctionnel, relativement rapide mais ça demande d'y penser et c'est difficillement automatisable.
La solution la plus propre est d'utiliser mysqlhotcopy . Ce petit script perl est en effet bien utile. Il permet de se connecter à la base de données et de faire un backup très facilement et très rapidement. La seule condition est de l'executer sur la machine qui contient le serveur mysql. (Donc ça marchera pas pour recuperrer la base de données d'un site sur un hebergeur web en mutualisé mais dans le cas d'un serveur SOHO, ça pose pas de problèmes)
1.Utilisation simple
La syntaxe pour sauvegarder une base de donnée dbname dans /path/backup est la suivante :
mysqlhotcopy dbname -u user -p pass /path/backup
Il est possible de sauvegarder plusieurs base de données en même temps :
mysqlhotcopy db1 db2 db3 db4 -u user -p pass /path/backup
Une documentation complete de l'outil est disponible :
perldoc mysqlhotcopy
2. Scripting
Pour automatiser l'opération, il suffit de faire un peu de shell scripting et d'ajouter le script à la crontab :
#/bin/sh
mkdir -p /backup/mysql.`date +"%F"`
mysqlhotcopy db1 db2 db3 db4 -u user -p pass /backup/mysql.`date +"%F"`
Avec ce script, on sauvegarde les bases dans un nouveau dossier nommé mysql.date. Attention à l'espace disque avec ce genre de script au bout d'un mois, on aurra déjà 30 fois la place occupée par la base de données sur le disque dur. Selon les besoins, il faudrait au moins compresser en tar et bz2, et effacer regulierement des sauvegardes.
#/bin/sh
mkdir -p /backup/mysql.`date +"%F"`
mysqlhotcopy db1 db2 db3 db4 -u user -p pass /backup/mysql.`date +"%F"`
tar cjf /backup/mysql.`date +"%F"`.tbz /backup/mysql.`date +"%F"`
rm -rf /backup/mysql.`date +"%F"`
La compression en tar + bz2 devrait permettre de gagner pas mal d'espace disque.
Si on veut chaque mois ne garder que le dernier backup du mois et supprimer tout les autres, on peut utiliser le script suivant :
#!/bin/sh
mois=`date +"%m"`
let "mois -= 1"
annee=`date +"%Y"`
if [ "$mois" -eq "-1" ]
then
let "annee -= 1"
fi
if [ "$mois" -lt "10" ]
then
mois=0$mois
fi
if [ -f ./backup/mysql.$annee-$mois-28.tbz ]
then
mv ./backup/mysql.$annee-$mois-28.tbz ./backup/mysql.$annee-$mois.tbz
fi
if [ -f ./backup/mysql.$annee-$mois-29.tbz ]
then
mv ./backup/mysql.$annee-$mois-29.tbz ./backup/mysql.$annee-$mois.tbz
fi
if [ -f ./backup/mysql.$annee-$mois-30.tbz ]
then
mv ./backup/mysql.$annee-$mois-30.tbz ./backup/mysql.$annee-$mois.tbz
fi
if [ -f ./backup/mysql.$annee-$mois-31.tbz ]
then
mv ./backup/mysql.$annee-$mois-31.tbz ./backup/mysql.$annee-$mois.tbz
fi
if [ -f ./backup/mysql.$annee-$mois.tbz ]
then
find backup -name "mysql\.$annee-$mois-*.tbz" -exec rm {} \;
fi
Ce script permet de recuperrer le backup le plus recent du mois precedent (entre le 28 et le 31 du mois) et de le mettre de coté pour ensuite supprimer tout les backups du mois précédents. Si jamais, le backup n'est pas trouvé, aucun backup n'est supprimé. C'est un peu crade (j'aurais du faire une boucle for à la place des 4 if à la suite) mais ça marche. L'idée est d'executer ce script le premier de chaque mois.
3. Récuperation
Les backups sont juste l'ensemble des fichiers des bases de données tels que mysql les stocke sur le filesystem. Il suffit donc d'extraire un backup dans le repertoire contenant les bases de données mysql (/var/mysql sur la plupart des distribs linux)
4. Sécurité
Le premier script contient le nom d'utilisateur et le mot de passe d'un compte mysql en clair. Pour que ce script il faut que cet utilisateur mysql ait les droits pour faire un LOCK TABLES. Il convient donc donner les droits en lecture sur ce script uniquement à l'utilisateur qui l'executera.