Différences entre les versions de « Mysql dump multi instance en bash »

De BlaxWiki
Aller à la navigationAller à la recherche
(Page créée avec « 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 opti... »)
 
Ligne 1 : Ligne 1 :
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  
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).
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
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


<pre>
<pre>
Ligne 12 : Ligne 13 :
SERVICE="backup"
SERVICE="backup"
DBUSER="root"
DBUSER="root"
DBPASS3306="Q47avklYt"
DBPASS_DEMO="RvTB0LFk"
DBPASS3307="8Osx4OBm"
DBPASS_PREPROD="nBiJvcEk"
DESTDIR3306="/var/db_backup/CURRENT"
DESTDIR_DEMO="/var/db_backup-demo/CURRENT"
OLDESTDIR3306="/var/db_backup/OLD"
OLDESTDIR_DEMO="/var/db_backup-demo/OLD"
DESTDIR3307="/var/db_backup-3307/CURRENT"
DESTDIR_PREPROD="/var/db_backup-preprod/CURRENT"
OLDESTDIR3307="/var/db_backup-3307/OLD"
OLDESTDIRP_REPROD="/var/db_backup-preprod/OLD"
LOGDIR="/var/log/"
LOGDIR="/var/log/"
BIN_MYSQLDUMP="/opt/applis/mysql/bin/mysqldump"
BIN_MYSQLDUMP="/opt/applis/mysql/bin/mysqldump"
Ligne 29 : Ligne 30 :
BASE_LIST=""
BASE_LIST=""
TABLE_LIST=""
TABLE_LIST=""
DUMP_ALLOPT="routines skip-lock-tables events"
DUMP_ALLOPT="routines events"
DUMP_OPT=""
DUMP_OPT=""
# Supervision
# Supervision
Send()
Send()
{
{
"${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
        "${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
}
}


Ligne 53 : Ligne 55 :




if [ ! -d $DESTDIR3306 ]; then $BIN_MKDIR -p $DESTDIR3306;
if [ ! -d $DESTDIR_DEMO ]; then
        $BIN_MKDIR -p $DESTDIR_DEMO;
         if [ $? != 0 ]; then
         if [ $? != 0 ]; then
                 echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR3306 des dumps impossible à créer" > $LOGDIR/sqldump.error
                 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"
                 color="red"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
Ligne 61 : Ligne 64 :
         fi
         fi
fi
fi
 
if [ ! -d $OLDESTDIR_DEMO ]; then
if [ ! -d $OLDESTDIR3306 ]; then $BIN_MKDIR -p $OLDESTDIR3306;
        $BIN_MKDIR -p $OLDESTDIR_DEMO;
         if [ $? != 0 ]; then
         if [ $? != 0 ]; then
                 echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $OLDESTDIR3306 des dumps impossible à créer" > $LOGDIR/sqldump.error
                 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"
                 color="red"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
Ligne 72 : Ligne 75 :




if [ ! -d $DESTDIR3307 ]; then $BIN_MKDIR -p $DESTDIR3307;
if [ ! -d $DESTDIR_PREPROD ]; then
        $BIN_MKDIR -p $DESTDIR_PREPROD;
         if [ $? != 0 ]; then
         if [ $? != 0 ]; then
                 echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR3307 des dumps impossible à créer" > $LOGDIR/sqldump.error
                 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"
                 color="red"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
Ligne 80 : Ligne 84 :
         fi
         fi
fi
fi
 
if [ ! -d $OLDESTDIR_PREPROD ]; then
if [ ! -d $OLDESTDIR3307 ]; then $BIN_MKDIR -p $OLDESTDIR3307;
        $BIN_MKDIR -p $OLDESTDIR_PREPROD;
         if [ $? != 0 ]; then
         if [ $? != 0 ]; then
                 echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $OLDESTDIR3307 des dumps impossible à créer" > $LOGDIR/sqldump.error
                 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"
                 color="red"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
Ligne 90 : Ligne 94 :
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
for option in $DUMP_ALLOPT
do
do
Ligne 101 : Ligne 104 :


#  Purge des anciens dumps :
#  Purge des anciens dumps :
$BIN_TMPWATCH $RETENTION_TIME $OLDESTDIR3306
$BIN_TMPWATCH $RETENTION_TIME $OLDESTDIR_DEMO
$BIN_TMPWATCH $RETENTION_TIME $OLDESTDIR3307
$BIN_TMPWATCH $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


