Mysql dump multi instance en bash

De BlaxWiki
Aller à la navigationAller à la recherche

Ce script de dump (agarik) est avancé, avec une rétention et purge des dumps. Il permet via des variables de backuper par tables ou bases, tout en verifiant que les options de dumps sont présents dans la version de mysql. La fonction "send" est propre à la supervision sur cette plateforme et doit être supprimée (ou à adapter pour remonter une info). Il permet de backuper 2 instances mysql qui tournent sur des ports différents, mais il peut facilement etre adapté pour X instances. L'ideal serait de rajouter 2 autres variables pour le port et la socket

#!/bin/bash
# Declaration des variables :
DATE=`date +%Y-%m-%d`
VISION="/opt/agarik/Vision/bin/bb_send_raw"
DISPLAY="supervision.agarik.com"
TARGET="$(hostname | sed -e 's/\./,/g')"
SERVICE="backup"
DBUSER="root"
DBPASS_DEMO="RvTB0LFk"
DBPASS_PREPROD="nBiJvcEk"
DESTDIR_DEMO="/var/db_backup-demo/CURRENT"
OLDESTDIR_DEMO="/var/db_backup-demo/OLD"
DESTDIR_PREPROD="/var/db_backup-preprod/CURRENT"
OLDESTDIRP_REPROD="/var/db_backup-preprod/OLD"
LOGDIR="/var/log/"
BIN_MYSQLDUMP="/opt/applis/mysql/bin/mysqldump"
BIN_MYSQL="/opt/applis/mysql/bin/mysql"
BIN_TMPWATCH="/usr/sbin/tmpwatch"
BIN_MKDIR="/bin/mkdir"
BIN_MV="/bin/mv"
LIFE_MESSAGE="1560"
RETENTION_TIME="192" # en heures
TYPE_BACKUP="bases" # choix possible par "bases"  ou par "tables"
BASE_LIST=""
TABLE_LIST=""
DUMP_ALLOPT="routines events"
DUMP_OPT=""

# Supervision
Send()
{
        "${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
}

# Execution du dump :
exec 1> $LOGDIR/sqldump.ok
exec 2> $LOGDIR/sqldump.error

for binary in $BIN_MYSQLDUMP $BIN_MYSQL $BIN_TMPWATCH $BIN_MKDIR $BIN_MV
do
        if [ ! -f $binary -a ! -x $binary ]; then
                echo "Attention probleme lors des dumps de cette nuit ! $binary n'existe pas" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1

        fi
done


if [ ! -d $DESTDIR_DEMO ]; then
        $BIN_MKDIR -p $DESTDIR_DEMO;
        if [ $? != 0 ]; then
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR_DEMO des dumps impossible à créer" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        fi
fi
if [ ! -d $OLDESTDIR_DEMO ]; then
        $BIN_MKDIR -p $OLDESTDIR_DEMO;
        if [ $? != 0 ]; then
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $OLDESTDIR_DEMO des dumps impossible à créer" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        fi
fi


if [ ! -d $DESTDIR_PREPROD ]; then
        $BIN_MKDIR -p $DESTDIR_PREPROD;
        if [ $? != 0 ]; then
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR_PREPROD des dumps impossible à créer" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        fi
fi
if [ ! -d $OLDESTDIR_PREPROD ]; then
        $BIN_MKDIR -p $OLDESTDIR_PREPROD;
        if [ $? != 0 ]; then
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $OLDESTDIR_PREPROD des dumps impossible à créer" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        fi
fi

# Cela sert à verifier si les options de dumps que l'on a définit plus faut existe bien dans la version de mysql présente
for option in $DUMP_ALLOPT
do
        if [ `$BIN_MYSQLDUMP --help |grep -c -- --$option` -gt 0 ];
        then
                DUMP_OPT="$DUMP_OPT --$option"
        fi
done

#  Purge des anciens dumps :
# Il faut bien mettre l'option --mtime sinon c'est l'access time qui est pris en compte par défaut et ce n'est pas bon
$BIN_TMPWATCH --mtime $RETENTION_TIME $OLDESTDIR_DEMO
$BIN_TMPWATCH --mtime $RETENTION_TIME $OLDESTDIR_PREPROD

