Copia de seguridad y restauración en Linux con rdiff-backup
Rdiff-backup hace una copia de seguridad de un directorio a otro, posiblemente a través de la red. El directorio destino termina siendo una copia del directorio origen. Sin embargo, se almacenan diffs inversos adicionales en un subdirectorio especial de ese directorio destino, de forma que aún puede recuperar ficheros perdidos hace tiempo.
La idea es combinar las mejores características de un mirror y una copia de seguridad incremental. rdiff-backup también preserva subdirectorios, enlaces duros, ficheros de dispositivo, permisos, propiedad uid/gid, fechas de modificación, atributos extendidos, acls y resource forks.
Además, rdiff-backup puede operar de forma eficiente en ancho de banda a través de una tubería, como rsync. Así, puede usar de forma segura rdiff-backup y ssh para hacer copia de seguridad de un disco duro a una ubicación remota, y solo se transmitirán las diferencias.
Debian y Ubuntu
Sección titulada «Debian y Ubuntu»Esta utilidad está incluida en el repositorio de software, así que para instalarla, simplemente ejecute como root:
$ apt-get install rdiff-backupCentOS y RedHat
Sección titulada «CentOS y RedHat»En este caso, la aplicación no está incluida en el repositorio de software por defecto, así que necesita usar el repositorio EPEL:
$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm$ yum update$ yum install rdiff-backupPreliminares
Sección titulada «Preliminares»En estos scripts se asumen los siguientes valores por defecto:
- El valor de $TOMCAT_HOME es “/home/openkm/tomcat-9.0.76”
- La base de datos de OpenKM se llama “okmdb.”
- El valor de la contraseña de la base de datos de OpenKM es “*secret*”.
- La ubicación del script de servicio de inicio y parada de OpenKM es “/etc/init.d/tomcat”
Script de ejemplo
Sección titulada «Script de ejemplo»El punto de montaje del disco USB puede definirse en /etc/fstab como:
/dev/sdb1 /mnt/backup ext4 defaults 0 0Estas son las secciones globales del script:
- Configuración de variables globales bajo la sección ## BEGIN CONFIG ##.
- Comprobación del usuario root bajo la sección # Check root.
- Eliminación de copias de seguridad de base de datos antiguas locales en la sección # Delete older local database backup.
- Montar el disco (sección opcional) bajo la sección # Mount disk.
- Detener la aplicación (sección opcional) bajo la sección # Stop tomcat.
- Limpiar logs (sección opcional) bajo la sección # Clean logs.
- Copia de seguridad de la base de datos al sistema de ficheros bajo la sección # Backup database.
- Copia de seguridad del repositorio y el volcado de la base de datos al destino bajo la sección # Backup and purge old backups.
- Iniciar la aplicación (sección opcional) bajo la sección # Start tomcat.
- Mostrar estadísticas (sección opcional) bajo la sección # Status.
- Desmontar el disco (sección opcional) bajo la sección # Umount disk.
Explicación de los parámetros de configuración:
| Parameter | Description |
|---|---|
| HOST | El nombre de host del servidor. |
| DATABASE_PASS | La contraseña de la base de datos. El usuario de base de datos que realiza la copia de seguridad siempre es el usuario root. |
| OPENKM_DB | El nombre de la base de datos de la aplicación. Normalmente se llamará “okmdb”. |
| OPENKM_HOME | La carpeta home de OpenKM. |
| TOMCAT_HOME | La carpeta home de Tomcat. Normalmente dentro de la carpeta OPENKM_HOME. |
| DATABASE_EXP | La carpeta del volcado de la base de datos. Normalmente en el mismo servidor. |
| BACKUP_DIR | Destino de la copia de seguridad. En el caso de un servidor remoto, el formato es user@server::/path/to/backup |
Cree un script de copia de seguridad /root/backup.sh
$ sudo su$ vim /root/backup.sh#!/bin/bash### BEGIN CONFIG ##HOST=$(uname -n)DATABASE_PASS="*secret*"OPENKM_DB="okmdb"OPENKM_HOME="/home/openkm"TOMCAT_HOME="$OPENKM_HOME/tomcat-9.0.76"DATABASE_EXP="$OPENKM_HOME/db"BACKUP_DIR="/mnt/backup"## END CONFIG ##
# Check root userif [ $(id -u) != 0 ]; then echo "You should run this script as root"; exit; fi
# Delete older local database backupecho -e "### BEGIN: $(date +"%x %X") ###\n"rm -rf $DATABASE_EXPmkdir -p $DATABASE_EXP
# Mount diskif mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR already mounted";else mount "$BACKUP_DIR"; if mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR mounted"; else echo "$BACKUP_DIR error mounting"; exit -1; fifi
# Stop Tomcat/etc/init.d/tomcat stop
# Clean logs#echo "Clean Tomcat temporal files."#rm -rf $TOMCAT_HOME/logs/*#rm -rf $TOMCAT_HOME/temp/*#rm -rf $TOMCAT_HOME/work/Catalina/localhost
# Backup databaseif [ -n "$DATABASE_PASS" ]; then echo "* Backuping MySQL data from $OPENKM_DB..." mysqldump -h localhost -u root -p$DATABASE_PASS $OPENKM_DB > $DATABASE_EXP/mysql_$OPENKM_DB.sql echo "-------------------------------------";fi
# Backup and purge old backupsrdiff-backup --remove-older-than 30B $BACKUP_DIR/$HOSTrdiff-backup -v 3 --print-statistics --include $OPENKM_HOME --exclude '**' / $BACKUP_DIR/$HOST
# Start Tomcat/etc/init.d/tomcat startecho -e "\n### END: $(date +"%x %X") ###"
# Statusecho "=================================";rdiff-backup --list-increment-sizes $BACKUP_DIR/$HOSTecho "*********************************";df -h | grep "$BACKUP_DIR"echo "=================================";
# Umount disksyncumount "$BACKUP_DIR"Aumentar el periodo de retención de la copia de seguridad
Sección titulada «Aumentar el periodo de retención de la copia de seguridad»Modifique la sección # Backup and purge old backups para aumentar el valor del parámetro:
--remove-older-than 90BRealizar una copia de seguridad remota
Sección titulada «Realizar una copia de seguridad remota»Modifique la sección # Backup and purge old backups.
# Backup and purge old backupsrdiff-backup --remove-older-than 30B backup@server::$BACKUP_DIR/$HOSTrdiff-backup -v 3 --print-statistics --include $FILES --exclude '**' / backup@server::$BACKUP_DIR/$HOSTRealizar una copia de seguridad remota a SMB o CIFS
Sección titulada «Realizar una copia de seguridad remota a SMB o CIFS»Modifique la sección # Mount disk.
# Mount diskif mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR already mounted";else echo "Mounting $BACKUP_DIR ..."; mount -t cifs //REMOTE_SERVER/REMOTE_DIR $BACKUP_DIR -o username=REMOTE_USER,password=REMOTE_PASSWORD,iocharset=utf8,file_mode=0777,dir_mode=0777 if mount | grep "$BACKUP_DIR type" > /dev/null; then echo "$BACKUP_DIR mounted"; else echo "Error mounting $BACKUP_DIR."; exit -1; fifiRealizar una copia de seguridad de PostgreSQL
Sección titulada «Realizar una copia de seguridad de PostgreSQL»Modifique la sección # Backup database.
# Backup de PostgreSQLecho "* Backuping PostgreSQL data from $OPENKM_DB..."su postgres -c "pg_dump $OPENKM_DB" > $DATABASE_EXP/pg_$OPENKM_DB.sql
# Databases optimizationssu postgres -c "vacuumdb -a -z" > /dev/nullsu postgres -c "reindexdb -a -q" 2> /dev/nullConfigurar crontab
Sección titulada «Configurar crontab»Para instalar la tarea cron, ejecute lo siguiente:
$ sudo mkdir /root/logs$ sudo crontab -eY añada estas líneas según su configuración:
MAILTO=nomail@openkm.com@daily /root/backup.sh | tee /root/logs/backup.$(date +\%Y.\%m.\%d_\%H.\%M.\%S).logRestaurar una copia de seguridad
Sección titulada «Restaurar una copia de seguridad»Puede listar las copias de seguridad disponibles:
$ rdiff-backup --list-increment-sizes /path/to/backupSun Sep 11 05:00:19 2012 4.25 GB 4.25 GB (current mirror)Sun Sep 4 00:00:18 2012 13.3 MB 4.26 GBSun Aug 28 00:00:13 2012 674 MB 4.92 GBSun Aug 21 00:00:14 2012 5.50 MB 4.93 GBSun Aug 14 00:00:16 2012 1.75 MB 4.93 GBSun Aug 7 00:00:12 2012 288 KB 4.93 GBSun Jul 31 00:00:13 2012 43.0 KB 4.93 GBFri Jul 29 10:36:39 2012 5.56 KB 4.93 GBDespués decida restaurar una de las copias de seguridad, por ejemplo, la realizada el Sun Aug 28 00:00:13 2012:
$ rdiff-backup --restore-as-of 2012-08-28 /path/to/backup /path/to/destinationO restaure la última copia de seguridad.
$ rdiff-backup --restore-as-of now /path/to/backup /path/to/destination