Script de sauvegarde MySQL et copie SSH

© Christian PAULUS. Document créé le 13 janvier 2011 , mis à jour le 8 juin 2011.

L'Homme est une prison où l'Âme reste libre. Victor Hugo

Accueil du site > Astuces > Unix > Script de sauvegarde MySQL et copie SSH

MySQL / FreeBSD 8

Objectif : effectuer une copie de sauvegarde de bases de données MySQL sur un serveur distant, via ssh.

mysqldump est le mieux adapté pour effectuer la copie d’une base sans être obligé d’arrêter le serveur MySQL.

Il suffit ensuite de compresser le fichier obtenu, puis de la recopier sur un serveur distant via ssh.

C’est ce que propose ce script shell, qu’il vous faut adapter à votre machine.

En cas d’erreur de manipulation, ou erreur dans ce document, vous risquez de perdre vos données, voire de rendre votre configuration inutilisable. Soyez vigilant. Vous êtes seul responsable de votre système.

Contrainte : créer une clé publique afin d’éviter de devoir entrer le mot de passe à la connexion, et permettre l’emploi de ce script via le cron. Lire si besoin le billet Se connecter par SSH sans taper de mot de passe.

#!/bin/sh

# mysql_backup.sh
# Script pour backup MySQL sur serveur distant via ssh

# (c) 2011: cpaulus at quesaco.org
# Adapte pour MySQL/FreeBSD 8
# Licence MIT + GNU GPL, etc.
# http://www.quesaco.org/Script-de-sauvegarde-MySQL-et-copie-SSH
# @version: Wed Jun  8 11:08:20 CEST 2011

# @todo: creer le repertoire de destination sur le serveur ssh

# Identifiant pour acces a la base MySQL
MyUSER="root"
MyPASS="monmotdepasseultrasecret"
MyHOST="localhost"

# Nom de la machine distante (serveur ssh de backup)
# du style "login@server.exemple.com"
BACKUP_MACHINE="login@server.exemple.com"

# Repertoire distant de destination (serveur ssh)
# Attention a creer ce repertoire distant avec les bons droits
BACKUP_FOLDER="backups_db/"

# Executables...
# Corriger les chemins si necessaire
MYSQL="/usr/local/bin/mysql"
MYSQLDUMP="/usr/local/bin/mysqldump"
GZIP="/usr/bin/gzip"
SCP="/usr/bin/scp"
TAIL="/usr/bin/tail"
AWK="/usr/bin/awk"
DF="/bin/df"

# Le dossier temporaire global
TMP_DEST="/var/tmp/"

# Le vrai dossier temp pour ce script
MyFOLDER="${TMP_DEST}mysql_backups"

if [ "$MyFOLDER" = "" ]
then
        echo "Erreur de configuration"
        echo "Nom du dossier de destination manquant"
        exit
fi

# si manquant, le creer
if [ ! -d $MyFOLDER ]; then mkdir -p $MyFOLDER ; fi

# la date au format court
# pour completer le nom du fichier
TODAY=`date "+%Y%m%d"`

# Demander la liste des bases de donnees
ALL_DATABASES=`$MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases'`

# Aller dans le repertoire de travail
cd $MyFOLDER

# Traiter les bases une a une
for db in $ALL_DATABASES
do
       # Ne pas sauvegarder cette base (mysqldump: Got error: 1044)
       if [ "$db" = "information_schema" ]; then continue; fi

        # Taille de la base en Ko
        MySIZE=`$MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "
        SELECT round(sum( (data_length + index_length) / 1024 ))
        FROM information_schema.tables
        WHERE table_schema = '$db'"`

        echo "$db : $MySIZE Ko"

        # Si la base est vide, ne pas sauvegarder
        if [ "$MySIZE" = "NULL" ]; then continue; fi
        if [ $MySIZE -le 0 ]; then continue; fi

        # Place disponible
        MyFREE=`$DF . | $TAIL -n 1 | $AWK '{print $4}'`
        echo "Place disponible : $MyFREE Ko"

        if [ $MyFREE -le $MySIZE ]
        then
                echo "Erreur: place disque insuffisante pour $db (${MySIZE}/${MyFREE})"
                exit
        fi

        # Fichier de destination
        MyFILE="$MyFOLDER/$db.$TODAY.gz"

        echo "Backup $db ($MySIZE octets) > $MyFILE "

        # Le dump de la base dans son fichier
        $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP > $MyFILE

done

# OK. Les dumps sont termines.

# Aller dans le repertoire de travail
cd $MyFOLDER

# Transmettre le tout en une seule session ssh sur le serveur distant
$SCP -q *.$TODAY.gz ${BACKUP_MACHINE}:${BACKUP_FOLDER}

# Effacer les fichiers locaux de backup
# A activer si necessaire (vous savez ce que vous faites ?)
#rm *.$TODAY.gz

A lire, si besoin :

Plussoyez !

Les forums sont fermés.