Mysql dump en bash

De BlaxWiki
Aller à la navigationAller à la recherche
#!/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="ROOTPWD"
DESTDIR="/var/db_backup/CURRENT"
OLDESTDIR="/var/db_backup/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 skip-lock-tables 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 ]; then $BIN_MKDIR -p $DESTDIR;
        if [ $? != 0 ]; then
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR des dumps impossible à créer" > $LOGDIR/sqldump.error
                color="red"
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                exit 1
        fi
fi

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

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

# Deplacement du dump de la veille dans OLD :
$BIN_MV $DESTDIR/* $OLDESTDIR/




BASE_LIST="`$BIN_MYSQL -p$DBPASS -BN  -e \"show databases\"`"
if [ "$BASE_LIST" = "" -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



case $TYPE_BACKUP in
        tables)
        for dbname in $BASE_LIST ; do
                TABLE_LIST="`$BIN_MYSQL -p$DBPASS -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 $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname $tablename
                        $BIN_MYSQLDUMP $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS $dbname $tablename 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR/$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!"
                                color="red"
                                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                                exit 1
                        fi
                done
        done
        ;;

        bases)
  for dbname in $BASE_LIST ; do
                echo $BIN_MYSQLDUMP $DUMP_OPT --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP $DUMP_OPT --skip-lock-tables --user=$DBUSER --password=$DBPASS $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR/$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
        ;;

        *)
        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  -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR | 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" >> $LOGDIR/sqldump.error
                        color="red"
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                        exit 1
fi


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

[[Catégorie:Script]