Scripts para automatizar Backups

Todos conocereis la importancia que tiene realizar respaldos (backups, copias de seguridad…) de los archivos importantes de manera periodica. Pero esta tarea puede llegar a resultar, en muchas ocasiones, una tarea engorrosa y pesada. Para ello he “escrito” (en parte obra mía y en parte de diversas fuentes de la red) este script que automatiza de cierta manera nuestros respaldos. Realmente lo que hace es empaquetar y comprimir, en el/los directorio(s) donde queremos almacenar nuestors respaldos, el archivo o carpeta que le indiquemos; borrando aquellas copias que tengan más de determinado tiempo.

En concreto realiza la copia en dos directorios, uno se encuentra en la carpeta /home/Backup y el otro es un dispositivo que se haya montado en /media/Backup. Para utilizarlo en vuestra máquina hay que cambiar las direcciones de DIRECTORIO_RESPALDO_1 y DIRECTORIO_RESPALDO_2, o eliminar una si no la necesitais (también hay que eliminar el respectivo fragmento que realiza el respaldo para ese directorio). También es recomendable editar las lineas:
find $DIRECTORIO_RESPALDO_1/`basename $1`* -mtime +186 -exec rm -r -f {} \;
find $DIRECTORIO_RESPALDO_2/`basename $1`* -mtime +62 -exec rm -r -f {} \;
cambiando los números de la opción -mtime que indica los días mínimos que han de tener los respaldos antiguos a eliminar (ejemplo: -mtime +186 son los archivos con más de 6 meses de antigüedad). Si no se quieren eliminar los respaldos antiguos simplemente comentad o eliminar las lineas antes mencionadas. Para acabar, si el DIRECTORIO_RESPALDO_2 no es un dispositivo que se tenga que montar, es recomendable eliminar o comentar las lineas:
mount $DIRECTORIO_RESPALDO_2 >/dev/null
umount $DIRECTORIO_RESPALDO_2 >/dev/null

Para ejecutarlo:
# ./Script /directorio_a_respaldar

#!/bin/bash

# Script para automatizar respaldos (Backups)

### INICIALIZACION DE VARIABLES ####

DIRECTORIO_RESPALDO_1=/home/Backup         # Directorio 1 donde se va a realizar el respaldo
DIRECTORIO_RESPALDO_2=/media/Backup        # Directorio 2 donde se va a realizar el respaldo
FECHA_ACTUAL=`date +%d-%m-%Y`               # Fecha actual con formato dd-mm-YYYY (ejem: 15-08-2008)
NOMBRE_ARCHIVO=`basename $1`[$FECHA_ACTUAL] # Nombre del archivo resultante del respaldo (ejem: Documentos[15-08-2008].tar.gz)

### CUERPO DEL SCRIPT ###

clear
# Comprovar si tiene permisos de root
if [ $UID -ne 0 ]; then
echo "Para poder realizar el respaldo necesita tener permisos de superusuario."
exit

