Copia de seguridad y restauración en Linux con rsync
rsync es una aplicación de software y un protocolo de red para sistemas Unix, Linux y Windows que sincroniza ficheros y directorios de una ubicación a otra minimizando la transferencia de datos mediante codificación delta cuando corresponde. Una característica importante de rsync que no se encuentra en programas/protocolos similares es que la duplicación se realiza con una sola transmisión en cada dirección. rsync puede copiar o mostrar el contenido de directorios y copiar ficheros, opcionalmente usando compresión y recursividad.
Preliminares
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”.
- 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 del volcado de base de datos anterior bajo la sección # Delete older local database backup.
- Montaje del disco (sección opcional) bajo la sección # Mount disk.
- Detención de la aplicación (sección opcional) bajo la sección # Stop tomcat.
- Limpieza de 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 base de datos al destino bajo la sección # Create backup.
- Inicio de la aplicación (sección opcional) bajo la sección # Start tomcat.
- Desmontaje del disco (sección opcional) bajo la sección # Umount disk.
Explicación de los parámetros de configuración:
| Parámetro | Descripción |
|---|---|
| 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. Habitualmente se llama “okmdb”. |
| OPENKM_HOME | La carpeta home de OpenKM. |
| TOMCAT_HOME | La carpeta home de Tomcat. Habitualmente dentro de la carpeta OPENKM_HOME. |
| DATABASE_EXP | La carpeta del volcado de base de datos. Habitualmente en el mismo servidor. |
| BACKUP_DIR | Destino de la copia de seguridad. |
| RSYNC_OPTS | Parámetros de rsync. |
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"RSYNC_OPTS="-apzhR --stats --delete --exclude=*~ --delete-excluded"## 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
# Create backuprsync $RSYNC_OPTS $OPENKM_HOME $BACKUP_DIR/$HOST
# Start Tomcat/etc/init.d/tomcat startecho -e "\n### END: $(date +"%x %X") ###"
# Umount disksyncumount "$BACKUP_DIR"Copia de seguridad con rotación
Sección titulada «Copia de seguridad con rotación»Modifique la sección # Create backup.
# Create backup# Calculate snapshotLAST_SNAPSHOT=`ls -ltr $BACKUP_DIR | tail -1 | awk {'print $8'} | cut -d . -f 2`NEW_SNAPSHOT=$((LAST_SNAPSHOT+1))
rsync $RSYNC_OPTS --link-dest="$BACKUP_DIR/$HOST/backup.$LAST_SNAPSHOT" $FILES "$BACKUP_DIR/$HOST/backup.$NEW_SNAPSHOT"Copia de seguridad remota
Sección titulada «Copia de seguridad remota»Modifique la sección ## BEGIN CONFIG ##.
BACKUP_SRV="user@server.com"Modifique la sección # Create backup.
# Create backup# Create missing backup folder ( optional )ssh $BACKUP_SRV "mkdir -p $BACKUP_DIR"
# Calculate snapshotNEW_SNAPSHOT=$(date "+%Y-%m-%dT%H:%M:%S")LAST_SNAPSHOT=$(ssh $BACKUP_SRV ls -tr $BACKUP_DIR/$HOST | tail -1)
if [ $LAST_SNAPSHOT ]; then echo "Incremental backup $NEW_SNAPSHOT based on $LAST_SNAPSHOT... " rsync $RSYNC_OPTS --link-dest="$BACKUP_DIR/$HOST/$LAST_SNAPSHOT" "$OPENKM_HOME" "$BACKUP_SRV:$BACKUP_DIR/$HOST/$NEW_SNAPSHOT"else echo "Initial full backup $NEW_SNAPSHOT..." rsync $RSYNC_OPTS "$OPENKM_HOME" "$BACKUP_SRV:$BACKUP_DIR/$HOST/$NEW_SNAPSHOT"fiCopia de seguridad incremental con backup-dir
Sección titulada «Copia de seguridad incremental con backup-dir»Modifique la sección ## BEGIN CONFIG ##.
RSYNC_OPTS="-ahR --partial --stats --delete --exclude=*~ --exclude=tomcat-9.0.76/temp/* --exclude=tomcat-9.0.76/work/* --exclude=tomcat-9.0.76/logs/* --delete-excluded"Modifique la sección # Create backup.
# Create backupNEW_SNAPSHOT=`date +%Y-%m-%d`echo -e "\n### RSYNC - BEGIN : $(date +"%x %X") ###\n"echo "* New Snapshot: $NEW_SNAPSHOT"rsync $RSYNC_OPTS --backup --backup-dir="$BACKUP_DIR/$HOST/INCREMENTAL/$NEW_SNAPSHOT" $OPENKM_HOME/ "$BACKUP_DIR/$HOST/LAST_BACKUP"Copia de seguridad incremental con link-dest
Sección titulada «Copia de seguridad incremental con link-dest»Modifique la sección ## BEGIN CONFIG ##.
RSYNC_OPTS="-ahR --partial --stats --delete --exclude=*~ --exclude=tomcat-9.0.76/temp/* --exclude=tomcat-9.0.76/work/* --exclude=tomcat-9.0.76/logs/* --delete-exclude"Modifique la sección # Create backup.
# Create backup# Calculate snapshotLAST_SNAPSHOT=`ssh $BACKUP_SRV "cd $BACKUP_DIR && stat --format='%n' * | tail -1"`NEW_SNAPSHOT=`date +%Y-%m-%d`echo -e "\n### RSYNC - BEGIN : $(date +"%x %X") ###\n"echo "* Last Snapshot: $LAST_SNAPSHOT"echo "* New Snapshot: $NEW_SNAPSHOT"
if [ ! $LAST_SNAPSHOT ]; then rsync $RSYNC_OPTS $OPENKM_HOME/ "$BACKUP_DIR/$HOST/$NEW_SNAPSHOT"else rsync $RSYNC_OPTS --link-dest="$BACKUP_DIR/$HOST/$LAST_SNAPSHOT" $OPENKM_HOME/ "$BACKUP_DIR/$HOST/$NEW_SNAPSHOT"fiCopia de seguridad remota a SMB o CIFS
Sección titulada «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; fifiCopia de seguridad de PostgreSQL
Sección titulada «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 de cron, ejecute:
$ sudo mkdir /root/logs$ sudo crontab -eY añada estas líneas según su configuración personal:
MAILTO=nomail@openkm.com@daily /root/backup.sh | tee /root/logs/backup.$(date +\%Y.\%m.\%d_\%H.\%M.\%S).logRsync y FTP
Sección titulada «Rsync y FTP»rsync necesita acceso SSH para funcionar, pero también puede usarlo con un servidor FTP si lo monta localmente con curlftpfs:
Instale curlftpfs y rsync:
$ sudo apt-get install curlftpfs rsyncCree el punto de montaje:
$ mkdir /path/to/mountMonte el directorio remoto:
$ curlftpfs ftp.example.com /path/to/mountCree el directorio local:
$ mkdir /local/pathSincronice el directorio montado con el directorio local:
$ rsync -r -t -v --progress --bwlimit=500 /path/to/mount/ /local/path/Restaurar la copia de seguridad
Sección titulada «Restaurar la copia de seguridad»Puede listar las copias de seguridad disponibles:
$ ls -ld /path/to/backup/*drwxr-xr-x 4 root root 4096 sep 11 05:00:19 2012 2012-09-11T05:00:19drwxr-xr-x 4 root root 4096 sep 4 00:00:18 2012 2012-09-04T00:00:18drwxr-xr-x 4 root root 4096 aug 28 00:00:13 2012 2012-08-28T00:00:13drwxr-xr-x 4 root root 4096 aug 21 00:00:14 2012 2012-08-21T00:00:14drwxr-xr-x 4 root root 4096 aug 14 00:00:16 2012 2012-08-14T00:00:16drwxr-xr-x 4 root root 4096 aug 7 00:00:12 2012 2012-08-07T00:00:12drwxr-xr-x 4 root root 4096 jul 31 00:00:13 2012 2012-07-31T00:00:13drwxr-xr-x 4 root root 4096 jul 29 10:36:39 2012 2012-07-29T10:36:39Luego decida restaurar alguna de las copias de seguridad; por ejemplo, la realizada el Sun Aug 28 00:00:13 2012:
$ cp /path/to/backup/2012-08-28T00:00:13 /path/to/destination