Pequeño Script Bash para copia de seguridad de directorios y BBDD MySql

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

tweet: 

Comentarios

Muchas Gracias Jose Manuel.

En mi caso funcionó muy bien el script que has desarrollado.

Un saludo.

Añadir nuevo comentario

Plain text

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
By submitting this form, you accept the Mollom privacy policy.