Провера Oracle алерт-лога путем ‘crontab’ скрипте

Овом скриптом можете проверавати на, рецимо, сваких сат времена стање алерт-лога – те уколико се појави нова ORA грешка или упозорење – да вам стигне на имејл. Наравно, ако вам је алерт-лог огроман (већи од рецимо 2GB), идеално би било да га архивирате (промена имена је сигурна опција) те да исти крене од нуле одмах после прве итерације (рецимо ALTER SYSTEM SWITCH LOGFILE).
Претпоставка је да сте Oracle инсталирали по упутству са овог линка (Oracle 12c, CentOS 7, single instance).

#!/bin/bash
#########################################################################################
# Opis: Skripta za ciklicnu proveru AlertLoga za novim ORA greskama i slanje na mail
# Autor: Kompjuteras.com, Slobodni ste da skriptu koristite/menjate kako vam srcu drago
#
# Crontab primer:
# 00  *  *  *  *  /root/skripte/AlertLogProvera.sh > /tmp/CrontabAlertLogProvera.log 2>&1
#
#########################################################################################
 
shopt -s expand_aliases           # Za slucaj da mailx ima varijable
source /home/oracle/.bash_profile # Da povuce Oracle varijable
 
########################### VARIJABLE ##################################
IME_SERVERA="MyServer - $( ip addr | grep 'state UP' -A2 | grep 'inet ' | tail -n1 | awk '{print $2}' | cut -f1 -d'/')"
ALERT_LOG_LOKACIJA="${ORACLE_BASE}/diag/rdbms/${ORACLE_UNQNAME}/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log"
ARHIVA_ORA_GRESAKA="/home/oracle/.AlertLogArhivaGresaka.log"
PRIVREMENI_LOG_ORA_GRESAKA="/tmp/AlertLogPrivremenaProvera.log"
MAIL_TO="mojmejl@mejadresa.com"
#########################################################################
 
# Provera da li postoje oracle varijable
if [ -z "${ORACLE_SID}" ]     ; then echo "Fali varijabla: ORACLE_SID.     Izlazim" ; exit 100 ; fi
if [ -z "${ORACLE_BASE}" ]    ; then echo "Fali varijabla: ORACLE_BASE.    Izlazim" ; exit 101 ; fi
if [ -z "${ORACLE_UNQNAME}" ] ; then echo "Fali varijabla: ORACLE_UNQNAME. Izlazim" ; exit 102 ; fi

# Postoji li alert log, odnosno - da li mu je dobra putanja

if [ ! -f ${ALERT_LOG_LOKACIJA} ] ; then 
	echo "Nema alert loga na lokaciji ${ALERT_LOG_LOKACIJA}. Proveri to. Izlazim"   ; exit 103 
fi
 
# Pretresi sve linije ali samo one koje POCINJU sa ORA-
touch ${ARHIVA_ORA_GRESAKA}
grep -n "^ORA-" ${ALERT_LOG_LOKACIJA} | grep -v "\[], \[], \[], \[], \[], \[], \[], \[], \[], \[], \[]" > ${PRIVREMENI_LOG_ORA_GRESAKA}

 
# Nadji zadnje linije iz logova i postavi na nule ako nema nikakvih logova
ZADNJA_LINIJA_IZ_ARHIVE="`tail -n1 ${ARHIVA_ORA_GRESAKA} | cut -d: -f1 2>/dev/null`"
ZADNJA_LINIJA_IZ_PRIVRE="`tail -n1 ${PRIVREMENI_LOG_ORA_GRESAKA} | cut -d: -f1 2>/dev/null`"
if [ -z ${ZADNJA_LINIJA_IZ_ARHIVE} ] ; then ZADNJA_LINIJA_IZ_ARHIVE=0 ; fi
if [ -z ${ZADNJA_LINIJA_IZ_PRIVRE} ] ; then ZADNJA_LINIJA_IZ_PRIVRE=0 ; fi
 
# Vizuelna provera za crontab log
date ; echo ZADNJA_LINIJA_IZ_ARHIVE=$ZADNJA_LINIJA_IZ_ARHIVE ; echo ZADNJA_LINIJA_IZ_PRIVRE=$ZADNJA_LINIJA_IZ_PRIVRE
 
# Obrada - ako se zadnje linije razlikuju
if [ "${ZADNJA_LINIJA_IZ_ARHIVE}" -ne "${ZADNJA_LINIJA_IZ_PRIVRE}" ] ; then
        if [ ${ZADNJA_LINIJA_IZ_ARHIVE} -eq 0 ] ; then
        cat ${PRIVREMENI_LOG_ORA_GRESAKA} >> ${ARHIVA_ORA_GRESAKA}
        tac ${PRIVREMENI_LOG_ORA_GRESAKA} | mail -s "${IME_SERVERA}: Pregled svih ora gresaka" ${MAIL_TO}
        exit 0
        fi
echo "Please check full log in ${ALERT_LOG_LOKACIJA}.
=====================================================
`grep -A900000 "${ZADNJA_LINIJA_IZ_ARHIVE}:" ${PRIVREMENI_LOG_ORA_GRESAKA} | grep -v "${ZADNJA_LINIJA_IZ_ARHIVE}:"`
=====================================================
" | mail -s "${IME_SERVERA}: Nova ORA u AlertLogu" ${MAIL_TO}
# ------- Apend nove greske u arhivu -----------
grep -A900000 "${ZADNJA_LINIJA_IZ_ARHIVE}:" ${PRIVREMENI_LOG_ORA_GRESAKA} | grep -v "${ZADNJA_LINIJA_IZ_ARHIVE}:" >> ${ARHIVA_ORA_GRESAKA}
fi
 
exit 0