Backups full e incremental con bash

Requisito de un tema laboral fue crear de urgencia unos backups full e incrementales de un repositorio. Como siempre estos requerimientos se requieren para ayer y son para salvar cabezas cuando las papas queman.

Debido al gran volumen de datos, como estrategia de backups se decidió realizar un backup full  mensualmente y un backup incremental diario.

A tal fin, se escribieron dos scripts, el primero de ellos, que dado un directorio crea un tar comprimido del mismo. Y el segundo, el que se ejecuta diariamente, que se encarga de verificar la fecha de modificación del último backup full del directorio y a partir de la misma crea un tar comprimido con los cambios desde entonces.

Nada de otro mundo, dos scripts sencillos, pero que se dejan a vuestra disposición por si las moscas.


Backup Full:
[CODE]
#!/bin/bash

TAR=$(which tar)
TEE=$(which tee)

ARGS=2

if [ $# -ne $ARGS ]
then
echo “Usage: “$0″ file dir”
echo ” file: backup file name”
echo ” dir: path to backup”
exit
fi

APP=$0 #app name
FILE=$1″_full.tgz” #backup file
FILE_OLD=$FILE”~” #file backuped before remove
DIR=$2 #path

LOG_DIR=/var/log
LOG_FILE=$LOG_DIR”/”${APP##*\/}”.log” #remuevo de APP lo que este antes de la ultima /

TODAY=`date “+%Y-%m-%d %a”`
echo $TODAY” *** Backup full *** ” | $TEE -a $LOG_FILE

if [ ! -d $DIR ]
then
echo “ERROR: path “$DIR” not exist” | $TEE -a $LOG_FILE
exit
fi

#Realizo backup del backup
echo “Rotating files…” | $TEE -a $LOG_FILE

if [ -f $FILE ];
then
#cp -v $FILE $FILE_OLD | $TEE -a $LOG_FILE
rm -v $FILE | $TEE -a $LOG_FILE
fi

echo “Making backup…” | $TEE -a $LOG_FILE
#Realizo el backup
$TAR -chzf $FILE $DIR | $TEE -a $LOG_FILE

if [ $? == 0 ]
then
echo “Backup successfull!”
else
echo “ERROR: error making backup :-(”
fi
[/CODE]

Backup Incremental:
[CODE]
#!/bin/sh
TAR=$(which tar)
TEE=$(which tee)

ARGS=2

if [ $# -ne $ARGS ]

then
echo “Usage: “$0″ file dir”
echo ” file: backup file name”
echo ” dir: path to backup”
exit
fi

APP=$0 #app name
FILE=$1″_incremental.tgz” #backup file
FILE_FULL=$1″_full.tgz” #backup full
FILE_OLD=$FILE”~” #file backuped before remove
DIR=$2 #path

LOG_DIR=/var/log
LOG_FILE=$LOG_DIR”/”${APP##*\/}”.log” #remuevo de APP lo que este antes de la ultima /

TODAY=`date “+%Y-%m-%d %a”`
echo $TODAY” *** Backup incremental ***” | $TEE -a $LOG_FILE

if [ ! -d $DIR ]
then
echo “ERROR: path “$DIR” not exist” | $TEE -a $LOG_FILE
exit
fi

# Reviso si existe el backup full
if [ ! -f $FILE_FULL ];
then
echo “ERROR: full backup “$FILE_FULL” not exist!” | $TEE -a $LOG_FILE
exit
fi

#Realizo backup del backup

echo “Rotating files…” | $TEE $LOG_FILE

if [ -f $FILE ];

then
#cp -v $FILE $FILE_OLD | $TEE $LOG_FILE
rm -v $FILE | $TEE $LOG_FILE
fi

#Realizo el backup
DATE_FULL=”`date \”+%Y-%m-%d %H:%M\” -r “$FILE_FULL”`”
echo “Full backupe created: “$DATE_FULL | $TEE $LOG_FILE

echo “Making backup…” | $TEE $LOG_FILE
$TAR -chzf $FILE –newer-mtime=”$DATE_FULL” $DIR | $TEE -a $LOG_FILE

if [ $? == 0 ]
then
echo “Backup successfull!”
else
echo “ERROR: error making backup :-(”
fi

[/CODE]

Tags: , , , , , , , ,


  • Eduardo

    Gracias por el script.

    Una duda solo, no sería mejor hacer el archivo comprimido en el directorio temporal y solo en caso de terminar correctamente copiarlo al definitivo.

    Lo digo por si se para el proceso en medio de la compresión no tendramos manera de saber si ese archvo es correcto o no.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.