Différences entre les versions de « Mysql & postgresql dump en bash »
De BlaxWiki
Aller à la navigationAller à la recherche| Ligne 75 : | Ligne 75 : | ||
# 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 : | ||
Version actuelle datée du 12 juillet 2013 à 08:52
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="xxxxxx"
DESTDIR="/var/db_backup/CURRENT"
OLDESTDIR="/var/db_backup/OLD"
LOGDIR="/var/log/"
BIN_MYSQLDUMP="/usr/bin/mysqldump"
BIN_MYSQL="/usr/bin/mysql"
BIN_TMPWATCH="/usr/sbin/tmpwatch"
BIN_MKDIR="/bin/mkdir"
BIN_MV="/bin/mv"
BIN_PGDUMP="/opt/applis/postgresql/bin/pg_dump"
LIST_BASE_PGSQL="$(/bin/su - postgres -c "psql -l" | awk '{ print $1}' | sed "1,3d" | grep -vE 'List|template|:|\(' | sed -e '/^$/d')"
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=""
MYSQLLOG="mysqldump"
PGSQLLOG="pgsqldump"
DUMP_LOG_PGSQL="/var/log/"$PGSQLLOG".log"
DESTDIR_PGSQL="/var/db_backup_pgsql/CURRENT/"
OLDESTDIR_PGSQL="/var/db_backup_pgsql/OLD"
# Supervision
Send()
{
"${VISION}" "${DISPLAY}" "status+${LIFE_MESSAGE} ${TARGET}.${SERVICE} ${1} $(date) ${SERVICE} ${2}"
}
# Execution du dump :
exec 1> $LOGDIR/"$MYSQLLOG".ok
exec 2> $LOGDIR/"$MYSQLLOG".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/"$MYSQLLOG".error
fi
done
if [ ! -d $DESTDIR ]; then $BIN_MKDIR -p $DESTDIR;
if [ $? != 0 ]; then
echo "Attention probleme lors des dumps de cette nuit ! Repertoire de destination $DESTDIR des dumps impossible a cree" >> $LOGDIR/"$MYSQLLOG".error
fi
fi
if [ ! -d $OLDESTDIR ]; then $BIN_MKDIR -p $OLDESTDIR;
if [ $? != 0 ]; then
echo "Attention probleme lors des dumps de cette nuit ! Repertoire de destination $OLDESTDIR des dumps impossible a creer" >> $LOGDIR/"$MYSQLLOG".error
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 MYSQL de cette nuit ! Aucune base presente ou erreur dans la command de dump" >> $LOGDIR/"$MYSQLLOG".error
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 MYSQL de cette nuit ! Erreur dans la commande de dump" >> $LOGDIR/"$MYSQLLOG".error
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/"$MYSQLLOG".error | gzip -c > $DESTDIR/$dbname.$tablename.$DATE.sql.gz
#### !! si my"$MYSQLLOG" renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
if [ $? -ne 0 -o -s $LOGDIR/"$MYSQLLOG".error ]; then
echo "Attention probleme lors des dumps MYSQL de cette nuit!" >> $LOGDIR/"$MYSQLLOG".error
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/"$MYSQLLOG".error | gzip -c > $DESTDIR/$dbname.$DATE.sql.gz
## !! si my"$MYSQLLOG" renvoie UNE seule fois une erreur, le process complet s'arrete et renvoie rouge
if [ $? -ne 0 -o -s $LOGDIR/"$MYSQLLOG".error ]; then
echo "Attention probleme lors des dumps MYSQL de cette nuit!" >> $LOGDIR/"$MYSQLLOG".error
fi
done
;;
*)
echo "Attention probleme lors des dumps MYSQL de cette nuit. Type de backup non reconnu, merci de modifier la variable TYPE_BACKUP" >> $LOGDIR/"$MYSQLLOG".error
;;
esac
if [ `find $DESTDIR -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR | awk {'print $1'}`" -gt 7 ] ;
then echo "dumps des bases OK"
else echo "Attention probleme lors des dumps MYSQL de cette nuit. Il n'y aucune base backupe ou leur taille est de zero" >> $LOGDIR/"$MYSQLLOG".error
fi
## Partie des dumps postgresql
if [ ! -d $DESTDIR_PGSQL ]; then mkdir -p $DESTDIR_PGSQL;fi
if [ ! -d $OLDESTDIR_PGSQL ]; then mkdir -p $OLDESTDIR_PGSQL;fi
# Purge des anciens dumps :
$BIN_TMPWATCH $RETENTION_TIME $OLDESTDIR_PGSQL
# Deplacement du dump de la veille dans OLD :
$BIN_MV $DESTDIR_PGSQL/* $OLDESTDIR_PGSQL/
# Execution du dump :
> $LOGDIR/dump_mysql_postgresql.ok
> $LOGDIR/resultat_dump_mysql_postgresql.error
> $LOGDIR/"$PGSQLLOG".ok
> $LOGDIR/"$PGSQLLOG".error
exec 1> $LOGDIR/"$PGSQLLOG".ok
exec 2> $LOGDIR/"$PGSQLLOG".error
for d in $LIST_BASE_PGSQL
do
/bin/su - postgres -c "$BIN_PGDUMP $d" 2> $LOGDIR/"$PGSQLLOG".error | gzip -c > $DESTDIR_PGSQL/$d.$DATE.out.gz
# Si ca ne passe pas, il faut faire un :
# $BIN_PGDUMP $d -Upostgres -c 2> $LOGDIR/"$PGSQLLOG".error | gzip > $DESTDIR_PGSQL/dumppgsql_$DATE.sql.gz
done
if [ `find $DESTDIR_PGSQL -type f | wc -l` -gt 0 -a "`du -ks $DESTDIR_PGSQL | awk {'print $1'}`" -gt 7 ] ;
then echo "dumps des bases OK"
else echo "Attention probleme lors des dumps POSTGRESQL de cette nuit. Il n'y aucune base backupe ou leur taille est de zero" >> $LOGDIR/"$PGSQLLOG".error
fi
if [ -s $LOGDIR/"$PGSQLLOG".error -o -s $LOGDIR/"$MYSQLLOG".error ];
then
color=red
echo "Le dump mysql ou postgres ne s'est pas bien execute"
echo "## Dump Mysql ##" >> $LOGDIR/resultat_dump_mysql_postgresql.error
cat $LOGDIR/"$MYSQLLOG".error >> $LOGDIR/resultat_dump_mysql_postgresql.error
echo "## Dump Postgresql ##" >> $LOGDIR/resultat_dump_mysql_postgresql.error
cat $LOGDIR/"$PGSQLLOG".error >> $LOGDIR/resultat_dump_mysql_postgresql.error
Send "${color}" "$(cat $LOGDIR/resultat_dump_mysql_postgresql.error)"
else
color=green
echo "Le dump de toutes les bases Mysql et Postgresql a ete realise avec succes."
echo ""
ls -lh $DESTDIR_PGSQL/ $DESTDIR/ >> $LOGDIR/dump_mysql_postgresql.ok
Send "${color}" "$(cat $LOGDIR/dump_mysql_postgresql.ok)"
fi
exit 0