# Comprovar si se ha pasado como parametro el directorio/archivo a respaldar
elif [ $# -ne 1 ]; then
echo
echo "Modo de uso: ./`basename $0` {diretorio}"
echo
echo "Sustituya {diretorio} por el directorio a ser el backup"
echo
exit

# Comprovar si se tiene permiso de escritura en el directorio de respaldo 1
elif [ -w $DIRECTORIO_RESPALDO_1 ]; then
clear
echo "Se van a realizar copias de seguridad de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_1"
sleep 3
clear
echo "Iniciando el respaldo. La operacion puede tardar, no desespere..."
# Eliminar archivos con mas de 186 dias (seis meses) del directorio de respaldo 1
find $DIRECTORIO_RESPALDO_1/`basename $1`* -mtime +186 -exec rm -r -f {} \; 2>> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-erros.log
# Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.tar.gz $1 >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log 2>> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.tar.gz >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-md5.txt
# Finalizacion del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_1 ha finalizado con exito."
else
echo
echo "No tiene permiso de escritura en $DIRECTORIO_RESPALDO_1"
fi

# Montando medio de Backup
mount $DIRECTORIO_RESPALDO_2 >/dev/null
# Comprovar si se tiene permiso de escritura en el directorio de respaldo 2
if [ -w $DIRECTORIO_RESPALDO_2 ]; then
clear
echo "Se van a realizar copias de seguridad de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2"
sleep 3
clear
echo "Iniciando el respaldo. La operacion puede tardar, no desespere..."
# Eliminar archivos con mas de 62 dias (dos meses) del directorio de respaldo 2
find $DIRECTORIO_RESPALDO_2/`basename $1`* -mtime +62 -exec rm -r -f {} \;  2>> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-erros.log
#Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.tar.gz $1 >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log 2>> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.tar.gz >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-md5.txt
# Finalizacion del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2 ha finalizado con exito."
else
echo
echo "No tiene permiso de escritura en $DIRECTORIO_RESPALDO_2 o no se ha podido montar correctamente el dispositivo."
fi
# Desmontando medio de Backup
umount $DIRECTORIO_RESPALDO_2 >/dev/null
exit

### FIN DEL SCRIPT ###

MUY IMPORTANTE si no entiendes claramente como funciona este script no te arriesgues a utilizarlo, en su lugar utiliza este otro más sencillo y seguro.

Para ejecutarlo:
# ./Script /directorio_a_respaldar /directorio_donde_guardar_el_respaldo

#!/bin/bash

# Script para automatizar respaldos (Backups)

### INICIALIZACION DE VARIABLES ####

FECHA_ACTUAL=`date +%d-%m-%Y`               # Fecha actual con formato dd-mm-YYYY (ejem: 15-08-2008)
NOMBRE_ARCHIVO=`basename $1`[$FECHA_ACTUAL] # Nombre del archivo resultante del respaldo (ejem: Documentos[15-08-2008].tar.gz)

### CUERPO DEL SCRIPT ###

clear
# Comprovar si tiene permisos de root
if [ $UID -ne 0 ]; then
echo "Para poder realizar el respaldo necesita tener permisos de superusuario."
exit

# Comprovar si se ha pasado como parametro el directorio/archivo a respaldar
elif [ $# -ne 1 ]; then
echo
echo "Modo de uso: ./`basename $0` {diretorio_a_respaldar} {directorio_donde_respaldar}"
echo
exit

# Comprovando permisos de escritura
elif [ -w $2 ]; then
# Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $2/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $2/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $2/$NOMBRE_ARCHIVO.tar.gz $1 >> $2/$NOMBRE_ARCHIVO.log 2>> $2/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $2/$NOMBRE_ARCHIVO.tar.gz >> $2/$NOMBRE_ARCHIVO-md5.txt
# Finalizacion del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $2/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $2 ha finalizado con exito."
else
echo
echo "No tiene permiso de escritura en $2"
fi

### FIN DEL SCRIPT ###

Anuncios
    • geek_cl
    • 10/03/09

    por que 2 veces.?

  1. Excelente Script.
    Lo acomode a mis necesidades y funciono impecable.
    Solo quiero acotar que seria bueno dejar el respaldo programado.(crontab)
    30 00 * * * root /home/respaldo.sh

    • cce
    • 10/11/09

    hola, estoy tratando de automatizar el backup de una base de datos y quiero que la pc donde se encuentra la base de datos se conecte con otra pc donde qiero q se guarde mi backup. Dos pc con DEBIAN GNU /LINUX. saludos y muchas gracias.-

  2. Para backups de ese estilo, el escriptillo que he puesto no vale. Es algo más “serio” (por decirlo de alguna forma) y más interesante. Por desgracia mis conocimientos sobre el tema todavía no abarcan a tanto, pero me suena que para hacer backups de bases de datos hay algo llamado MySQLdump o parecido (doy por hecho que mysql pero casi todas las BBDD tienen aplicaciones similares).
    Después al tratarse de algo remoto te recomiendo rsync, una gran utilidad a la hora de hacer todo tipo de backups (totales, incrementales, diferenciales…), o si quieres algo mas chapuzero un scp a la maquina remota. Aunque para que se conecte sin necesidad de passwords tendrás que usar una clave pública para ssh:

    local$ ssh-keygen -t rsa
    local$ scp ~/.ssh/id_rsa.pub user@remoto
    local$ ssh user@remoto
    Passwd:
    remoto$ cat id_rsa.pub >> ~/.ssh/authorized_keys

    Espero que te sirva de ayuda.

    • Eng
    • 10/01/11

    No funciona o yo soy muy bruto, pero no hace el respaldo de los dos directorios solo de uno en dos sitios diferentes

      • Eng
      • 10/01/11

      Listo solucionado debe modificarse: $1 en las lineas;
      *echo “Se van a realizar copias de seguridad de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2”
      *find $DIRECTORIO_RESPALDO_2/`basename $1`* -mtime +62 exec rm -r -f {} \; 2>> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-erros.log
      *tar -czvf $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.tar.gz $1 >>
      *echo “El respaldo de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2 ha finalizado con exito.”

      Por: $2, saludos si se deja como lo escribe el autor hace respaldo del mismo directorio en dos lugares distintos

  3. I pay a quick visit day-to-day some websites and
    websites to read articles or reviews, but this blog gives
    quality based posts.

  4. Marvelous, what a webpage it is! This web site provides valuable data to us,
    keep it up.

  5. naturally like your website but you need to take a look at the spelling on several
    of your posts. Several of them are rife with spelling problems and I find it very bothersome to inform the reality however I will certainly come again again.

  6. If you would like to take much from this piece of
    writing then you have to apply these methods to your won website.

    • Pedro
    • 15/04/16

    amigo, quiero hacer respaldo de un directorio ubicado en /home/fileserver y que se haga copia a un HDD montado en /media/hdd_externo/Backup_Fileserver.

    quiero que el formato a pasar sea la siguiente manera:

    BKP_FILESERVER_2016_04_13.tar.gz ya que todos los dias debe de hacerce un backup

    a ver si me puedes ayudar

    gracias de antemano.

  1. 10/11/14
    Trackback from : directory
  2. 12/01/15
    Trackback from : blogs

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: