Cet article fait partie d’une série :

Introduction

Suite aux précédents articles sur les sauvegardes, cette 4ème partie traitera de la mise en place de la sauvegarde de base de données MySQL ou MariaDB.

Le principe repose sur l’exécution d’un script sur le serveur à sauvegarder pour exporter et archiver les bases de données souhaite, puis de l’ajout du chemin de stockage de ces archives dans la stratégie de sauvegarde de Restic (voir articles précédents).

L’ensemble des commandes sont à réaliser avec un utilisateur sudoer.

Script de sauvegarde

Créer le répertoire pour placer le script de sauvegarde (si celui-ci n’éxiste pas déjà) :

$ sudo -u restic mkdir /home/restic/scripts

Créer le script rsnapshot.mysql dans le répertoire nouvellement créé.

Renseigner à minima les variables suivantes :

Vérifier et ajuster les autres si nécessaire.

Par défaut, le script sauvegardera toutes les bases de données disponibles. Il est donc possible d’exclure certaines bases avec la variable exclude_dbs.

#!/bin/bash
# A UNIX / Linux shell script to backup mysql server database using rsnapshot utility.
# -------------------------------------------------------------------------
# Copyright (c) 2007 Vivek Gite <vivek@nixcraft.com>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
# Tested under RHEL / Debian / CentOS / FreeBSD oses
# Must be Installed on remote MySQL Server
# -------------------------------------------------------------------------
# Last update: Sun Jul 5 2009 : Added mysql ping support and binary checking
# -------------------------------------------------------------------------
### SETUP MYSQL LOGIN ###
MUSER=''
MPASS=''
MHOST=""
 
### Set to 1 if you need to see progress while dumping dbs ###
VERBOSE=0
 
### Set bins path ###
GZIP=/bin/gzip
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
RM=/bin/rm
MKDIR=/bin/mkdir
MYSQLADMIN=/usr/bin/mysqladmin
GREP=/bin/grep
 
### Setup dump directory ###
BAKRSNROOT=/tmp/bkp/mysql
 
### List excluded DBS ###
exclude_dbs="information_schema mysql performance_schema"

#####################################
### ----[ No Editing below ]------###
#####################################
### Default time format ###
TIME_FORMAT='%H_%M_%S%P'

### Make a backup ###
backup_mysql_rsnapshot(){
        local DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
        local db="";
        [ ! -d $BAKRSNROOT ] && ${MKDIR} -p $BAKRSNROOT
        ${RM} -f $BAKRSNROOT/* >/dev/null 2>&1
        [ $VERBOSE -eq 1 ] && echo "*** Dumping MySQL Database ***"
        [ $VERBOSE -eq 1 ] && echo -n "Database> "
        for db in $DBS
        do
                if ! [[ " $exclude_dbs " =~ " $db " ]]
                then
                        local tTime=$(date +"${TIME_FORMAT}")
                        local FILE="${BAKRSNROOT}/${db}.${tTime}.gz"
                        [ $VERBOSE -eq 1 ] && echo -n "$db.."
                        ${MYSQLDUMP} -u ${MUSER} -h ${MHOST} -p${MPASS} $db | ${GZIP} -9 > $FILE
                fi
        done
                status=$?
                [ $VERBOSE -eq 1 ] && echo ""
                [ $VERBOSE -eq 1 ] && echo "*** Backup done [ files wrote to $BAKRSNROOT] ***"
                #if [ $VERBOSE -eq 0 ] && [ $status -eq 0 ]; then exit 0; fi
                return $status
}
 
### Die on demand with message ###
die(){
        echo "$@"
        exit 999
}
 
### Make sure bins exists.. else die
verify_bins(){
        [ ! -x $GZIP ] && die "File $GZIP does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQL ] && die "File $MYSQL does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQLDUMP ] && die "File $MYSQLDUMP does not exists. Make sure correct path is set in $0."
        [ ! -x $RM ] && die "File $RM does not exists. Make sure correct path is set in $0."
        [ ! -x $MKDIR ] && die "File $MKDIR does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQLADMIN ] && die "File $MYSQLADMIN does not exists. Make sure correct path is set in $0."
        [ ! -x $GREP ] && die "File $GREP does not exists. Make sure correct path is set in $0."
}
 
### Make sure we can connect to server ... else die
verify_mysql_connection(){
        $MYSQLADMIN  -u $MUSER -h $MHOST -p$MPASS ping | $GREP 'alive'>/dev/null
        [ $? -eq 0 ] || die "Error: Cannot connect to MySQL Server. Make sure username and password are set correctly in $0"
}
 
### main ####
verify_bins
verify_mysql_connection
backup_mysql_rsnapshot

Ajuster les permissions du script pour le rendre exécutable :

$ sudo chmod 700 ~/scripts/rsnapshot.mysql 

Créer le répertoire temporaire de stockage des sauvegardes :

$ sudo mkdir -p /tmp/bkp/mysql
$ sudo chown -R restic: /tmp/bkp

Automatisation

Créer un script cron :

$ sudo vim /etc/cron.d/rsnapshot

Ajouter les lignes suivantes pour une exécution tous les jours à minuit :

# SQL BKP
00 00   * * *   restic    bash /home/restic/scripts/rsnapshot.mysql

Configuration de Restic

Ajouter le chemin (/tmp/bkp/mysql) au paramètre BACKUP_PATHS du fichier de configuration des services (voir articles précédents).

Restauration

Recréer les bases et utilisateurs si vous restaurez sur une nouvelle installation.

Puis lancer la commande suivante pour restaurer une base :

$ mysql -u <username> -p -h localhost <base name> < <file>

Sources