Admin Libre - Administración de sistemas y redes

Backups incrementales con dump y restore
Por Francisco Gaitán el 1 de Abril de 2022

Es importante mantener los datos a salvo de los desastres que puedan ocurrir, manteniendo varias copias en distintas localizaciones y, de forma ideal, en distintos tipos de soportes (discos magnéticos, soporte óptico, cinta, SSD, etc).

Las copias de seguridad (o backups) son una parte fundamental en entornos de producción. No basta con hacer backups sino que hay que verificarlos, ya que lo que realmente importa es poder restaurarlos satisfactoriamente cuando sea necesario.

En este artículo explicaré el funcionamiento básico de los backups incrementales usando las herramientas clásicas dump(8) y restore(8) de UNIX® usando el sistema operativo OpenBSD. No pretendo que sea una guía exhaustiva sobre backups sino más bien una introducción que para nada sustituye a leer las páginas de manual. Se da por hecho que me desentiendo completamente de problemas o pérdida de datos causados a raíz de seguir este artículo.

Dump y restore

Las herramientas clásicas de UNIX® para las copias de seguridad son dump(8), que crea la copia de seguridad, y restore(8) para recuperar los datos. No tienen funcionalidades modernas como snapshot pero están bien testeadas y forman parte del sistema base, lo cual va en la linea de mi forma de trabajar. Lo último que quiero en un programa de backups es llevarme sorpresas.

Lo primero que debemos hacer es ver las particiones que tenemos montadas ejecutando mount, y anotando las que queremos guardar. En mi caso salvo todas (excepto la b que es SWAP, la c que es el disco completo en OpenBSD y la d que es el directorio /tmp) para poder restaurar el sistema completo si es necesario.

$ mount
/dev/sd1a on / type ffs (local)
/dev/sd1k on /home type ffs (local, nodev, nosuid)
/dev/sd1d on /tmp type ffs (local, nodev, nosuid)
/dev/sd1f on /usr type ffs (local, nodev)
/dev/sd1g on /usr/X11R6 type ffs (local, nodev)
/dev/sd1h on /usr/local type ffs (local, nodev, wxallowed)
/dev/sd1j on /usr/obj type ffs (local, nodev, nosuid)
/dev/sd1i on /usr/src type ffs (local, nodev, nosuid)
/dev/sd1e on /var type ffs (local, nodev, nosuid)

Cómo volcar una partición

dump(8) nos permite volcar el contenido completo de un punto de montaje en cinta o en un fichero, con la opción de hacer el volcado a través de la red.

El ejemplo más simple sería volcar una partición a un fichero. Cabe destacar que debemos poner la r delante del nombre de nuestro dispositivo para que funcione en modo raw, y en este caso especificamos el nivel 0 que es un volcado completo. Después explicaré esto con más detalle.

# dump -0au -f backupfile /dev/rsd1a

Si todo va bien podremos leer el mensaje DUMP IS DONE y se creará una linea en el archivo /etc/dumpdates.

Cómo excluir directorios

Para excluir directorios puedes usar el flag nodump. Para más información lee chflags(1) y la opción -h en dump(8).

Cómo restaurar el backup

Como dije anteriormente, podemos usar restore tanto para extraer ficheros como para volcar la copia de seguridad en el sistema de archivos. Para esto último debemos desmontar la partición. De momento explicaré la forma más sencilla que es extraer ficheros de un volúmen:

# restore x -f backupfile
You have not read any tapes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume #: 1
set owner/mode for \'.\'? [yn] n

La opción x es para extraer y con -f especificamos el archivo backup. Con este simple comando extraeremos los archivos del backup realizado anteriormente en el directorio actual.

La página de manual indica que después de hacer un restore completo hay que hacer un dump de nivel 0, ya que al funcionar en modo usuario no tiene control sobre la distribución de inodos. Con el nuevo volcado los directorios reflejan la nueva numeración de inodos.

Volcado remoto con compresión

Lo primero es copiar la llave de nuestro usuario al usuario correspondiente del servidor de backups.

$ cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

