Realizar copias de seguridad con Cron


PROPOSITO

El propósito de este tutorial, es mostrar como realizar copias de seguridad periódicamente de archivos y bases de datos MySql de nuestro servidor linux.

 

CONTENIDO

 

Necesario

Para realizar las copias de seguridad, necesitaremos tener instalado los paquetes vixie-cron y samba.
Será necesario disponer de otro ordenador en red conectado las 24 horas con un directorio compartido donde guardar las copias.

 

Cron (Información obtenida del manual original de RedHat 7.3)

Cron es un demonio que sirve para ejecutar tareas programadas según una combinación de la hora, día del mes, mes, día de la semana y semana.
Cron asume que el sistema está activo de forma continua. Si el sistema no está activo cuando está programada una tarea, Cron no se ejecuta.

Para usar el servicio cron, debe de tener el paquete RPM vixie-cron instalado y el servicio crond debe estar en funcionamiento. Para determinar si el paquete está instalado, use el comando rpm -q vixie-cron. Para determinar si el servicio está funcionando, utilice el comando service crond status (con service crond start iniciamos el demonio).

El fichero de configuración principal de cron, /etc/crontab, contiene las líneas siguientes:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Las primeras cuatro líneas son variables que se usan para configurar el entorno en el que se ejecutan las tareas cron. El valor de la variable SHELL indica al sistema el entorno de shell que deberá utilizarse (en este ejemplo, el shell de bash) y la variable PATH define la ruta usada para ejecutar los comandos. El resultado de las tareas cron se envía por correo electrónico al nombre de usuario definido con la variable MAILTO. Si la variable MAILTO se define como una cadena vacía (MAILTO=""), no se enviará correo electrónico. La variable HOME puede utilizarse para establecer el directorio principal que deberá usarse al ejecutar los comandos o scripts.

