Sauvegarder ses bases de données MariaDB / MySQL

 

On trouve pas mal de script pour sauvegarder ses bases de données, mais rarement celui qui fait exactement ce que l'on veut !

Pour ma part j'ai besoin de plusieurs choses :

  • Une liste de bases de données à sauvegarder
  • Un historique de sauvegarde, un zip par base et par sauvegarde
  • Une synchronisation de mon dossier de sauvegarde
  • 2 fichiers sql par table, 1 pour la sctructure et 1 pour les données
  • 1 fichier pour la création des vues
  • 1 fichier pour la création des fonctions et des triggers
  • 1 fichier incluant l'ensemble pour une restauration complète

Après avoir glaner plusieurs scripts sur le net, mélangés et modifiés, je suis arrivé à un résultat qui me convient ...

Je vous livre mon script en espérant qu'il puisse aider d'autres personnes, qui l'adapteront à leur besoin :

#!/bin/bash
# example de crontab
##mm     hh      DD  MM   W    /path/progam [--option]...  ( W = weekday: 0-6 [Sun=0] )
# 0   10,13,16   *   *   1-5   /home/Sauvegarde/script/save_db.sh

# configuration de l'accès à la base de données
# Liste des bases à sauvegarder
DBNAMES="mabase mabase2 mabase3"
HOST="--host=localhost"
USER="--user=root"
# si vous n'avez pas de mot de passe commenter la ligne suivante et décommenter la suivante
PASSWORD="--password=monmotdepasse"
#PASSWORD=""
PORT="--port=3306"
# vous pouvez changer ces valeurs elles sont optionnelles ...
OPTIONS="--default-character-set=latin1 --set-charset"

# Chemin pour la sauvegarde + chemin à synchroniser avec la sauvegarde
BACKUP_DIR="/home/Sauvegarde/db"
RSYNC_DIR="/save/base"

# Nombre de backup a conserver
NB_ZIP=10

# Nom du fichier pour la restauration
RESTORESCRIPT="$BACKUP_DIR/__restoreData.sql"

# on recupère la date et l'heure pour le nom de la sauvegarde
DATE=`/bin/date '+%y-%m-%d_%Hh%M'`

#### début du script ####
echo 'Suppression des fichiers temporaires (*.sql) ...'
rm -f ${BACKUP_DIR}/*.sql > /dev/null 2>&1

cd ${BACKUP_DIR}

for DB in $DBNAMES
do
    echo "=========================================="
    echo "                 " ${DB}
    echo "=========================================="
    echo 'USE $DB;' > $RESTORESCRIPT
    echo 'SET FOREIGN_KEY_CHECKS=0;' > $RESTORESCRIPT

# Création d'un fichier contenant la structure + un fichier de données pour chaque tables
    for TABLE in `mysql $PORT $HOST $USER $PASSWORD $DB -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$DB' AND TABLE_TYPE NOT LIKE '%VIEW%'" | egrep -v 'TABLE_NAME' `; do
        TABLENAME=$(echo $TABLE|awk '{ printf "%s", $0 }')
        FILENAMESTRUCT="${TABLENAME}_structure.sql"
        FILENAMEDATA="${TABLENAME}_data.sql"
        echo Dumping $TABLENAME
        echo "SELECT '     $TABLENAME' AS 'TABLE';" >> $RESTORESCRIPT
        echo 'source' $FILENAMESTRUCT';' >> $RESTORESCRIPT
        echo 'source' $FILENAMEDATA';' >> $RESTORESCRIPT
        echo Create file $FILENAMESTRUCT
        mysqldump --no-data $OPTIONS $PORT $HOST $USER $PASSWORD $DB $TABLENAME > ${BACKUP_DIR}/${FILENAMESTRUCT}
        echo Create file $FILENAMEDATA
        mysqldump --no-create-info $OPTIONS $PORT $HOST $USER $PASSWORD $DB $TABLENAME > ${BACKUP_DIR}/${FILENAMEDATA}
    done

# Création d'un fichier pour la création de chaque vue
    VIEWLIST=`mysql $HOST $USER $PASSWORD $DB -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ' ') AS VIEW_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$DB' AND TABLE_TYPE LIKE '%VIEW%'" | egrep -v 'VIEW_NAME' `;
    FILENAMEVIEW="_${DB}_view.sql"
    echo Dumping $VIEWLIST
    echo "SELECT '     $VIEWLIST' AS 'VIEW';" >> $RESTORESCRIPT
    echo 'source' $FILENAMEVIEW';' >> $RESTORESCRIPT
    echo Create file $FILENAMEVIEW
    mysqldump --no-data $OPTIONS $PORT $HOST $USER $PASSWORD $DB $VIEWLIST > ${BACKUP_DIR}/${FILENAMEVIEW}

# Création du fichier des triggers et des routines
    FILENAMETRIGGER="_${DB}_trigger_function.sql"
    echo Dumping Trigger and Function
    echo "SELECT '     TRIGGER and FUNCTION' AS 'TRIGGER';" >> $RESTORESCRIPT
    echo 'source' $FILENAMETRIGGER';' >> $RESTORESCRIPT
    echo Create file $FILENAMETRIGGER
    mysqldump --triggers --routines --no-create-info --no-data --no-create-db --skip-opt $OPTIONS $PORT $HOST $USER $PASSWORD $DB > ${BACKUP_DIR}/${FILENAMETRIGGER}

    echo 'SET FOREIGN_KEY_CHECKS=1;' >> $RESTORESCRIPT

#    echo making tar...
#    tar -cf ${DB}_${DATE}.tar *.sql  > /dev/null 2>&1

    echo Compressing to ${DB}_${DATE}.zip
#    gzip -9 ${DB}_${DATE}.tar > /dev/null 2>&1
    rm -f ${BACKUP_DIR}/${DB}_${DATE}.zip > /dev/null 2>&1
    zip -X ${DB}_${DATE}.zip *.sql > /dev/null 2>&1

    echo removing temporary files...
    rm -f ${BACKUP_DIR}/*.sql > /dev/null 2>&1
#    rm -f ${BACKUP_DIR}/*.tar > /dev/null 2>&1
    echo "   done with     " $DB
    echo
    echo Removing old zip
#    find ${BACKUP_DIR}/${DB}_*.zip -mtime +7 -exec rm {} \\;
    ls -1tr ${BACKUP_DIR}/${DB}_*.zip | head -n -${NB_ZIP} | xargs -d '\\n' rm -f
done
echo "=========================================="
echo "            done with all database!       "
echo "=========================================="
echo ""
echo "=========================================="
echo "=              Sync Data                 ="
echo "=========================================="

rsync -a --delete ${BACKUP_DIR}/ ${RSYNC_DIR} &> /dev/null

 

Pour la restauration complète on dézippe une sauvegarde, on se place dans le dossier décompressé et on donne à MySQL le fichier contenant l'appel à l'ensemble des fichiers sql

mysql -h locahost -ss -u MONUSER -pMONPASSWORD < __restoreData.sql

 

Si vous souhaitez juste une partie, vous pouvez modifier le fichier __restoreData.sql , ou donner à MySQL uniquement la partie voulue.
Exemple pour restaurer uniquement les données de la table toto

mysql -h locahost -ss -u MONUSER -pMONPASSWORD MABASE < toto_data.sql
Vus : 2143
Publié par Zeph : 15