#
#Fichier de configuration (backup-mysql.conf)
#
###########################################################
# Fichier de configuration pour le script backup-mysql.sh #
###########################################################
#Serveur à backuper
SERVER='localhost'
#Utilisateur MySQL
DBUSER='login'
#Mot de passe MySQL
DBPASS='mdp'
#On specifie les bases a backuper ("all" pour tout backuper)
DB='all'
#Date format
DATE_FORMAT='+%d-%m-%Y'
#Repertoire de backup
BACKUP_DIR='/var/backup/mysql/'
#Repertoire du jour
TODAY_DIR=$(date $DATE_FORMAT)
#Nomre de backups a conserver (en jours)
HISTORY='7'
#Type de compression (bzip2/gzip)
COMP_TYPE='bzip2'
#Creer un repertoire pour chaque base de donnees (yes/no)
SEP_DB='yes'
#Separer les tables en differents fichiers (yes/no)
SEP_TABLE='yes'
#Options pour le dump
#Utiliser 'man mysqldump' ou aller sur la configuration pour plus de details
OPTS='--default-character-set=latin1 --skip-extended-insert'
#Fichier de logs
LOG_FILE='/tmp/backup.log'
#Adresse mail pour les logs d'execution du script
MAIL_ADDR='admin@domain.tld'
#
#Script de backup MySQL
#
#!/bin/bash
CONF_PATH='/etc'
CONF_FILE='backup-mysql.conf'
if [ ! -d "$CONF_PATH" ] || [ ! -f "$CONF_PATH/$CONF_FILE" ]; then
echo "File : $CONF_PATH/$CONF_FILE missing !"
exit 1;
else
. "$CONF_PATH/$CONF_FILE"
fi
send-mail () {
cat "$LOG_FILE" | mail -s "Rapport d'execution du script $(basename $0) sur $HOSTNAME" $MAIL_ADDR
rm "$LOG_FILE"
}
check_dirs () {
#On verifie si le repertoire de backup existe
if [ ! -d "$BACKUP_DIR" ]; then
echo "$BACKUP_DIR n'existe pas." >> "$LOG_FILE"
send-mail
exit 1;
fi
#On verifie si le repertoire du jour existe
if [ ! -d "$BACKUP_DIR/$TODAY_DIR" ]; then
mkdir "$BACKUP_DIR/$TODAY_DIR"
fi
#On supprime le backup le plus ancien
TO_DELETE=$(date --date "$HISTORY days ago" $DATE_FORMAT)
if [ -d "$BACKUP_DIR/$TO_DELETE" ]; then
rm -r "$BACKUP_DIR/$TO_DELETE"
fi
}
backup () {
if [ -z "$1" ]; then
echo 'Liste des bases non transmise' >> $LOG_FILE
send-mail
exit 1;
else
if [ "$SEP_DB" == 'yes' ]; then
for DB_TO_BACKUP in $1; do
#On cree le repertoire pour separer les bases
mkdir "$BACKUP_DIR/$TODAY_DIR/$DB_TO_BACKUP"
if [ "$SEP_TABLE" == 'yes' ]; then
for TABLE_TO_BACKUP in $(mysql -h$SERVER -u$DBUSER -p$DBPASS --skip-column-names $DB_TO_BACKUP -e "show tables"); do
mysqldump -h"$SERVER" -u"$DBUSER" -p"$DBPASS" $OPTS "$DB_TO_BACKUP" "$TABLE_TO_BACKUP" | "$COMP_TYPE" > "$BACKUP_DIR/$TODAY_DIR/$DB_TO_BACKUP/$DB_TO_BACKUP-$TABLE_TO_BACKUP-$TODAY_DIR.$FILE_EXT"
done
else
mysqldump -h"$SERVER" -u"$DBUSER" -p"$DBPASS" $OPTS "$DB_TO_BACKUP" "$TABLE_TO_BACKUP" | "$COMP_TYPE" > "$BACKUP_DIR/$TODAY_DIR/$DB_TO_BACKUP/$DB_TO_BACKUP-$TODAY_DIR.$FILE_EXT"
fi
done
else
if [ "$SEP_TABLE" == 'yes' ]; then
for DB_TO_BACKUP in $1; do
for TABLE_TO_BACKUP in $(mysql -h$SERVER -u$DBUSER -p$DBPASS --skip-column-names $DB_TO_BACKUP -e "show tables"); do
mysqldump -h"$SERVER" -u"$DBUSER" -p"$DBPASS" $OPTS "$DB_TO_BACKUP" "$TABLE_TO_BACKUP" | "$COMP_TYPE" > "$BACKUP_DIR/$TODAY_DIR/$DB_TO_BACKUP-$TABLE_TO_BACKUP-$TODAY_DIR.$FILE_EXT"
done
done
else
mysqldump -h"$SERVER" -u"$DBUSER" -p"$DBPASS" $OPTS --all-databases | "$COMP_TYPE" > "$BACKUP_DIR/$TODAY_DIR/$TODAY_DIR.$FILE_EXT"
fi
fi
fi
}
# On cree le fichier de log
touch "$LOG_FILE"
# on verifie que les bases a backuper sont bien renseignees
if [ -z "$DB" ]; then
echo 'variable $DB vide.' >> "$LOG_FILE"
send-mail
exit 1;
elif [ "$DB" == "all" ]; then
DB_LIST=$(mysql -h$SERVER -u$DBUSER -p$DBPASS --skip-column-names -e "show databases" | xargs)
else
DB_LIST="$DB"
fi
# On verifie que la compression est correcte
if [ "$COMP_TYPE" == 'bzip2' ]; then
FILE_EXT='sql.bz2'
elif [ "$COMP_TYPE" == 'gzip' ]; then
FILE_EXT='sql.gz'
else
echo '$COMP_TYPE non spécifié.' >> "$LOG_FILE"
send-mail
exit 1;
fi
check_dirs
backup "$DB_LIST"
#On verifie si le fichier de logs existe et qu'il est vide
if [ -f "$LOG_FILE" ] && [ "$(cat $LOG_FILE | wc -l)" -eq 0 ]; then
#Si il est vide on efface
rm "$LOG_FILE"
else
#Sinon on envoie le rapport
send-mail
fi
0 comment about "Backup MySQL"