Mysql dump multi instance en bash
De BlaxWiki
Aller à la navigationAller à la rechercheCe 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