Oracle Technology Blog

OraTech Blog provides tips,tricks,scripts and how-to type answers for Oracle related technologies. I use these commands very often, so I thought it would be useful to share with everybody. Please feel free to include your comments/corrections/questions.

Tuesday, June 06, 2006

Oracle Alert log Monitoring Script

Purpose:

This script can be used to check any Oracle error ("ORA-") in alertlog files.
This script can be configures as cronjob, so that it will scan the alert log at particular interval. When the script runs, it remembers the line number of each alertlog, this way when it runs next time it starts from where it left off.


Step (1)
Prerequisite


#
#
mkdir -p /opt/oracle/scripts/dba/monitoring/logs


# To remember the line number of the last scan,
# each alertlog will have a separate registry file under loglines directory
mkdir -p /opt/oracle/scripts/dba/monitoring/loglines

create database list file ("/u11/misc/ActiveDBs.list") to loop through all the DB instances.


(i)Copy the following .cronprofile and alert_check.sh into /opt/oracle/scripts/dba/monitoring directory.
(ii) Change environment variables, Pager (PAGE_TO) and email (EMAIL_TO) address.

Step (2)
$ cat .cronprofile

ORACLE_BASE=/opt/oracle
ORACLE_HOME=/opt/oracle/product/9.2.0
ORACLE_SID=my_sid
NLS_LANG=AMERICAN_AMERICA.UTF8
PATH=./:${ORACLE_HOME}/bin:/usr/ccs/bin:/usr/bin:/usr/sbin:/usr/openwin/bin:/usr/local/bin:${HOME}:/usr/ucb:/sbin:/usr/lib/vxvm/bin:/usr/lib/fs/vxfs:/opt/VRTSvxfs/sbin:/opt/VRTSvcs/bin:/opt/VRTSvcs/ops/bin:/opt/VRTSob/bin:/opt/VRTS/bin
MANPATH=$MANPATH:./:/usr/opt/SUNWmd/man
SERVER=`uname -n`
LD_LIBRARY_PATH=${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib64:${ORACLE_HOME}/lib:${ORACLE_HOME}/jdbc/lib:/usr/openwin/lib:/usr/dt/lib:${ORACLE_HOME}/ctx/lib
#LD_LIBRARY_PATH=${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib64:${ORACLE_HOME}/lib:${ORACLE_HOME}/jdbc/lib:/usr/openwin/lib:/usr/dt/lib:${ORACLE_HOME}/ctx/lib:/opt/ORCLcluster/lib

LD_LIBRARY_PATH_64=${ORACLE_HOME}/lib:$LD_LIBRARY_PATH
ORA_OEMAGENT_DIR=/opt/oracle/agent
TCL_LIBRARY=${ORACLE_HOME}/network/agent/tcl
export NLS_LANG ORACLE_BASE ORACLE_HOME PATH MANPATH SERVER LD_LIBRARY_PATH LD_LIBRARY_PATH_64 ORA_OEMAGENT_DIR TCL_LIBRARY

umask 022

export SCRIPT_DIR=/opt/oracle/scripts/dba/monitoring
export PAGETO="1234567890@vtext.com"
export MAILTO="first_name.last_name@your_company.com"
export TEMP_DIR=/tmp
export LOG_DIR=/opt/oracle/scripts/dba/monitoring/logs
export LOGTO=${LOG_DIR}/alertlog_check.log


Step (3)
$ cat alert_check.sh

#!/usr/bin/ksh -x
. /opt/oracle/scripts/dba/monitoring/.cronprofile
for SID in $(cat /u11/misc/ActiveDBs.list)
do
#
# In RAC environment, ORACLE_SID=DB_NAME+INSTANCE_NUMBER.
# Here 1 indicates the instance number. For 2nd node it will be 2 and so on.
#
export ORACLE_SID=$SID'1'
export OSID=$ORACLE_SID
export ALERT_DIR=/opt/oracle/admin/${SID}/bdump
export ALERTFILE=${ALERT_DIR}/alert_${ORACLE_SID}.log
ADMIN2=""
PAGEFREQ=5
COUNT=0
cat $ALERTFILE >/tmp/alertlog_${OSID}.out
LOGFILE="/tmp/alertlog_${OSID}.out"
touch ${SCRIPT_DIR}/loglines/loglines.${ORACLE_SID}
LINECOUNT=`cat ${SCRIPT_DIR}/loglines/loglines.${ORACLE_SID}`
LINECOUNT=`expr $LINECOUNT + 1`
tail +$LINECOUNT $LOGFILE > ${SCRIPT_DIR}/tailfile
wc -l $LOGFILE | tr -s ' ' ' ' | cut -d' ' -f2 >${SCRIPT_DIR}/loglines/loglines.${ORACLE_SID}
GROUP=UNIX
ADMIN=$PAGETO

NUM=`date +'%S'`

SERVER=`uname -n`
ALERT=`egrep -i 'ORA-' ${SCRIPT_DIR}/tailfile`
if test -n "$ALERT"
then
egrep 'ORA-' ${SCRIPT_DIR}/tailfile | uniq >${SCRIPT_DIR}/mailfile
MFILE=${SCRIPT_DIR}/mailfile
if [[ -s ${SCRIPT_DIR}/alertlog_check.cnt ]]
then
COUNT=`cat ${SCRIPT_DIR}/alertlog_check.cnt`
COUNT=`expr $COUNT + 1`
MODVAL=`expr $COUNT % $PAGEFREQ`
if [ $MODVAL -eq 0 -o $COUNT -eq 2 -o $COUNT -eq 3 ]
then
MESG="Oracle alert on ${SERVER}:$OSID at `date +'%a
%m/%d %H:%M'`"
echo $MESG >> $LOGTO
# echo "MSG:" >${SCRIPT_DIR}/pagemsg.$NUM
# echo "TO: $GROUP" >>${SCRIPT_DIR}/pagemsg.$NUM
# echo "CONTENTS: ${SERVER}:$OSID `date +'%a %m/%d %H:%M'` $MESG" >>${SCRIPT_DIR}/pagemsg.$NUM
fi
echo $COUNT >${SCRIPT_DIR}/alertlog_check.cnt
else
COUNT=1
echo $COUNT >${SCRIPT_DIR}/alertlog_check.cnt
MESG="Oracle alert on ${SERVER}:$OSID at `date +'%a %m/%d %H:%M'`"
echo $MESG >> $LOGTO
# echo "MSG:" >${SCRIPT_DIR}/pagemsg.$NUM
# echo "TO: $GROUP" >>${SCRIPT_DIR}/pagemsg.$NUM
# echo "CONTENTS: ${SERVER}:$OSID `date +'%a %m/%d %H:%M'` $MESG" >>${SCRIPT_DIR}/pagemsg.$NUM
mailx -s "$MESG" $ADMIN <$MFILE
fi
else
if [[ -s ${SCRIPT_DIR}/alertlog_check.cnt ]]
then
rm ${SCRIPT_DIR}/alertlog_check.cnt
#/bin/rm pagemsg.*
fi
echo ""
fi
done

0 Comments:

Post a Comment

<< Home