# Deplacement du dump de la veille dans OLD :
$BIN_MV $DESTDIR_DEMO/* $OLDESTDIR_DEMO/
$BIN_MV $DESTDIR_PREPROD/* $OLDESTDIR_PREPROD/


BASE_LISTPREPROD="`$BIN_MYSQL --port 3307 --socket=/tmp/mysql-preprod.sock -p$DBPASS_PREPROD -BN  -e \"show databases\"`"
if [ "$BASE_LISTPREPROD" = "" -o  $? != 0 ]; then
        echo "Attention probleme lors des dumps de cette nuit ! Aucune base presente ou erreur dans la command de dump de l instance PREPROD" > $LOGDIR/sqldump.error
        color="red"
        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        exit 1
fi

BASE_LISTDEMO="`$BIN_MYSQL --port 3308 --socket=/tmp/mysql-demo.sock -p$DBPASS_DEMO -BN  -e \"show databases\"`"
if [ "$BASE_LISTDEMO" = "" -o  $? != 0 ]; then
        echo "Attention probleme lors des dumps de cette nuit ! Aucune base presente ou erreur dans la command de dump de l instance DEMO" > $LOGDIR/sqldump.error
        color="red"
        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        exit 1
fi

case $TYPE_BACKUP in
     tables)
        # Ce test sert à supprimer l'option --events du dump pour la base performance_schema car cette option ne marche pas sur cette base
        for dbname in $BASE_LISTPREPROD ; do
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi


                TABLE_LISTPREPROD="`$BIN_MYSQL  --port 3307 --socket=/tmp/mysql-preprod.sock -p$DBPASS_PREPROD -BN  -e \"show tables\" $dbname`"
                                if [ $? != 0 ]; then
                                        echo "Attention probleme lors des dumps de cette nuit ! Erreur dans la commande de dump de l instance PREPROD" > $LOGDIR/sqldump.error
                                        color="red"
                                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                        exit 1
                                fi

         for tablename in $TABLE_LISTPREPROD; do
                                echo $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-preprod.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname $tablename
                                $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-preprod.sock $DumpOpt --skip-lock-tables --user=$DBUSER --password=$DBPASS_PREPROD $dbname $tablename 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR_PREPROD/$dbname.$tablename.$DATE.sql.gz
                                #### !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                                if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                        echo "Attention probleme lors des dumps de cette nuit de l instance PREPROD!"
                                        color="red"
                                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                        exit 1
                                fi
                        done
                done
        
        # Ce test sert à supprimer l'option --events du dump pour la base performance_schema car cette option ne marche pas sur cette base
        for dbname in $BASE_LISTDEMO ; do
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi


                TABLE_LISTDEMO="`$BIN_MYSQL  --port 3308 --socket=/tmp/mysql-demo.sock -p$DBPASS_DEMO -BN  -e \"show tables\" $dbname`"
                                if [ $? != 0 ]; then
                                        echo "Attention probleme lors des dumps de cette nuit ! Erreur dans la commande de dump de l instance DEMO" > $LOGDIR/sqldump.error
                                        color="red"
                                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                        exit 1
                                fi

       for tablename in $TABLE_LISTDEMO; do
                                echo $BIN_MYSQLDUMP --port 3308 --socket=/tmp/mysql-demo.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname $tablename
                                $BIN_MYSQLDUMP --port 3308 --socket=/tmp/mysql-demo.sock $DumpOpt --skip-lock-tables --user=$DBUSER --password=$DBPASS_DEMO $dbname $tablename 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR_DEMO/$dbname.$tablename.$DATE.sql.gz
                                #### !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                                if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                        echo "Attention probleme lors des dumps de cette nuit de l instance DEMO!"
                                        color="red"
                                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                        exit 1
                                fi
                        done
                done
        ;;


     bases)
        # Ce test sert à supprimer l'option --events du dump pour la base performance_schema car cette option ne marche pas sur cette base       
        for dbname in $BASE_LISTPREPROD; do
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi

                echo $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-preprod.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-preprod.sock $DumpOpt --skip-lock-tables --user=$DBUSER --password=$DBPASS_PREPROD $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR_PREPROD/$dbname.$DATE.sql.gz
                        ## !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                        if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                echo "Attention probleme lors des dumps de cette nuit de l instance PREPROD!"
                                color="red"
                                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                exit 1
                        fi
                done

        # Ce test sert à supprimer l'option --events du dump pour la base performance_schema car cette option ne marche pas sur cette base     
        for dbname in $BASE_LISTDEMO; do
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi

                echo $BIN_MYSQLDUMP --port 3308 --socket=/tmp/mysql-demo.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP --port 3308 --socket=/tmp/mysql-demo.sock $DumpOpt --skip-lock-tables --user=$DBUSER --password=$DBPASS_DEMO $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR_DEMO/$dbname.$DATE.sql.gz
                        ## !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                        if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                echo "Attention probleme lors des dumps de cette nuit de l instance DEMO!"
                                color="red"
                                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                exit 1
                        fi
                done
        ;;


        *)
                echo "Attention probleme lors des dumps de cette nuit. Type de backup non reconnu, merci de modifier la variable TYPE_BACKUP" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        ;;
esac

if [ `find $DESTDIR_DEMO  -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR_DEMO | awk {'print $1'}`" -gt 4 ]; then
        echo "dumps des bases OK"
else
        echo "Attention probleme lors des dumps de cette nuit. Il n'y aucune base backupée ou leur taille est de zero pour l instance DEMO" >> $LOGDIR/sqldump.error
        color="red"
        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        exit 1
fi


if [ `find $DESTDIR_PROD  -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR_PROD | awk {'print $1'}`" -gt 4 ]; then
        echo "dumps des bases OK"
else
        echo "Attention probleme lors des dumps de cette nuit. Il n'y aucune base backupée ou leur taille est de zero pour l instance PROD" >> $LOGDIR/sqldump.error
        color="red"
        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        exit 1
fi

echo "dumps des bases OK"
echo "`ls -lh $DESTDIR_DEMO $DESTDIR_PREPROD $DESTDIR_PROD`"
color="green"
Send "${color}" "$(cat $LOGDIR/sqldump.ok)"
exit 0