Skip to main content
sqlone

Sauvegarder vos bases de données MySQL

mysql-logo

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
Partager :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.