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

De BlaxWiki
Aller à la navigationAller à la recherche
(Page créée avec « <pre> #!/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... »)
 
 
(10 versions intermédiaires par 2 utilisateurs non affichées)
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
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).
<pre>
<pre>
#!/bin/bash
#!/bin/bash
Ligne 7 : Ligne 10 :
TARGET="$(hostname | sed -e 's/\./,/g')"
TARGET="$(hostname | sed -e 's/\./,/g')"
SERVICE="backup"
SERVICE="backup"
DBUSER="root"
DBPASS="ROOTPWD"
DBPASS="ROOTPWD"
DESTDIR="/var/db_backup/CURRENT"
DESTDIR="/var/db_backup/CURRENT"
Ligne 21 : Ligne 25 :
BASE_LIST=""
BASE_LIST=""
TABLE_LIST=""
TABLE_LIST=""
DUMP_ALLOPT="routines events"
DUMP_OPT=""


# Supervision
# Supervision
Send()
Send()
{
{
  "${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE}
  "${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
${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 [ ! -d $DESTDIR ]; then $BIN_MKDIR -p $DESTDIR;
      if [ $? != 0 ]; then
        if [ $? != 0 ]; then
              echo "Attention probleme lors des dumps de cette nuit
                echo "Attention probleme lors des dumps de cette nuit ! Répertoire de destination $DESTDIR des dumps impossible à créer" > $LOGDIR/sqldump.error
! Répertoire de destination $DESTDIR des dumps impossible à créer" >
                color="red"
$LOGDIR/sqldump.error
                Send "${color}" "$(cat $LOGDIR/sqldump.error)"
              color="red"
                exit 1
              Send "${color}" "$(cat $LOGDIR/sqldump.error)"
        fi
              exit 1
      fi
fi
fi


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


# Deplacement du dump de la veille dans OLD :
# Deplacement du dump de la veille dans OLD :
$BIN_MV $DESTDIR/* $OLDESTDIR/
$BIN_MV $DESTDIR/* $OLDESTDIR/
# Execution du dump :
exec 1> $LOGDIR/sqldump.ok
exec 2> $LOGDIR/sqldump.error


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


case $TYPE_BACKUP in
        tables)
        for dbname in $BASE_LIST ; do
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi


                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 $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname $tablename
                        $BIN_MYSQLDUMP $DumpOpt --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
        ;;


case $TYPE_BACKUP in
        bases)
      tables)
        for dbname in $BASE_LIST ; do
      for dbname in $BASE_LIST ; do
                if [ "$dbname" = "performance_schema" ];
              TABLE_LIST="`$BIN_MYSQL -p$DBPASS -BN  -e \"show
                then
tables\" $dbname`"
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                      if [ $? != 0 ]; then
                else
                              echo "Attention probleme lors des
                        DumpOpt="$DUMP_OPT";
dumps de cette nuit ! Erreur dans la commande de dump" >
                fi
$LOGDIR/sqldump.error
                echo $BIN_MYSQLDUMP $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
                              color="red"
                $BIN_MYSQLDUMP $DumpOpt --skip-lock-tables --user=$DBUSER --password=$DBPASS $dbname 2> $LOGDIR/sqldump.error | gzip -c > $DESTDIR/$dbname.$DATE.sql.gz
                              Send "${color}" "$(cat $LOGDIR/sqldump.error)"
                ## !! si mysqldump renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
                              exit 1
                if [ $? -ne 0 -o -s $LOGDIR/sqldump.error ]; then
                      fi
                        echo "Attention probleme lors des dumps de cette nuit!"
              for tablename in $TABLE_LIST; do
                        color="red"
              $BIN_MYSQLDUMP -R --skip-lock-tables --events
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
--user=root --password=$DBPASS $dbname $tablename 2>
                        exit 1
$LOGDIR/sqldump.error | gzip -c >
                fi
$DESTDIR/$dbname.$tablename.$DATE.sql.gz
                done
              #### !! 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 "Attention probleme lors des dumps de cette nuit. Type de backup non reconnu, merci de modifier la variable TYPE_BACKUP" > $LOGDIR/sqldump.error
              $BIN_MYSQLDUMP -R --skip-lock-tables --events
                        color="red"
--user=root --password=$DBPASS $dbname 2> $LOGDIR/sqldump.error | gzip
                        Send "${color}" "$(cat $LOGDIR/sqldump.error)"
-c > $DESTDIR/$dbname.$DATE.sql.gz
                        exit 1
              ## !! 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
esac


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


Ligne 150 : Ligne 163 :
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 actuelle datée du 12 juillet 2013 à 08:53

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).

#!/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 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 :
# 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

# 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
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi

                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 $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname $tablename
                        $BIN_MYSQLDUMP $DumpOpt --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
                if [ "$dbname" = "performance_schema" ];
                then
                        DumpOpt="`echo $DUMP_OPT | sed -e "s/--events//g"` --no-data";
                else
                        DumpOpt="$DUMP_OPT";
                fi
                echo $BIN_MYSQLDUMP $DumpOpt --skip-lock-tables --user=$DBUSER  $dbname
                $BIN_MYSQLDUMP $DumpOpt --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