Oracle Live

11/04/2016

Alert Monitor

Filed under: Scripts — mogukiller @ 6:40 pm
Tags:

En entornos RAC a menudo es necesario estar monitorizando la salida de los alert log de cada uno de los nodos.
Validado para entornos linux.

#!/bin/bash
#set -x
#------------------------------------------------------------------------
# Script: ALERT_Monitor.sh
#
# INFO:   Monitoriza el ALERT de todos los nodos de un RAC
# Parametros:	[-stop], Si hubiese procesos monitorizando los para
#          
# Fecha: 10/02/2013
# Autor: lmds
# Version: 2.0
#------------------------------------------------------------------------
# NOTAS VERSION: Se actualiza el script para 11g para que actualice el parametro diagnostic_dest
#
#------------------------------------------------------------------------

fec=`date +%Y%m%d_%H%M%S`
SEGUNDOS_MAX_EJECUCION=36000

ftmp=.monitor.tmp

##------------------------------------------------##
## Function: Procesa_instancias
## Procesa el fichero de instancias
##------------------------------------------------##
function Procesa_instancias {        
        ENTRADAS[0]=''

        while read linea; do
                        ENTRADAS[${#ENTRADAS[@]}]=$linea
        done < $ftmp
}

##------------------------------------------------##
## Function: Limpia_Procesos
## Para los procesos corriendo en background
##------------------------------------------------##
function Limpia_Procesos {
	for fichero in alert*.log; do
		/sbin/fuser $fichero >$ftmp
		if [ $? -eq 0 ]; then
			PID=`awk '{print $1}' $ftmp`
			kill -9 $PID
		fi
	done
	exit
}

##------------------------------------------------##
## Function: Tiempo_monitorizando
## Obtenemos el tiempo de monitorizacion
##------------------------------------------------##
function Tiempo_monitorizando {
	horas=$((SECONDS/3600))
	resto=$((SECONDS%3600))
	minutos=$((resto/60))
	segundos=$((resto%60))	
	echo "Horas: $horas Minutos: $minutos Segundos: $segundos"
}

##------------------------------------------------##
## MAIN
##------------------------------------------------##

trap Limpia_Procesos SIGINT SIGTERM

SQLPLUS=$ORACLE_HOME/bin/sqlplus; export SQLPLUS
USRPWD=" / AS SYSDBA"  export USRPWD

if [ $# -ne 0 ];then
                case ${1} in
                        "-stop") Stop_Monitor
                                 exit 0;;
                esac
fi

[ -z "${ORACLE_SID}" ] && echo "****** ERROR: ORACLE_SID NO DEFINIDO *******" &&  exit 1
[ -z "$(ps -fea | grep pmon_$ORACLE_SID | grep -v grep | awk '{print $8}')" ] && echo "****** ERROR: INSTANCIA NO LEVANTADA *******" && exit 1
[ `whoami` != 'oracle' ] && echo "****** ERROR: NO ERES ORACLE *******" &&  exit 1

# Comprobamos conexion con la DB
sqlplus -s / as sysdba <<[EOF] >/dev/null
	SELECT SYSDATE FROM DUAL;
[EOF]
[ "$?" -ne 0 ] && (echo "ERROR $DATABASE is not accesible" | tee -a $fich_log; exit 1)

# Obtenemos datos de las instancias
 
sqlplus -s / as sysdba <<[EOF] >$ftmp
	SET HEADING OFF
	SET LINES 200
	SELECT 'export alert_'||NAME||'='||VALUE||';' FROM V\$PARAMETER WHERE NAME IN ('cluster_database','cluster_database_instances');
[EOF]

. $ftmp

sqlplus -s / as sysdba <<[EOF] >$ftmp
	SET HEADING OFF FEEDBACK OFF ECHO OFF PAGESIZE 0 LINES 500	
	SELECT A.INST_ID||'|'||A.INSTANCE_NAME||'|'||A.HOST_NAME||'|'||TO_CHAR(A.STARTUP_TIME,'YYYY/MM/DD HH24:MI:SS')||'|'||B.VALUE FROM GV\$INSTANCE A, GV\$PARAMETER B
WHERE 
	A.INST_ID = B.INST_ID
	AND B.NAME = 'background_dump_dest'
ORDER BY 1;
[EOF]

Procesa_instancias

INSTANCIAS=`wc -l $ftmp | awk '{ print $1}'`

while [[ $SECONDS -lt $SEGUNDOS_MAX_EJECUCION ]]; do
	clear
	i=1
	Tiempo_monitorizando
	printf "\n%s %15s\n" "Instancias: $alert_cluster_database_instances" "Instancias activas : $INSTANCIAS"
	#printf "%s\n" "Path alert: $alert_background_dump_dest"
	header="----------------------------------------------------"
	printf "\n%-5s %-20s %-20s %-20s %-10s %-10s\n" "ID" "INSTANCIA" "HOST" "STARTUP" "SSH" "MONITOR"
	printf "%.5s %.20s %.20s %.20s %.10s %.10s\n" $header $header $header $header $header $header

while [[ $i -lt ${#ENTRADAS[@]} ]]; do
		
		INST_ID=`echo ${ENTRADAS[${i}]} | awk -F'|' '{ print $1 }'`
        INSTANCIA=`echo ${ENTRADAS[${i}]} | awk -F'|' '{ print $2 }'`
        HOST=`echo ${ENTRADAS[${i}]} | awk -F'|' '{ print $3 }'`
        START_TIME=`echo ${ENTRADAS[${i}]} | awk -F'|' '{ print $4 }'`
		alert_background_dump_dest=`echo ${ENTRADAS[${i}]} | awk -F'|' '{ print $5 }'`

        FICH_ALERT="${alert_background_dump_dest}/alert_${INSTANCIA}.log"
        FICH_ALERT_LOG="alert_${INSTANCIA}.log"		
		
        #Validamos la conexion por ssh
        if [ "$(ssh -q -q -o "BatchMode=yes" ${HOST} echo OK 2>&1)" == "OK" ]; then
				SSH="OK"
				MONITOR="OK"
				ssh ${HOST} ls -l ${FICH_ALERT} >/dev/null 2>&1

                if [ $? -ne 0 ]; then 
					MONITOR="NOK"
				else
					/sbin/fuser -s ${FICH_ALERT_LOG} 2>/dev/null
					[ $? -ne 0 ] && nohup ssh ${HOST} tail -f ${FICH_ALERT} >${FICH_ALERT_LOG} &
                fi
				
				printf "%-5s %-20s %-20s %-20s %-10s %-10s\n" ${INST_ID} ${INSTANCIA} ${HOST}  "${START_TIME}" ${SSH} ${MONITOR}			
				

        else
                printf "%-5s %-20s %-20s %-20s %-10s %-10s\n" ${INST_ID} ${INSTANCIA} ${HOST}  "${START_TIME}" "NOK" "NOK" 
        fi
 ((i += 1))
done
	
printf "\n\n ORAs Detectados:\n\n"
	for fichero in alert*.log; do
		printf "%s:\n\n" $fichero	
		awk 'BEGIN{buf=""}/[0-9]:[0-9][0-9]:[0-9]/{buf=$0}/ORA-/{printf ("%s %s\n",buf,$0) }' $fichero | tail -50
	done
	
	printf "\nMonitorizando ...\n"
	sleep 10
done
Limpia_Procesos

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: