# Backup del OCR periódico a filesystem

Llevaba algún tiempo dándole vueltas a realizar un backup del OCR fuera de ASM en RAC “por lo que pueda pasar“ (alguna ya me he encontrado en mi vida como dba). En este caso lo realizamos a un volumen compartido por NFS.

Siempre tenemos que estar seguros con backup y más cuando tenemos presente un RAC.

¿Qué pasa si se corrompe el fichero o el disco? ¿Reconfiguramos perdiendo tiempo? ¿Garantizamos una recuperación rápida? “**Más agilidad más éxito**”

Encontré un blog muy interesante en la comunidad ACE de Marcus Vinicius Miguel Pedro, os dejo el Link:

[Shell Script to create copy of OCR Backup to a filesystem](https://www.viniciusdba.com.br/blog/2019/03/18/shell-script-to-create-copy-of-ocr-backup-to-a-filesystem/)

Despues de comentar con él (gracias [Vinicius](https://ace.oracle.com/apex/ace/profile/viniciusdba)!) y agradeciendo la aportación quise darle una vuelta añadiendo:

* Gestión de los históricos de backup (30 días)
    
* Generación de logs y gestión de sus históricos (30 días)
    
* Comunicación por email de los resultados de forma diaria
    

Y aquí lo teneis. Cargo las variables sin importar el HOME de la grid atendiendo al oratab ya que realizamos los parcheos Out of place (el home cambia) y no busco nunca mantener los scripts como un paso más.

Interesante, se planificará en el cron en ambos nodos, realizándolo solo desde el master. No hay que preocuparse que colisionen :)

```plaintext
cat /u01/xxxxxx/xxxxxx/backup_ocr.sh
#!/bin/bash
export PATH=$PATH:/usr/local/bin:/bin:/usr/bin

# Configuración de entorno Oracle
export ORAENV_ASK=NO
export ORACLE_SID=+ASM1
. oraenv

# Variables de configuración
export COPY_LOCATION=/backup/backup_ocr_XXX
export LOG_DIR=/u01/xxxxxx/xxxxxxx/logs
export MASTER_NODE=$(oclumon manage -get master | grep Master | awk '{print $3}' | cut -d "." -f1 | sed -e 's/\(.*\)/\U\1/')
export HOST=$(echo $HOSTNAME | cut -d "." -f1 | sed -e 's/\(.*\)/\U\1/')
EMAIL="xxxxxx@xxxxxxxx.xxxxx"
FECHA_LOG=$(date +'%Y%m%d_%H%M%S')
LOGFILE="$LOG_DIR/backup_ocr_$FECHA_LOG.log"

# Función para enviar correo
send_email() {
    local subject="$1"
    local message="$2"
    echo "$message" | mutt -s "$subject" "$EMAIL"
}

# Función para limpiar backups antiguos (más de 30 días)
clean_old_backups() {
    find "$COPY_LOCATION" -type f -name "ocr_backup_*" -mtime +30 -exec rm -f {} \;
}

# Función para limpiar logs antiguos (más de 30 días)
clean_old_logs() {
    find "$LOG_DIR" -type f -name "backup_ocr_*.log" -mtime +30 -exec rm -f {} \;
}

# Comprobar si estamos en el nodo maestro
if [ "$HOST" == "$MASTER_NODE" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] Iniciando backup del OCR" >> "$LOGFILE"

    OCR_BACKUP_DATE=$(ocrconfig -showbackup | awk '{print $2"_" $3}' | grep "/" | head -1 | sed -r 's/\///g' | sed -r 's/\://g')
    OCR_BACKUP=$(ocrconfig -showbackup | awk '{print $4}' | grep "+" | head -1)

    # Realizar el backup
    if ocrconfig -copy "$OCR_BACKUP" "$COPY_LOCATION/ocr_backup_$OCR_BACKUP_DATE"; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backup completado exitosamente en $COPY_LOCATION/ocr_backup_$OCR_BACKUP_DATE" >> "$LOGFILE"

        # Limpiar backups antiguos
        clean_old_backups
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backups antiguos eliminados" >> "$LOGFILE"

        # Limpiar logs antiguos
        clean_old_logs
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] Logs antiguos eliminados" >> "$LOGFILE"

        # Enviar correo OK
        message="Backup guardado en: $COPY_LOCATION/ocr_backup_$OCR_BACKUP_DATE"
        send_email "Backup OCR exitoso" "$message"
    else
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] Error al realizar el backup del OCR" >> "$LOGFILE"

        # Enviar correo de fallo
        message="Error al realizar el backup del OCR. Por favor, revisa los logs para más detalles $LOGFILE."
        send_email "Backup OCR fallido" "$message"
    fi
else
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] Nodo actual no es el nodo maestro, no se realizará backup" >> "$LOGFILE"
    exit
fi
```

Recuerda planificarlo en el cron en ambos nodos

```plaintext
[root@rac-xxx-001 ~]# crontab -l
#backup OCR
0 1 * * * /u01/xxxxxxx/xxxxx/backup_ocr.sh >> /dev/null 2>&1
```

Un salvavidas que nunca está de más porque puede ser necesario cuando menos te lo esperes… :)