Para comprobar que funciona hacemos ssh user@server y debe entrar automáticamente. A continuación reproduzco este sencillo script para hacer las copias de seguridad. Los volcados viajarán a través de la red de forma cifrada con OpenSSH, siendo comprimidos al vuelo con gzip.

#!/bin/sh
if [ "$#" -ne 1 ] ; then
   echo "Usage: $0 level" >&2
   exit 1
fi
echo "Dump level $1 running..."
dump -$1auf - /dev/rsd0a | gzip | ssh user@server dd of=/home/backup1/sd0a-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz
dump -$1auf - /dev/rsd0d | gzip | ssh user@server dd of=/home/backup1/sd0d-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz
dump -$1auf - /dev/rsd0e | gzip | ssh user@server dd of=/home/backup1/sd0e-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz
dump -$1auf - /dev/rsd0f | gzip | ssh user@server dd of=/home/backup1/sd0f-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz
dump -$1auf - /dev/rsd0g | gzip | ssh user@server dd of=/home/backup1/sd0g-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz
dump -$1auf - /dev/rsd0h | gzip | ssh user@server dd of=/home/backup1/sd0h-level$1-$(hostname -s)-$(date +%A%d%m%Y).gz

Restore remoto

Cómo funcionan los backups incrementales

Un backup incremental salva los archivos que cambiaron desde el anterior backup incremental. Con dump los niveles van del 0 al 9, de forma que el nivel 0 garantiza un volcado completo. Cualquier nivel por encima del 0 vuelca todos los archivos nuevos o modificados desde el último volcado de nivel más bajo.

Supongamos que vamos a hacer un backup diario a lo largo de la semana, empezando a contar en domingo. Podríamos seguir este esquema: 0 1 2 3 4 5 6. De esta forma, el domingo se haría un backup completo, el lunes (nivel 1) se salvarían solamente los archivos nuevos y los modificados desde el domingo; el martes (nivel 2) se salvarían solamente los archivos nuevos y modificados desde el lunes, y así hasta el sábado.

Ahora vamos a suponer que se rompe nuestro disco el viernes y queremos recuperar los datos del jueves. Tendríamos que restaurar, uno a uno y en orden creciente – indicando número de volumen 1 en cada restore – los backups 0, 1, 2, 3 y 4. Siguiendo este esquema, para restaurar los datos necesitaríamos de 1 hasta 7 restores.

Otro ejemplo: esquema 0 1 1 1 1 1 1. Si queremos restaurar el viernes recuperaríamos el primer volumen (0) y el sexto (1). Con este esquema necesitaríamos de 1 a 2 restores, aunque pagaríamos el precio de un mayor gasto de espacio en disco.

Esquema de rotación

Hago un backup diario, empezando en nivel 0 cada domingo. El esquema es el siguiente: 0 5 6 3 4 1 2. De esta forma salvo espacio y tiempo en caso de tener que restaurar datos. Si quiero restaurar los datos del miércoles, tendría que restaurar sucesivamente las copias 0 y 3. Si quiero restaurar los datos del jueves, retauraría las copias 0, 3 y 4, y así sucesivamente. De esta forma como máximo tengo que restaurar 3 backups.

Automatización

crontab

# mysqldump
0       5       *       *       *       /root/mysqlbackup.sh >/dev/null 2>&1
# backup at 4 AM
0       4       *       *       1       /root/backup.sh 5 >> /var/log/backup.log
0       4       *       *       2       /root/backup.sh 6 >> /var/log/backup.log
0       4       *       *       3       /root/backup.sh 3 >> /var/log/backup.log
0       4       *       *       4       /root/backup.sh 4 >> /var/log/backup.log
0       4       *       *       5       /root/backup.sh 1 >> /var/log/backup.log
0       4       *       *       6       /root/backup.sh 2 >> /var/log/backup.log
0       4       *       *       7       /root/backup.sh 0 >> /var/log/backup.log

Más información

Destacado

Contacto

Si has encontrado algún error o quieres comentarme algo mándame un correo a webmaster@adminlibre.org