Backup automatico de archivos y Base de datos en Ubuntu Server

Este script nos permite realizar backup diarios de nuestros archivos y bases de datos en ubuntu server o distros similares , comprimiendo las copias de los archivos

Empezamos con el backup!

Lo primera que tenemos que haces es crear la carpeta backup dentro del home, y dentro de esta carpeta , creamos las carpetas log  y bd , tener en cuenta reemplazar la carpeta user por la de tu usuario  

mkdir /home/user/backup
mkidr /home/user/backup/log
mkidr /home/user/backup/bd

una vez creadas la carpetas , pasamos a crear la carpeta que va a contener el script y abrimos un vim con el archivo backup.sh

mkdir /home/user/app
cd /home/user/app
vim backup.sh

Una vez abierto el archivo backup.sh en vim ( puede ser cualquier otro editor ej nano ) pegamos el siguiente codigo ( esc + :wq para salir de vim )

#!/bin/bash
# Proposito - Backup de archivos y base de datos
# Autor: Pablo Papes
#START

# Folders and files

TIME=`date +"%d-%m-%y"`
FILENAME="backup-$TIME.tar.gz"
LOGDIR="/home/user/backup/log"
LOGFILE="LOG-$TIME"
MYSQLFILE="BD-$TIME.sql"
SRCDIR="/home/carpeta_archivos_a_backupear"
DESDIR="/home/user/backup"
MYSQLBACKUPDIR="/home/user/backup/bd"

# Delete old backups
find $DESDIR -mtime +7 -exec rm -Rf -- {} \;
find $MYSQLBACKUPDIR -mtime +7 -exec rm -Rf -- {} \;

# Begin Backup Process
tar -cvpzf $DESDIR/$FILENAME $SRCDIR >> $LOGDIR/$LOGFILE >> /dev/null 2>&1
mysqldump -u mysql_user -pmi_pass_sql --all-databases --routines > $MYSQLBACKUPDIR/$MYSQLFILE

Perfecto! ya tenemos nuestro script de backup!

Analizando el script

La primera linea de código lo que hacemos es crear una variable TIME que usaremos para nombrar a los archivos de backup

TIME=`date +"%d-%m-%y"`

Estas lineas nos permite identificar en variables cada una de las carpetas y archivos que vamos a usar en el backup, la variable SRCDIR es la carpeta de la cual se va a realizar el backup , DESDIR y MYSQLBACKUPDIR son las carpetas donde se van a guardar los backups , LOGDIR y LOGFILE son el directorio y el archivo donde se va a guardar el LOG del backup

FILENAME="backup-$TIME.tar.gz"
LOGDIR="/home/user/backup/log"
LOGFILE="LOG-$TIME"
MYSQLFILE="BD-$TIME.sql"
SRCDIR="/home/carpeta_archivos"
DESDIR="/home/user/backup"
MYSQLBACKUPDIR="/home/user/backup/bd"

Con estas lineas borramos backups que tengan mas de 7 días en nuestro sistema ( si ponemos +x borraremos a x días, donde x son los dias a borrar ej: +10 borramos a 10 dias)

# Delete old backups
find $DESDIR -mtime +7 -exec rm -Rf -- {} \;
find $MYSQLBACKUPDIR -mtime +7 -exec rm -Rf -- {} \;

Y ahora si la magia! la primer linea hace un backup completo del directorio que colocamos en la variable SRCDIR , y devuelve al LOGFILE el resultado ( el >> /dev/null 2>&1 es para enviar la salida en el cronjob ).

La segunda linea realiza una copia de seguridad completa de Mysql con el comando mysqldump donde -u colocamos nuestro usuario de mysql , y en -p (bien pegado, no es un error) colocamos nuestra pass , la opción –routines realiza  también una copia de seguridad de stored procedures y functions que existan en la DB

# Begin Backup Process
tar -cvpzf $DESDIR/$FILENAME $SRCDIR >> $LOGDIR/$LOGFILE >> /dev/null 2>&1
mysqldump -u mysql_user -pmi_pass_sql --all-databases --routines > $MYSQLBACKUPDIR/$MYSQLFILE

lo ultimo es añadir el script a un cronjob , para eso ejecutamos SUDO CRONTAB -e y añadimos la siguiente linea ( va a correr todos los dias a las 4 AM )

0 4 * * * /home/user/app/backup.sh

Guardamos y listo! ya tenemos nuestro copia de seguridad diaria!