Provera Oracle alert-loga putem ‘crontab’ skripte

Ovom skriptom možete proveravati na, recimo, svakih sat vremena stanje alert-loga – te ukoliko se pojavi nova ORA greška ili upozorenje – da vam stigne na imejl. Naravno, ako vam je alert-log ogroman (veći od recimo 2GB), idealno bi bilo da ga arhivirate (promena imena je sigurna opcija) te da isti krene od nule odmah posle prve iteracije (recimo ALTER SYSTEM SWITCH LOGFILE).
Pretpostavka je da ste Oracle instalirali po uputstvu sa ovog linka (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