Cada línea del fichero /etc/crontab tiene el formato siguiente:
minute   hour   day   month   dayofweek   command

  • minute — número entero entre 0 y 59
  • hour — número entero entre 0 y 23
  • day — número entero entre 1 y 31 (debe ser un día válido si se especifica un mes)
  • month — número entero entre 1 y 12 (o nombre corto del mes, por ejemplo, ene, feb, etc.)
  • dayofweek — número entero entre 0 y 7, donde 0 o 7 corresponde a Domingo (o el nombre corto del día de la semana, por ejemplo, dom, lun, etc.)
  • command — comando que debe ejecutarse. El comando puede ser un comando como ls /proc >> /tmp/proc o un comando que ejecuta un script personalizado escrito por el usuario.
  • En cualquiera de los valores antes indicados, se puede utilizar un asterisco (*) para especificar todos los valores válidos. Por ejemplo, un asterisco para el valor de mes significa que el comando se ejecutará cada mes dentro de las limitaciones del resto de los valores.

    Un guión (-) entre los números enteros indica un intervalo de números enteros. Por ejemplo, 1-4 significa los números enteros 1, 2, 3 y 4.

    Una lista de valores separados por comas (,) especifica una lista. Por ejemplo, 3, 4, 6, 8 indica esos cuatro números enteros.

    La barra (/) puede utilizarse para especificar valores de pasos. El valor de un número entero se puede omitir dentro de un intervalo si se indica a continuación del intervalo lo siguiente /<número entero>. Por ejemplo, 0-59/2 puede usarse para definir el resto de los minutos del campo minuto. Los valores de pasos también pueden utilizarse con un asterisco. Por ejemplo, el valor */3 puede usarse en el campo de mes para omitir el tercer mes.

     

    Configuración de una tarea con Cron

    En el fichero de configuración principal de cron, /etc/crontab, vamos a agregar una nueva línea, para que cada día a las 3 de la mañana ejecute el archivo backup.sh, el cual vamos a introducir las instrucciones para realizar las copias de seguridad.
    01 3 * * * root sh /root/backup.sh
    Esta línea ejecuta como el usuario root el archivo backup.sh el primer minuto de las 3 de la madrugada, todos los días de todos los meses.

    Hay que reiniciar el demonio con service crond restart una vez ha sido modificado.

     

    Realizar copia de seguridad

    El funcionamiento teórico es:

  • Conectamos mediante Samba a una unidad de disco duro compartida
  • Realizamos copia de los archivos empaquetando con Tar y comprimiendo con Gzip
  • Realizamos copia de la base de datos mysql
  • Comprimimos la copia de mysql
  • Antes de empezar con la copia de seguridad crearemos un directorio denominado /root/scripts, y dentro del mismo uno denominado /root/scripts/mnt donde obtendremos la información de hora de inicio,final,... de las copias, y donde montaremos con el samba la unidad compartida a realizar las copias.
       # cd /root
       # mkdir scripts

       # cd scripts
       # mkdir mnt

    Este será nuestro archivo backup.sh. Este archivo, realiza siete copias de seguridad de los archivos, obteniendo lunes.tar.gz, martes.tar.gz, etc... A la semana, la copia es reemplazada. Igualmente, realiza la copia de la base de datos MySQL, obteniendo lunes.mysql.gz, martes.mysql.gz, etc...

    Descargar backup.sh.gz

    #Modifica estos parámetros dependiendo de tus necesidades
    #Directorio donde guardar los archivos log
    DirectorioLog="/root/scripts"
    #Ruta de la unidad compartida
    UnidadCompartida="//192.168.0.11/Misdoc"
    #Usuario para la unidad compartida
    Usu="usuario"
    #Password para la unidad compartida
    Pas="password"
    #Directorio vacío donde montar la unidad compartida
    PuntoMontaje="/root/scripts/mnt"
    #Directorio a copiar
    DirectorioCopiar="/home/httpd"
    #Directorio del MySQL (termina con /)
    DirectorioMySQL="/usr/local/mysql/bin/"
    #Usuario con privilegios para leer todas las bases de datos de Mysql
    UsuMySQL="root"
    #Password para el usuario de MySQL
    PasMySQL="123456"

    diasemana=`date +%w`
    case $diasemana
    in
        0) #domingo
            dia="domingo"
            ;;
        1) #lunes
            dia="lunes"
            ;;
        2) #martes
            dia="martes"
            ;;
        3) #miercoles
            dia="miercoles"
            ;;
        4) #jueves
            dia="jueves"
            ;;
        5) #viernes
            dia="viernes"
            ;;
        6) #sabado
            dia="sabado"
            ;;
    esac
    # Inserta la fecha y hora de inicio de la copia de seguridad en el archivo .log
    echo "-----Inicio-----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" > $DirectorioLog/$dia".log"

    # ***MONTA EL DIRECTORIO COMPARTIDO***
    # Inserta una línea en blanco en el archivo .log
    echo "" >> $DirectorioLog/$dia".log"
    # Inserta la fecha y hora de inicio de montaje en el archivo .log
    echo " -----Montando directorio -----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"
    # Monta la unidad compartida
    smbmount $UnidadCompartida $PuntoMontaje -o username=$Usu,password=$Pas,uid=$Usu >> $DirectorioLog/$dia".log"
    # Inserta la fecha y hora final de montaje en el archivo .log
    echo " -----Fin Montando directorio-----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"

    # ***REALIZA COPIA DE LOS ARCHIVOS***
    # Inserta una línea en blanco en el archivo .log
    echo "" >> $DirectorioLog/$dia".log"
    # Inserta la fecha y hora de inicio de la copia en el archivo .log
    echo " -----Iniciando copia (archivos)-----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"
    # Elimina cualquier copia anterior con el mismo nombre
    rm -f $PuntoMontaje/$dia*
    # Agrupa y comprime el contenido del directorio /home/http
    tar -zcf $PuntoMontaje/$dia".tar.gz" $DirectorioCopiar
    # Inserta la fecha y hora final de la copia en el archivo .log
    echo " -----Final copia (archivos) -----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"

    # ***REALIZA COPIA DE LA BASE DE DATOS MYSQL***
    # Inserta una línea en blanco en el archivo .log
    echo "" >> $DirectorioLog/$dia".log"
    # Inserta la fecha y hora de inicio de la copia de la base de datos en el archivo .log
    echo " -----Iniciando copia (Base de Datos)-----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"
    # Copia todas las bases de datos en el archivo $dia.mysql.sql
    $DirectorioMySQL./mysqldump -u $UsuMySQL -p$PasMySQL --all-databases > $PuntoMontaje/$dia".mysql"
    # Comprime el archivo $dia.mysql.sql
    gzip $PuntoMontaje/$dia".mysql"
    # Inserta la fecha y hora final de la copia de la base de datos en el archivo .log
    echo " -----Final copia (Base de Datos) -----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"

    # ***DESMONTA EL DIRECTORIO COMPARTIDO***
    smbumount $PuntoMontaje

    # Si no se hubiera podido montar el directorio compartido, toda la copia se habría realizado en el directorio mnt, por lo que eliminamos su contenido una vez desmontado.
    rm -rf $PuntoMontaje/$dia*

    # Inserta una línea en blanco en el archivo .log
    echo "" >> $DirectorioLog/$dia".log"
    # Inserta la fecha y hora final de la copia de seguridad en el archivo .log
    echo "-----Fin-----"`date +%d/%m/%Y`" "`date +%H:%M:%S`"-----" >> $DirectorioLog/$dia".log"


    Descargar en formato PDF

    http://www.lawebdelprogramador.com