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!