Despues de comenzar con el traslado de servidors a AWS de Amazon, necesito un pequeño archivo para realizar backups. En otro artículo comentare el traspaso.
Pequeño Script en Bash para realización de copias de seguridad, copia y comprime los directorios que se le indican, asi como la base de datos en Mysql. La copia la hace incremental, y el utimo día de la semana lo hace completo. Es necesario meterlo en el cron.
#!/bin/bash
#Creado por jose manuel guerrero jmanuelguerrero@gmail.com
###########################################################
#Variables
# Dia de la semana que se quiere backup completo 0=Domingo
DIA0=0
# Donde se guardaran los backups; Debe existir
DIRBACKUP=/mnt/backups/
# Directorios para guardar en Backup separados por espacios
DIRECTORIOS="/etc /back /var/named /var/www/html"
# Se debe enviar los resultados por email 0=no 1=si
EMAIL=1
# EMAIL al que se enviaran los resultado
DIREMAIL=sistemas@scriptacontenidos.com
# Email Subject
TITULOEMAIL="$HOSTNAME Copia realizada"
# Solo deja el ultimo backup semanal 0 o deja todo 1
DEJATODO=0
# Comprimir el backup 0 no 1 si
COMPRIMIR=1
# Comrpimir log cuando este finalizado 0 no 1 si
COMPRIMIRLOG=1
# Si comprimes que nivel de compresion quieres.
COMPRIMIRNIVEL=6
# Ver la salida de pantalla 0 no 1 si
VERSO=1
# Quieres informacion detalada de tar y gzip? 0=no, 1=si
INFOVER=1
#BASE de datos
USUARIO="usuario"
PASS="clave"
DATABASE="nombre_base_de_datos"
#fin de las configuraciones
# Variables de aplicacion
# Dia de la semana;
DIADESEMANA=`date +"%w"`
# Carpeta para los backups diarios
DIRBACKUPDIARIO=$DIRBACKUP/DIARIO
# Nombre del directorio diario
DIRBACKUPDIA=$DIRBACKUPDIARIO/$DIADESEMANA
# Directorio que guarda los backups semanales
DIRBACKUPARCHIVO=$DIRBACKUP/BACKUPS_ARCHIVADOS
# Localizacion del archivo que guarda el backup semanal
DIRBACKUP0=$DIRBACKUP/.level0_datestamp
# Dia
HOY=`date`
# Directorio de Logs
LOGDIR=$DIRBACKUP/LOGS
# Directorio BBDD
BBDDDIR=$DIRBACKUP/BBDD
# Nombre del script
SCRIPTNAME="Copia de seguridad"
# Version
VERSION=0.02
# Mensaje
MENSAJE="Creado por Jose Manuel Guerrero jmanuelguerrero@gmail.com"
if [ $INFOVER -eq 1 ]
then
INFOVERCOMMAND="--verbose"
fi
# ARchivo log
ARCHIVOLOG=$LOGDIR/`date +"%m%d%Y_%s"`.log
######## Comrpobando algunos errores #########
# Existe el directorio de Backup
if [ ! -d $DIRBACKUP ]
then
#Enviar email y salir
if [ $EMAIL -eq 1 ]
then
echo "El directorio de Backup $DIRBACKUP no existe. Operacion cancelada." | mail -s "$TITULOEMAIL" $DIREMAIL
fi
echo "El directorio de Backup $DIRBACKUP No existe operacion cancelada"
exit 1
fi
# Existe el directorio de backup diario? si no lo crea
if [ ! -d $DIRBACKUPDIARIO ]
then
mkdir $DIRBACKUPDIARIO
fi
# Existe el directorio de el backup diario de log? si no lo crea
if [ ! -d $LOGDIR ]
then
mkdir $LOGDIR
fi
# Existe el directorio de copia de base de datos si no lo creamos.
if [ ! -d $BBDDDIR ]
then
mkdir $BBDDDIR
fi
####### Redirigir la salir al archivo de log y a la pantalla
exec 3>&1 # cremos tuberia (Copia del stdout)
exec 1>$ARCHIVOLOG # direccionamos el stdout al arhivo
exec 2>&1 # descomentamos si queremos stderr tambien
if [ $VERSO -eq 0 ]
then tail -f $ARCHIVOLOG >&3 & # Ejecutamos tail en background
fi
######## Algo de impresion ###############
echo " "
echo "#######################################################################"
echo "$SCRIPTNAME "
echo "Version $VERSION"
echo "$MENSAJE"
echo " "
echo "Host: $HOSTNAME "
echo "Hora inicio: $HOY"
echo "#######################################################################"
echo " "
echo " "
echo " "
######## Ejecutamos Backup #########
#Si el dia es DIA0 hacemos backup completo
mysqldump -a -u $USUARIO -p$PASS $DATABASE > $BBDDDIR/$DATABASE`date +"%m%d%Y_%s"`.sql
if test $DIADESEMANA -eq $DIA0
then
LEVEL=0
#Necesitamos archivar el ultimo backup semanal completo al directorio de archivo
#Creamos el directorio de la semana vieja si no existe
if test -d $DIRBACKUPARCHIVO
then
#Borramos el antiguo directorio DEJATODO is set to 1
if test $DEJATODO -eq 0
then rm -Rf $DIRBACKUPARCHIVO/*
fi
else
mkdir $DIRBACKUPARCHIVO
chmod 700 $DIRBACKUPARCHIVO
fi
#Mueve el utimo backup completo al directorio de archivo
mv -f $DIRBACKUPDIA/* $DIRBACKUPARCHIVO > /dev/null 2>&1
#Borra todos los backups diarios
rm -Rf $DIRBACKUPDIARIO/*
#Crea el diretorio de backup diarios
mkdir $DIRBACKUPDIA
#Hace un backup completo de cada directorio puesto en la configuracion
for BACKUPFILES in $DIRECTORIOS
do
#Creo el nombre de archivo
WITHOUTSLASHES=`echo $BACKUPFILES | tr "/" "."`
WITHOUTLEADINGDOT=`echo $WITHOUTSLASHES | cut -b2-`
OUTFILENAME=$WITHOUTLEADINGDOT.`date +"%m%d%Y_%s"`.tar
OUTFILE=$DIRBACKUPDIA/$OUTFILENAME
STARTTIME=`date`
echo " "
echo " "
echo "#######################################################################"
echo "$STARTTIME: Creando un nivel $LEVEL copia de $BACKUPFILES a $OUTFILE"
echo "#######################################################################"
tar --create $INFOVERCOMMAND \
--file $OUTFILE \
--label "Nivel-$LEVEL Backup ${HOY}" \
$BACKUPFILES
if test $COMPRIMIR -eq 1
then
#gzip comprime
gzip -$COMPRIMIRNIVEL $INFOVERCOMMAND $OUTFILE
rm -f $OUTFILE
fi
done
# Existe el archivo de backup? si no lo crea
if [ ! -w $DIRBACKUP0 ]
then
touch $DIRBACKUP0
fi
#Fecha completa del backup
echo $HOY > $DIRBACKUP0
else
#Debemos realizar un backup incremental
LEVEL=1
# Existe el direcotior de backupdiario? si no lo crea
if [ ! -d $DIRBACKUPDIA ]
then
mkdir $DIRBACKUPDIA
fi
# Existe el directorio de backup semanal? si no lo crea
if [ ! -w $DIRBACKUP0 ]
then
touch $DIRBACKUP0
echo "1969-12-31" > $DIRBACKUP0
fi
#Coge el dia del ultimo backup
LAST=`cat $DIRBACKUP0`
#Crea un backup incremental
for BACKUPFILES in $DIRECTORIOS
do
#Crea el nombre de archivo; remplaza / con .
WITHOUTSLASHES=`echo $BACKUPFILES | tr "/" "."`
WITHOUTLEADINGDOT=`echo $WITHOUTSLASHES | cut -b2-`
OUTFILENAME=$WITHOUTLEADINGDOT.`date +"%m%d%Y_%s"`.tar
OUTFILE=$DIRBACKUPDIA/$OUTFILENAME
STARTTIME=`date`
echo " "
echo " "
echo "#######################################################################"
echo "$STARTTIME: Creando un nivel $LEVEL backup de $BACKUPFILES a $OUTFILE"
echo "#######################################################################"
tar --create $INFOVERCOMMAND \
--file $OUTFILE \
--after-date "$LAST" \
--label "Nivel-$LEVEL Backup de $LAST a $HOY" \
$BACKUPFILES
if test $COMPRIMIR -eq 1
then
#gzip comprime
gzip -$COMPRIMIRNIVEL $INFOVERCOMMAND $OUTFILE
rm -f $OUTFILE
fi
done
fi
SCRIPTFINISHTIME=`date`
echo " "
echo " "
echo " "
echo " "
echo "#######################################################################"
echo "Finalizado tiempo: $SCRIPTFINISHTIME"
echo " "
echo " NOTA: Finalizado, comprobar que esta todo correcto."
echo " "
echo " "
echo "#######################################################################"
#Notificacion email
if [ $EMAIL -eq 1 ]
then cat $ARCHIVOLOG | mail -s "$TITULOEMAIL" $DIREMAIL
fi
exec 1>&3
exec 2>&3
#Comrpimir log file?
if test $COMPRIMIRLOG -eq 1
then
#gzip it
gzip -$COMPRIMIRNIVEL $ARCHIVOLOG > /dev/null 2>&1
rm -f $ARCHIVOLOG > /dev/null 2>&1
fi
exit 0
Añadir nuevo comentario