OVH Community, your new community space.

Script para backup


Jove
17/03/2009, 16:34
Hola,

Muchas gracias, lo probaré.

Saludos

Power
06/03/2009, 16:31
¿Más ideas?
Hola,

Muy bien el script.
Gracias por compartirlo.

Yo utilizo rsync y rdiff-backup.
Así los backups sólo me ocupan el espacio de una copia completa + las diferencias habidas.

De esa forma tengo guardados backups completos de todos los días durante los últimos 3 meses.

Saludos

aremesal
06/03/2009, 11:26
Ya se que hay varios hilos sobre backups en el foro, pero acabo de modificar un script para hacer backups y pensé que quizá os pueda interesar a alguien.

Este script hace copia de todas las bases de datos y de los archivos de los directorios que le indiquemos. La copia la hace de tres formas:

- El día 1 del mes hace una copia completa.
- Cada domingo hace una copia completa, que se sobreescribe.
- Cada día hace una copia incremental, de lunes a sábado, que se sobreescriben cada semana.

En total, tendríamos un archivo por mes con un backup completo, un archivo con la copia completa de la última semana y uno más por cada día de la semana con los archivos cambiados ese día. Además, guarda un log con lo realizado en cada ejecución.

El script es:

Código PHP:
#!/bin/bash
# full and incremental backup script
# created 07 February 2000
# modified 06 March 2009
# Based on a script by Daniel O'Callaghan 
# and modified by Gerhard Mourani 
# and by Alvaro Remesal 

#Change the 5 variables below to fit your computer/backup

COMPUTER=r0000.ovh.net                         # name of this computer
DIRECTORIES="/home/admin/www /etc"              # directories to backup
BACKUPDIR=/home/admin/backups                   # where to store the backups
TIMEDIR=/home/admin/backups/last-full           # where to store time of full backup
TAR=/bin/tar                                # name and locaction of tar
BACKUPDBDIR=/home/admin/www/bbdd                # temporal para almacenar backup de bbdd
LOG=/home/admin/backup-$(date +%d%m%y).log      # archivo para el log

#You should not have to change anything below here

PATH=/usr/local/bin:/usr/bin:/bin
DOW
=`date +%a`                      # Day of the week e.g. Mon
DOM=`date +%d`                      # Date of the Month e.g. 27
DM=`date +%d%b`                 # Date and Month e.g. 27Sep

# On the 1st of the month a permanet full backup is made
# Every Sunday a full backup is made - overwriting last Sundays backup
# The rest of the time an incremental backup is made. Each incremental
# backup overwrites last weeks incremental backup of the same name.
#
# if NEWER = "", then tar backs up all files in the directories
# otherwise it backs up files newer than the NEWER date. NEWER
# gets it date from the file written every Sunday.

# If you'll execute for first time, you should create the timedate file
# To do this, just execute:
# date +%d%b < /home/admin/backups/last-full/myserver-full-date
# Where myserver = name of the computer

echo -"\nBackup iniciado: `date`" >> $LOG

# Databases backup
for bd in `mysqlshow -uUUUU -pPPPP | grep \| | grep -v Databases | sed -e s/\|//g` ; do
    
mysqldump -uUUUU -pPPPP --opt $bd $BACKUPDBDIR/$bd.sql
    
echo -"\nDump de $bdG>> $LOG
done


# Monthly full backup
if [ $DOM "01" ]; then
        NEWER
=""
        
echo -"\nIniciado mensual completo... " >> $LOG
        $TAR $NEWER 
-zcf $BACKUPDIR/$COMPUTER-$DM.tar.gz $DIRECTORIES
        
echo -"\nMensual completo terminado " >> $LOG
fi

# Weekly full backup
if [ $DOW "Sun" ]; then
        NEWER
=""
        
NOW=`date +%d-%b`

        echo -
"\nIniciado semanal completo... " >> $LOG
        
# Update full backup date
        
echo $NOW $TIMEDIR/$COMPUTER-full-date
        $TAR $NEWER 
-zcf $BACKUPDIR/$COMPUTER-$DOW.tar.gz $DIRECTORIES
        
