19 novembre 2010
Script de sauvegarde des bases MySQL locales par mysqldump
Testé sur Debian 5.0
Un script bash basique pour faire un dump individuel de chaque base du serveur local avec mysqldump, y compris information_schema. En fin de script, un dump global est réalisé, et un rapport est envoyé. Associé à une tache cron et à un backup distant avec rsnapshot ça permet de faire des sauvegardes historisées des bases MySQL d’un serveur.
#!/bin/bash # Backup des bases MySQL du Serveur local # Initialisations # L'utilisateur doit avoir les privilèges globaux SELECT, SHOW_DATABASES et LOCK_TABLES MYSQL_USER="myuser" MYSQL_PASSWD="mypassword" TMP_LOG="/tmp/bmydb.log" LOG_FILE="/var/log/bmydb.log" BACKUP_DIR="/var/backups" # Destinataire du rapport ADMIN="root" echo "+++$(date) Debut $0" > $TMP_LOG # Fonction sortie du script sortie() { # Enregistre la fin de traitement dans la log echo "+++$(date) Fin $0" >> $TMP_LOG cat $TMP_LOG >> $LOG_FILE if [ $1 = 0 ]; then mail -s "Rapport $0" $ADMIN < $TMP_LOG else mail -s "Erreur execution $0" $ADMIN < $TMP_LOG fi rm -f $TMP_LOG exit $1 } # Récupération de la liste des bases dbl=$(mysql --user $MYSQL_USER --password=$MYSQL_PASSWD --batch --silent --execute="SHOW DATABASES;") 2>> $TMP_LOG if [ $? -ne 0 ]; then echo "$(date) Erreur lors de la récupération de la liste des bases" >> $TMP_LOG sortie 1 fi # Dump individuel des bases for db in $dbl do mysqldump --user $MYSQL_USER --password=$MYSQL_PASSWD --result-file=$BACKUP_DIR/mysql_$db $db 2>> $TMP_LOG if [ $? -gt 0 ]; then # On réessaye avec l'option --skip-lock-tables mysqldump --user $MYSQL_USER --password=$MYSQL_PASSWD --skip-lock-tables --result-file=$BACKUP_DIR/mysql_$db $db 2>> $TMP_LOG if [ $? -gt 0 ]; then echo "$(date) Erreur Dump base $db" >> $TMP_LOG else gzip -f $BACKUP_DIR/mysql_$db echo "$(date) Base $db sauvegardée dans $BACKUP_DIR/mysql_$db.gz avec l'option --skip-lock-tables" >> $TMP_LOG fi else gzip -f $BACKUP_DIR/mysql_$db echo "$(date) Base $db sauvegardée dans $BACKUP_DIR/mysql_$db.gz" >> $TMP_LOG fi done # Dump Global mysqldump --user $MYSQL_USER --password=$MYSQL_PASSWD --result-file=$BACKUP_DIR/mysql_full --all-databases if [ $? -gt 0 ]; then echo "$(date) Erreur Dump Global" >> $TMP_LOG else gzip -f $BACKUP_DIR/mysql_full echo "$(date) Dump global effectué dans $BACKUP_DIR/mysql_full.gz" >> $TMP_LOG fi sortie 0 |