Différences entre les versions de « Mysql dump en bash »
De BlaxWiki
Aller à la navigationAller à la recherchem (a renommé Mysql backup avancé en bash en Mysql backup en bash) |
|||
| (5 versions intermédiaires par 2 utilisateurs non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
Ce script de dump est avancé, | 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> | ||
| Ligne 24 : | Ligne 25 : | ||
BASE_LIST="" | BASE_LIST="" | ||
TABLE_LIST="" | TABLE_LIST="" | ||
DUMP_ALLOPT="routines | DUMP_ALLOPT="routines events" | ||
DUMP_OPT="" | DUMP_OPT="" | ||
| Ligne 47 : | Ligne 48 : | ||
fi | fi | ||
done | done | ||
if [ ! -d $DESTDIR ]; then $BIN_MKDIR -p $DESTDIR; | if [ ! -d $DESTDIR ]; then $BIN_MKDIR -p $DESTDIR; | ||
| Ligne 63 : | Ligne 63 : | ||
color="red" | color="red" | ||
Send "${color}" "$(cat $LOGDIR/sqldump.error)" | Send "${color}" "$(cat $LOGDIR/sqldump.error)" | ||
exit 1 | |||
fi | fi | ||
fi | fi | ||
| Ligne 76 : | Ligne 76 : | ||
# 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/ | ||
BASE_LIST="`$BIN_MYSQL -p$DBPASS -BN -e \"show databases\"`" | BASE_LIST="`$BIN_MYSQL -p$DBPASS -BN -e \"show databases\"`" | ||
| Ligne 91 : | Ligne 89 : | ||
exit 1 | exit 1 | ||
fi | fi | ||
case $TYPE_BACKUP in | case $TYPE_BACKUP in | ||
tables) | tables) | ||
for dbname in $BASE_LIST ; do | 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`" | TABLE_LIST="`$BIN_MYSQL -p$DBPASS -BN -e \"show tables\" $dbname`" | ||
if [ $? != 0 ]; then | if [ $? != 0 ]; then | ||
| Ligne 105 : | Ligne 108 : | ||
fi | fi | ||
for tablename in $TABLE_LIST; do | for tablename in $TABLE_LIST; do | ||
echo $BIN_MYSQLDUMP $ | echo $BIN_MYSQLDUMP $DumpOpt --skip-lock-tables --user=$DBUSER $dbname $tablename | ||
$BIN_MYSQLDUMP $ | $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 | #### !! 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!" | ||
color="red" | |||
Send "${color}" "$(cat $LOGDIR/sqldump.error)" | Send "${color}" "$(cat $LOGDIR/sqldump.error)" | ||
exit 1 | exit 1 | ||
| Ligne 119 : | Ligne 122 : | ||
bases) | bases) | ||
for dbname in $BASE_LIST ; do | |||
echo $BIN_MYSQLDUMP $ | if [ "$dbname" = "performance_schema" ]; | ||
$BIN_MYSQLDUMP $ | 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 | ## !! 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 | ||
| Ligne 154 : | 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