Crear copias de seguridad incrementales con rsync

última modificación:

El problema de guardar una copia completa cada día es el espacio: si tenemos 10 GB de datos y hacemos copias durante 30 días, ocupamos 300 GB aunque los archivos apenas hayan cambiado. La opción --link-dest de rsync resuelve esto: crea una copia completa en apariencia pero solo almacena los archivos que han cambiado; el resto son enlaces físicos al día anterior.

La idea es mantener un directorio por fecha y pasar el del día anterior como referencia:

rsync -a --link-dest=/mnt/backup/2011-10-01 /var/www/ /mnt/backup/2011-10-02/

Los archivos sin cambios en 2011-10-02/ no ocupan espacio extra: son enlaces físicos al mismo inodo en 2011-10-01/. Solo los archivos nuevos o modificados se copian realmente.

En un script podemos automatizarlo calculando la fecha de hoy y la de ayer:

#!/bin/bash

HOY=$(date +%Y-%m-%d)
AYER=$(date -d "yesterday" +%Y-%m-%d)
DESTINO="/mnt/backup"

rsync -a --link-dest="$DESTINO/$AYER" /var/www/ "$DESTINO/$HOY/"

Si la copia del día anterior no existe (por ejemplo, la primera vez), rsync muestra un aviso (--link-dest arg does not exist) pero hace una copia completa igualmente.

Para borrar copias antiguas cuando el disco empiece a llenarse podemos usar du para identificar qué fechas ya no necesitamos y borrarlas con rm -rf. Aunque borremos un directorio, los archivos compartidos por enlaces físicos en otras fechas no se eliminan hasta que se borra el último enlace.