Sauvegarder son serveur MySql base par base
Par PlaceOweb le jeudi, juin 26 2008, 00:39 - SQL - Lien permanent
Lorsque vos données grandissent trop vite et que votre mysqldump --all-databases génère des fichiers trop volumineux, il est temps de passer à une sauvegarde bases par bases de données. Le fait d'avoir un fichier par base réduit la taille de chacun de ces fichiers et vous permet de restaurer uniquement que les bases de données MySql dont vous avez besoin.
Initialement, j'utilisais :
mysqldump --host="$MYSQL_HOST" --user="$MYSQL_LOG" --password="$MYSQL_PASS" --quote-names --complete-insert --extended-insert --add-drop-table --compress --all-databases > monFichierDumpContenantTouteLesBases.sql
Mais mon fichier intégral de 3Go est impossible à gérer pour ré-intégrer une seule base.
Voici donc un script pour dumper base par base : dumpMysqlBaseParBase.sh :
#!/bin/bash export BACKUPDIR=~/BackMySqlParBases/ export BTMPFILE=~/BackMySqlParBases.tmp export DATE=`/bin/date '+%Y%m%d'` export MYSQL_HOST="localhost" export MYSQL_USER="monUserMysql" export MYSQL_PASS="monPassMysql" [ -d $BACKUPDIR ] || mkdir -p $BACKUPDIR mysql -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} > ${BTMPFILE} <<FinDeSession SHOW DATABASES; FinDeSession if [ -f ${BTMPFILE} ] ; then for db in `cat ${BTMPFILE} | egrep -v "Database|information_schema"` do echo $db export FILEBK=$db.$DATE.sql mysqldump -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} $db > $BACKUPDIR/$FILEBK #[ -f $BACKUPDIR/$FILEBK ] && gzip --force --best $BACKUPDIR/$FILEBK #[ -f $BACKUPDIR/$FILEBK.gz ] && scp $BACKUPDIR/$FILEBK.gz $HOST:$BACKUPDIR/ done fi
Et pour finir, l'automatisation par cron :
# Dump BASE PAR BASE
# Suppression des vieux fichiers
30 02 * * * find ~/BackMySqlParBases -mtime +3 -type f -exec rm -fv {} \;
# Dump
45 02 * * * ./dumpMysqlBaseParBase.sh
Également afin d'exporter ses dumps vers un autre serveur de sauvegarde on peut reprendre le script afin qu'il envoi les fichiers automatiquement par FTP : backupMysqlDumpBaseParBase.sh :
#!/bin/sh ### Début de la configuration # Nom du dossier (dans le home) qui contiendra les dumps export BACKUP_FOLDERNAME=BackUp export BACKUP_DIR=~/${BACKUP_FOLDERNAME}/ export BACKUP_TMPFILE=~/${BACKUP_FOLDERNAME}.tmp export DATE=`date +"%Y-%m-%d"` # Dump MySql # Serveur MySql : export MYSQL_HOST="localhost" # Identifiant : export MYSQL_USER="monUtilisateurMysql" # Mot de passe : export MYSQL_PASS="monPassMysql" # Dépôt automatique par FTP # Serveur FTP : FTP_HOST="monAdresseDuServeurFtp" # Identifiant : FTP_USER="monUtilisateurFtp" # Mot de passe : FTP_PASS="monMotDePasseFtp" ### Fin de la configuration # Ce script doit être a la racine des fichiers a archiver cd ~ # Suppression de l'ancien backup rm -fr ${BACKUP_FOLDERNAME} # (Re) Création du dossier de backup [ -d ${BACKUP_DIR} ] || mkdir -p ${BACKUP_DIR} ## Sauvegarde locale #for fichier in `ls` #do # if [ -d "$fichier" ] # then # echo "$fichier (répertoire)" # else # echo "$fichier" # fi # tar --exclude ${BACKUP_FOLDERNAME} -czvf ${BACKUP_DIR}$DATE.$fichier.tar.gz $fichier 1>${BACKUP_DIR}$DATE.$fichier.txt #done # Sauvegarde des bases MySql mysql --host="${MYSQL_HOST}" --user="${MYSQL_USER}" --password="${MYSQL_PASS}" > ${BACKUP_TMPFILE} <<FinDeSession SHOW DATABASES; FinDeSession if [ -f ${BACKUP_TMPFILE} ] ; then for db in `cat ${BACKUP_TMPFILE} | egrep -v "Database|information_schema"` do echo "Dump BASE : "$db export FILEBK=$DATE.${MYSQL_HOST}.$db.sql mysqldump -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} $db > ${BACKUP_DIR}/$FILEBK [ -f ${BACKUP_DIR}/$FILEBK ] && gzip --force --best ${BACKUP_DIR}/$FILEBK #[ -f ${BACKUP_DIR}/$FILEBK.gz ] && scp ${BACKUP_DIR}/$FILEBK.gz $HOST:${BACKUP_DIR}/ done fi # Envoi via ftp # lftp -e "cd $REMOTE ; put $FILE ; quit" "$SERVER" for fichier in `ls ${BACKUP_DIR}` do # ### Envoi FTP ### echo -n "Envoi FTP du fichier : $fichier ..." ftp -n ${FTP_HOST} <<FinDeSession user "${FTP_USER}" "${FTP_PASS}" binary prompt cd / lcd ${BACKUP_DIR} put $fichier bye FinDeSession echo " ... FIN de transmission" done echo "Fin de dump Mysql et d'envoi via Ftp"
N'oubliez pas de purger régulièrement votre serveur de sauvegarde de ces vieux fichiers soit manuellement en ligne de commande FTP mdelete ou via un script que vous créerez. Pour ne plus répondre au messages de confirmation, utilisez "prompt"