echo -"\nFinalizado semanal completo" >> $LOG

# Make incremental backup - overwrite last weeks
else

        
# Get date of last full backup
        
echo -"\nIniciado incremental diario... " >> $LOG
        NEWER
="--newer `cat $TIMEDIR/$COMPUTER-full-date`"
        
$TAR $NEWER -zcf $BACKUPDIR/$COMPUTER-$DOW.tar.gz $DIRECTORIES
        
echo -"\nFinalizado incremental diario " >> $LOG
fi

echo -"\n   --- Backup finalizado ---   " >> $LOG 
Para usarlo, cread un nuevo archivo en vuestro home y copiad el script. Editadlo y cambiad los siguientes valores:

COMPUTER - nombre del servidor, por ejemplo, r0000.ovh.net. Se puede ver con la orden hostname
DIRECTORIES - directorios a copiar. Va entre comillas, y se pueden poner varios, por ejemplo: "/home/admin/web /home/admin/mail /etc"
BACKUPDIR - directorio donde se dejarán las copias de seguridad.
TIMEDIR - directorio donde se almacena el control de backups completos por fecha
TAR - ruta al comando tar (whereis tar)
BACKUPDBDIR - directorio temporal donde se almacenaran las copias de las bases de datos
LOG - archivo donde se escibirá el log, por ejemplo, /home/admin/backup-$(date +%d%m%y).log (esto creará un archivo de log nuevo cada día).

Además, debeis localizar en el fichero las líneas:

Código PHP:
for bd in `mysqlshow -uUUUU -pPPPP | grep \| | grep -v Databases | sed -e s/\|//g` ; do
    
mysqldump -uUUUU -pPPPP --opt $bd $BACKUPDBDIR/$bd.sql 
y cambiarlas poniendo el usuario y contraseña de BBDD adecuado, por ejemplo:

Código PHP:
for bd in `mysqlshow -uroot -pMiPass | grep \| | grep -v Databases | sed -e s/\|//g` ; do
    
mysqldump -uroot -pMiPass --opt $bd $BACKUPDBDIR/$bd.sql 
Una vez hecho esto, lo podeis programar para ejecución diaria. Para ello lo más cómo es copiarlo a /etc/cron.daily, y darle permisos de ejecución, así (suponiendo que el fichero se llama backup.sh):

$ sudo cp backup.sh /etc/cron.daily/backup.sh.cron
$ sudo chmod +x /etc/cron.daily/backup.sh.cron

De esta forma, el script se ejecutará todos los días a la hora programada (suele ser por defecto a las 3 de la madrugada, se puede cambiar en /etc/crontab).

Antes de la primera ejecución, es necesario crear el archivo con la fecha de la última copia completa (aunque aún no se haya hecho ninguna). Para ello:

$ date +%d%b > /home/admin/backups/last-full/myserver-full-date

Donde la ruta es la que hemos puesto en la variable TIMEDIR, y myserver-full-date es el nombre del equipo, por ejemplo: r0000.ovh.net-full-date.

Con estos pasos completados, ya tenemos un script que nos hace copia de seguridad de todo lo necesario, datos, configuraciones, bases de datos...

Ahora sólo quedaría guardar estas copias en un lugar seguro. Yo lo que hago es tener programado en mi PC de casa otro script que se ejecuta todos los días a primera hora de la mañana, que simplemente descarga el último archivo que hay de backup. Para ello tengo creado un usuario FTP con acceso de sólo lectura al directorio donde quedan la copias, y en mi PC ejecuto un script que, por medio de wget, descarga el archivo con la fecha de hoy. Pero este paso ya es algo que cada uno hace como mejor le resulte (descarga manual, usar el backup por FTP que ofrece OVH, enviar archivo descargado a un FTP externo...)

En cuanto a mejoras posibles:

- Añadir fechas y horas al log
- Enviar email indicando que se completó bien la copia
- Hacer archivo de logs rotativo
- ¿Más ideas?

Si localizais algún fallo, o teneis alguna sugerencia comentádmelo para que pueda ir mejorándolo.

¡Un saludo!