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:

#!/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

Backup Incremental:

#!/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