Correo diario, semanal o mensual con resumen de los errores en el alert.log de Oracle

Como DBA, estar al tanto del alert log de Oracle es crucial para mantener la salud y el rendimiento de la base de datos. Sin embargo, revisar manualmente el alert puede ser tedioso y consumir tiempo valioso. Para simplificar esta tarea, he creado un script que genera un resumen diario de las alertas más importantes, directamente desde el alert log de Oracle.

Este script está diseñado para ser ejecutado de forma automática al final del día (mes, semana...). Lo que hace es revisar el alert log, identificar los mensajes más relevantes (como errores, advertencias y eventos críticos), y generar un informe resumido que se puede enviar por correo electrónico o revisar de manera local.

¿Cómo Funciona el Script?

  • Lectura del Alert Log: El script comienza leyendo el alert log de Oracle, que es donde se registran todos los eventos importantes, como errores y advertencias. Dependiendo de la configuración de tu sistema, este archivo puede crecer bastante, así que es importante extraer solo la información más relevante.

  • Filtrado de Eventos Importantes: Para evitar que te abrumes con información, el script filtra solo los eventos críticos, como errores ORA-xxxx, advertencias de espacio en tablas o problemas de conectividad. De esta forma, puedes enfocarte solo en lo que realmente importa.

  • Generación del Resumen: Una vez filtrada la información, el script compila un resumen con las alertas más importantes del día. Este resumen es fácil de leer y está diseñado para darte una visión clara y concisa de cualquier problema que haya surgido.

  • Notificación: Finalmente, el script te envía este resumen por correo electrónico o lo guarda en un archivo local, dependiendo de cómo prefieras recibir las alertas.

¿Por Qué Usar Este Script? Este script no solo te ahorra tiempo, sino que también te asegura que no se te pase por alto ninguna alerta importante. Al automatizar la tarea de monitoreo del alert log, puedes centrarte en otras áreas de la administración de bases de datos, sabiendo que estarás al tanto de cualquier evento crítico que necesite tu atención.

A tener en cuenta:

YESTERDAY=$(date -d "yesterday" '+%Y-%m-%d') <<--- Fecha inicial. Un día
YESTERDAY=$(date -d "1 month ago" '+%Y-%m-%d') <<--- Fecha inicial. Un mes
YESTERDAY=$(date -d "1 week ago" '+%Y-%m-%d') <<--- Fecha inicial. Una semana
etc...
# Patrones que queremos buscar separados por coma. No siempre tiene que se un ORA
ERROR_PATTERNS="Errors in file,highscn criteria not met for file"
#!/bin/bash

# Validar si se pasaron los parámetros necesarios
if [ "$#" -ne 2 ]; then
    echo "Uso: $0 <ruta_alert_log> <nombre_base_datos>"
    exit 1
fi

# Configuración de variables a partir de los parámetros
ORACLE_ALERT_LOG="$1"
DB_NAME="$2"
EMAIL_RECIPIENT="direccion@ejemplo.es"
YESTERDAY=$(date -d "yesterday" '+%Y-%m-%d')
TODAY=$(date '+%Y-%m-%d')

# Patrones de errores que se desean capturar, separados por comas
ERROR_PATTERNS="Errors in file,highscn criteria not met for file"

# Generar resumen de errores ORA y otros errores del rango de fechas
SUMMARY=$(awk -v start="$YESTERDAY" -v end="$TODAY" -v patterns="$ERROR_PATTERNS" '
    BEGIN {
        in_date_range = 0;
        header_printed = 0;
        split(patterns, pattern_arr, ",");
    }

    # Determinación del rango de fechas
    /^202[0-9]-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/ {
        current_date = substr($0, 1, 10);
        if (current_date >= start && current_date <= end) {
            in_date_range = 1;
        } else {
            in_date_range = 0;
        }
    }

    # Contar errores ORA- específicos
    in_date_range && /ORA-[0-9]{5}/ {
        match($0, /(ORA-[0-9]{5})/, arr);
        if (arr[1] != "") {
            errors[arr[1]]++;
        }
    }

    # Contar otros errores personalizados
    in_date_range {
        for (i in pattern_arr) {
            if (index($0, pattern_arr[i]) > 0) {
                errors[pattern_arr[i]]++;
            }
        }
    }

    END {
        # Mostrar conteo de errores
        if (length(errors) > 0) {
            printf "Resumen de errores del alert.log\n";
            printf "Fecha de inicio: %s\n", start;
            printf "Fecha de fin: %s\n", end;
            printf "\nErrores encontrados:\n";
            printf "%-40s %-10s\n", "Descripción de Error", "Conteo";
            printf "%s\n", str_repeat("-", 50);

            for (err in errors) {
                printf "%-40s %-10d\n", err, errors[err];
            }
        }
    }

    function str_repeat(str, num,    result) {
        result = "";
        while (num-- > 0) result = result str;
        return result;
    }
' "$ORACLE_ALERT_LOG")

# Enviar el correo solo si hay errores
if [ -n "$SUMMARY" ]; then
    echo -e "$SUMMARY" | mutt -s "[dba] Alert $DB_NAME Resumen de errores del día $YESTERDAY" "$EMAIL_RECIPIENT"
fi

Como usarlo? Te pongo un ejemplo en el cron para un nodo de un RAC...

# Errores alert mail diario
01 00 * * * /u01/scripts/admin/script_errores_alert.sh /u01/app/oracle/diag/rdbms/cdbxxx/cdbxxx1/trace/alert_xxxx.log CDBXXX1 >> /dev/null 2>&1

Y un ejemplo de salida en un mail

Resumen de errores del alert.log
Fecha de inicio: 2024-08-22
Fecha de fin: 2024-08-23

Errores encontrados:
Descripción de Error                     Conteo    
--------------------------------------------------
ORA-16058                                3         
Errors in file                           9         
ORA-12514                                3

Si te interesa optimizar el monitoreo de tu base de datos Oracle este script es una herramienta que no puede faltar.

Consejo: Revisa tus correos!!