MySQL : Configurer la sauvegarde automatique des bases de données

Dans cet article, nous allons voir comment programmer un dump automatique de nos bases de données Mysql 8 depuis un serveur debian 11.

En prérequis vous devez avoir un serveur Debian ou Ubuntu opérationel avec le paquet MySQL Community Server déjà installé.

1 – Création de l’utilisateur qui va gérer les sauvegardes

Par mésure de sécurité nous allons créer un utilisateur qui a les droits suffisants pour aller sauvegarder nos différentes bases, sans pour autant avoir les droits admin sur le serveur MySQL.

Nous devons nous connecter avec le compte administrateur au serveur MySQL

mysql -u root -p
mysql> create user 'sauv'@'localhost' IDENTIFIED BY 'VOTREMOTDEPASSE';
mysql> GRANT LOCK TABLES, SELECT, GRANT SHOW VIEW ON *.* TO  'sauv'@'localhost';
mysql> FLUSH PRIVILEGES;

Nous allons maintenant créer un fichier qui va contenir notre utilisateur et mot de passe qui servira au script de sauvegarde automatique

vi /etc/mysql/mysql-backup-script.cnf

Inserer et adapter les éléments suivants à votre fichier

[client]
user = 'sauv'
password = 'VOTREMOTDEPASSE'

Modifier les autorisations pour sécuriser le fichier avec la commande ci-dessous :

chmod 400 /etc/mysql/mysql-backup-script.cnf

On va maintenant tester notre fichier de mot de passe pour s’assurer que le script n’aura pas de problème d’authentification avec notre serveur MySQL.

Entrez la commande ci-dessous dans votre console, si vous arrivez à vous connecter au serveur MySQL sans avoir besoin de vous identifier, cela signifie que l’authentification fonctionne.

mysql  --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf

2 – Création du script de sauvegarde

Nous allons créer le script backup_sql.sh dans le repertoire /usr/local/bin

vi /usr/local/bin/backup_sql.sh

Inserer et adapater le script suivant en fonction de votre configuration

#!/bin/bash

# Configuration de base: datestamp e.g. YYYYMMDD

DATE=$(date +"%Y%m%d")

# Dossier où sauvegarder les backups (créez le d'abord !)

BACKUP_DIR="/backup/"

# Commandes MySQL 

MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump

# Liste des bases de données MySQL à ignorer

SKIPDATABASES="Database|information_schema|performance_schema|mysql|sys"

# Nombre de jours à garder les dossiers (seront effacés après X jours)

RETENTION=14


# Créer un nouveau répertoire dans l'emplacement du répertoire de sauvegarde pour cette date


mkdir -p $BACKUP_DIR/$DATE


# Récupérer une liste de toutes les bases de données

databases=`$MYSQL  --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf -e "SHOW DATABASES;" | grep -Ev "($SKIPDATABASES)"`

# Exporter chaque base de données dans son fichier gzip 

for db in $databases; do
echo $db
$MYSQLDUMP  --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf  --force --opt --no-tablespaces --skip-lock-tables --skip-events --databases $db | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

# Supprimer les fichiers vieux de X jours

find $BACKUP_DIR/* -mtime +$RETENTION -delete

Ajoutons les droits d’exécution à notre fichier

chmod 755 /usr/local/bin/backup_sql.sh

3 – Création du cron job

Nous allons maintenant créer un tache cron qui va executer notre script backup_sql.sh tous les jours à 1 heure du matin

crontab -e
#Si vous souhaitez recevoir un mail a une adresse mail précise après la sauvegarde garder le MAILTO sinon commentez la ligne 
MAILTO="nom@domaine-exemple.com"
0 1 * * * /usr/local/bin/backup_sql.sh >/dev/null 2>&1

Nous avons terminé de configurer notre sauvegarde automatique, il ne reste plus qu’à surveilller à la prochaine sauvegarde que tout se passe bien.