Si vous avez plusieurs serveurs MySQL ou MariaDB, et que vous souhaitez sauvegarder toutes vos bases de données simplement et rapidement, je vous propose un script basique. Je précise que je suis sous Debian Jessie.
Prérequis :
- Le script utilise les commandes mysqldump et bzip2, assurez-vous d’avoir les paquets bzip2 et mariadb-client (ou mysql-client) installés et à jour :
apt-get update
apt-get dist-upgrade
apt-get install bzip2 mariadb-client
- Le fichier « $BACKUP_DIR/hosts » contenant la liste de vos serveurs doit exister et être lisible par le $OWNER_DIR. Celui-ci contiendra un host à sauvegarder par ligne.
- Créer un utilisateur dédié sur chacun de vos serveurs SQL qui aura les droits SELECT et LOCK sur toutes les bases :
CREATE USER 'YOUR_MYSQL_USER'@'IP_BACKUP_HOST' IDENTIFIED BY 'YOUR_MYSQL_PASSWORD';
GRANT SELECT, LOCK TABLES ON *.* TO 'YOUR_MYSQL_USER'@'IP_BACKUP_HOST';
FLUSH PRIVILEGES;
- Je vous conseille vivement de définir les droits 700 sur votre script qui comprendra votre mot de passe SQL en clair.
Le script :
#!/bin/bash
BACKUP_DIR=/YOUR/BACKUP/DIR
OWNER_DIR=YOUR_USER
KEEP_DAYS=30 # 30 jours de sauvegardes conservées
MYSQL_USER=YOUR_MYSQL_USER
MYSQL_PASSWORD=YOUR_MYSQL_PASSWORD
MYSQL_HOST=$(cat $BACKUP_DIR/hosts)
EXCLUDE_DB="information_schema|performance_schema"
# Go to backup folder
cd $BACKUP_DIR
# Redefine rights
chmod 700 $BACKUP_DIR
chown -R $OWNER_DIR:root $BACKUP_DIR
# Begin backups for all hosts
for host in $MYSQL_HOST
do
databases=`mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $host -e "SHOW DATABASES;" | grep -v "Database" | grep -Ev "($EXCLUDE_DB)"`
# Perform Backup for each database
for db in $databases
do
# Check if directory already exists. If not, create it
if [ ! -d "$BACKUP_DIR/data/$host/$db" ]; then
mkdir -p $BACKUP_DIR/data/$host/$db
fi
# Backup DB
FILENAME=$BACKUP_DIR/data/$host/$db/$db\_`date "+%Y%m%d-%H%M%S"`.sql.bz2
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD -h $host $db | bzip2 > $FILENAME
# Change rights for $db
chmod og= $FILENAME
# Delete backups older than $KEEP_DAYS days
find $BACKUP_DIR/data/$host/$db -name "*.sql.bz2" -mtime +$KEEP_DAYS -exec rm {} \;
done
done
Après avoir adapté tout ça à votre configuration, vous pouvez créer un cron pour sauvegarder vos bases de données chaque nuit. L’arborescence $BACKUP_DIR/data/$host/$db/ sera automatiquement créée :
0 3 * * * OWNER_DIR /CHEMIN/VERS/VOTRE/SCRIPT.sh