# Deplacement du dump de la veille dans OLD :
case $TYPE_BACKUP in
$BIN_MV $DESTDIR3306/* $OLDESTDIR3306/
    tables)
$BIN_MV $DESTDIR3307/* $OLDESTDIR3307/
        # 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


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


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


case $TYPE_BACKUP in
                 echo $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-preprod.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
        tables)
                $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
        for dbname in $BASE_LIST3306 ; do
                         ## !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                 TABLE_LIST="`$BIN_MYSQL  --port 3306 --socket=/tmp/mysql.sock -p$DBPASS3306 -BN  -e \"show tables\" $dbname`"
                        if [ $? != 0 ]; then
                                echo "Attention probleme lors des dumps de cette nuit ! Erreur dans la commande de dump" > $LOGDIR/sqldump.error
                                color="red"
                                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                exit 1
                        fi
      for tablename in $TABLE_LIST; do
                        echo $BIN_MYSQLDUMP --port 3306 --socket=/tmp/mysql.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname $tablename
                        $BIN_MYSQLDUMP --port 3306 --socket=/tmp/mysql.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS3306 $dbname $tablename 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR3306/$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
                         if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                 echo "Attention probleme lors des dumps de cette nuit!"
                                 echo "Attention probleme lors des dumps de cette nuit de l instance PREPROD!"
                                 color="red"
                                 color="red"
                                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
Ligne 152 : Ligne 214 :
                         fi
                         fi
                 done
                 done
        done


         for dbname in $BASE_LIST3307 ; do
        # Ce test sert à supprimer l'option --events du dump pour la base performance_schema car cette option ne marche pas sur cette base   
                 TABLE_LIST2="`$BIN_MYSQL  --port 3307 --socket=/tmp/mysql-3307.sock -p$DBPASS3307 -BN  -e \"show tables\" $dbname`"
         for dbname in $BASE_LISTDEMO; do
                        if [ $? != 0 ]; then
                 if [ "$dbname" = "performance_schema" ];
                                echo "Attention probleme lors des dumps de cette nuit ! Erreur dans la commande de dump" > $LOGDIR/sqldump.error
                then
                                                                                                                                                color="red"
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                else
                                exit 1
                        DumpOpt="$DUMP_OPT";
                        fi
                fi
        for tablename in $TABLE_LIST2; do
 
                        echo $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-3307.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname $tablename
                echo $BIN_MYSQLDUMP --port 3308 --socket=/tmp/mysql-demo.sock $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
                        $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql3307.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS3307 $dbname $tablename 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR3307/$dbname.$tablename.$DATE.sql.gz
                $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
                         ## !! 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
                         if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                                 echo "Attention probleme lors des dumps de cette nuit!"
                                 echo "Attention probleme lors des dumps de cette nuit de l instance DEMO!"
                                 color="red"
                                 color="red"
                                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                 Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                 exit 1
                                 exit 1
                         fi
                         fi
                done
        done
        ;;
        bases)
        for dbname in $BASE_LIST3306 ; do
                echo $BIN_MYSQLDUMP --port 3306 --socket=/tmp/mysql.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP --port 3306 --socket=/tmp/mysql.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS3306 $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR3306/$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!"
                        color="red"
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                        exit 1
                fi
                done
        for dbname in $BASE_LIST3307 ; do
                echo $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-3307.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP --port 3307 --socket=/tmp/mysql-3307.sock $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS3307 $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR3307/$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!"
                        color="red"
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                        exit 1
                fi
                 done
                 done
         ;;
         ;;
Ligne 203 : Ligne 238 :


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


if [ `find $DESTDIR -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR | awk {'print $1'}`" -gt 4 ] ;
if [ `find $DESTDIR_DEMO -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR_DEMO | awk {'print $1'}`" -gt 4 ]; then
         then echo "dumps des bases OK"
         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" >> $LOGDIR/sqldump.error
else
                        color="red"
        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
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        color="red"
                        exit 1
        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        exit 1
fi
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 "dumps des bases OK"
echo "`ls -lh $DESTDIR3306 $DESTDIR3307`"
echo "`ls -lh $DESTDIR_DEMO $DESTDIR_PREPROD $DESTDIR_PROD`"
color="green"
color="green"
Send "${color}" "$(cat $LOGDIR/sqldump.ok)"
Send "${color}" "$(cat $LOGDIR/sqldump.ok)"
exit 0
exit 0
</pre>
</pre>
[[Catégorie:Script]]
[[Catégorie:Script]]

Version du 31 janvier 2013 à 13:50

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 :
$BIN_TMPWATCH $RETENTION_TIME $OLDESTDIR_DEMO
$BIN_TMPWATCH $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