Avant de vous copier le code je vous explique le but recherché, et le souci rencontré.
Toutes les 2h, toutes les bases SQL sont exportées et compressées dans un gz
Ensuite on applique divers test afin de vérifier la validité standard du fichier généré.
Si ces test réussissent, alors on envoie le fichier sur un autre serveur, et on le duplique en local pour garder une trace qui sera nécessaire à la prochaine sauvegarde.
Certains test donc dépendent du résultat d’autres test.
J’ai déjà trouvé une parade afin de faire fonctionner le script convenablement, mais par curiosité je voudrais avoir l’avis d’autres personne que moi-même.
Dès lors que mes test sont imbriqués, le script ne fonctionne plus convenablement (je veux dire en ce sens qu’il ne s’arrête pas comme il le devrait)
Malgré donc que le backup sql se faisait, et que le fichier .old était présent, le script s’arrêtait toujours au second test (présence du .old)
le script en question :
#!/bin/sh
# on récupère la date à l'instant T
DATE=$(date +%y%m%d_%H%M)
# on détermine le nom du fichier à générer
NOMFICHIER="${DATE}.sql.gz"
# on exporte et compresse les bases
/usr/local/mysql/bin/mysqldump -u backup --password=XXXXX -A | gzip > /tmp/${NOMFICHIER}
# on réinitialise le fichier de rapport par mail
RAPPORT="/var/backups/mail.txt"
printf "Backup SQL du ${DATE} \n\n" > ${RAPPORT}
# on initialise la variable error pour les test
error=0
# on récupère la date à l'instant T moins 2h
OLD=$(date +%y%m%d_%H%M --date="2 hours ago")
# on détermine le nom du duplicata d'il y a 2h
FICHIEROLD="/tmp/SQL-${OLD}.old"
# on commence nos test.
# on vérifie que mysql tourne. si oui, on vérifie la présence de l'ancienne sauvegarde.
# si présente, on vérifie que la nouvelle sauvegarde est supérieur ou égale à l'ancienne
# on vérifie aussi qu'elle est inférieur à l'ancienne +5%
# a la fin, si error est supérieur à 0, on envoie le mail
# sinon on termine la sauvegarde
if [ -z $(pidof mysqld) ]; then
printf "MySQL ne fonctionnait pas au moment de la sauvegarde.\n" >> ${RAPPORT}
((error++))
else
if [ ! -f ${FICHIEROLD} ]; then
printf "la sauvegarde 2h auparavant est absente.\n" >> ${RAPPORT}
((error++))
else
SIZENEW=$(du /tmp/${NOMFICHIER} | cut -f1)
SIZEOLD=$(du ${FICHIEROLD} | cut -f1)
if [ ${SIZENEW} -lt ${SIZEOLD} ]; then
printf "La taille de la nouvelle sauvegarde est inférieur a celle 2h auparavant.\n" >> ${RAPPORT}
((error++))
fi
let "LIMITE=${SIZEOLD}*5/100"
let "LIMITE=${SIZEOLD}+${LIMITE}"
if [ ${SIZENEW} -gt ${LIMITE} ]; then
printf "La taille de la nouvelle sauvegarde est trop supérieur a celle 2h auparavant.\n" >> ${RAPPORT}
fi
fi
fi
if [ ${error} -gt 0 ]; then
mail -s "Echec de la sauvegarde MySQL" "moi@mondomaine.com" < ${RAPPORT}
else
scp /tmp/${NOMFICHIER} backup@mon_serveur_distant:/var/backups/SQL
rm -f ${FICHIEROLD}
cp /tmp/${NOMFICHIER} /tmp/SQL-${DATE}.old
rm /tmp/${NOMFICHIER}
fi
voilà…
si certains ont une idée
j’ai déjà scripté en bash à plusieurs reprises, et utilisé des structure de contrôle imbriquées sans aucun problème. Ici je ne vois vraiment plus ce qui peut poser problème x_x