Monitorizando el alert con adrci

Hoy vamos a ver un pequeño script que puede ser muy útil para la monitorizacion.
Vamos a llamar a adrci indicándole que nos muestre los errores del alert desde la última vez que se ejecuto.
Para ello vamos a usar el comando show alert -p , marcándole como rango temporal a buscar la diferencia entre esta ejecución y a anterior.

#!/bin/bash
#
# Script que monitoriza el alert.log de una instancia desde la ultima vez que se ejecutó
# Si esta ultima ejecucion es menor de 5 minutos ejecuta los ultimos 5 minutos
#
#
# Si no guarda diene la guarda de ultima ejecucion sale con un ERROR
#
#  Asuminos timestamp'2015-02-18 00:07:49.767000 +01:00'
#

# Salida de debug
DEBUG=0

 #Comprobamos que se ha llamado de manera correcta
if  [ $# -ne 1 ]; then
echo "Uso adrci_alert  SID"
exit 3;
fi



# Inicializamos valores para el script
export ORAENV_ASK=NO
export TEMPORAL=/var/tmp/temporal_salida_alert_$$.log
export SALIDA=/var/tmp/salida_salida_alert_$$.log
export SID=$1
export GUARDA=/var/tmp/guarda_alert_${SID}.txt
DIA=`date +%Y-%m-%d`
HORA=`date +%H:%M:%S`
export AHORA="${DIA} ${HORA}.0000000 +01:00"
. oraenv  1>/dev/null



## Comenzamos la ejecucion
if [ $DEBUG -eq 1 ]; then
        echo "DEBUG: ORACLE_BASE=$ORACLE_BASE"
        echo "DEBUG: GUARDA= ${GUARDA}"
        echo "DEBUG: SALIDA= ${SALIDA} "
        echo "DEBUG: ORACLE_SID=$SID"
        echo "DEBUG: AHORA=$AHORA"
fi


# Buscamos ultima iteracion
if [ ! -f  $GUARDA ]; then
        echo "No tenemos ejecucion anterior"
        echo $AHORA > ${GUARDA}
        exit 1;
fi

#  Obtenemos el timestamp de la ultima ejecucion
TIEMPO=`cat ${GUARDA}`

# COmprobamos que han pasado mas de 5 minutos
OLD=`cat ${GUARDA}|awk '{print($1,$2)}'`
NOW="${DIA} ${HORA}.0000000"
SEGOLD=$(date -u -d "$OLD" +"%s")
SEGNOW=$(date -u -d "$NOW" +"%s")
DIFERENCIA=$((SEGNOW-SEGOLD))

# Comenzamos las iteraciones
adrci_homes=( $(adrci exec="show homes" | grep -e rdbms |grep ${SID}))
  for adrci_home in ${adrci_homes[@]}
    do
  #Generamos el fichero de comandos
   echo "SET TERMOUT OFF" > ${TEMPORAL}
   echo "SET ECHO OFF" >> ${TEMPORAL}
   echo "set home ${adrci_home} ;" >> ${TEMPORAL}
   echo "spool ${SALIDA} append " >>${TEMPORAL}
   echo "show alert -p \"message_text like '%ORA-%' and originating_timestamp >= \'${TIEMPO}\' \" -term " >>${TEMPORAL}
   echo "exit; " >> ${TEMPORAL}
     if [ $DEBUG -eq 1 ]; then
       echo "DEBUG: "
       echo "DEBUG:  adrci SCRIPT=${TEMPORAL}"
       echo "DEBUG: EL etemporal es "
       echo "DEBUG: -inicio temporal-"
       cat ${TEMPORAL}
       echo "DEBUG: -fin temporal-"
      fi
   adrci  SCRIPT=${TEMPORAL}   1>/dev/null
   tail -n+4 ${SALIDA}
   rm ${TEMPORAL}
done

#Actualizamos la guarda solamente si hace menos de 5 minutos que lo hemos ejecutado
if [ "$DIFERENCIA" -gt  299 ]; then
        echo $AHORA > ${GUARDA}
fi

## Añadir aqui la integración con monitorizacion

##Borramos la salida 
rm ${SALIDA}
#Salimos correctamente
exit 0 ;

A partir de aqui, solamente tenemos que integrar el tratamiento del fichero $SALIDA que es donde tendremos los errores del alert

Arquitectura CRS en 11gR2 II el CRSD

Vamos a seguir viendo la arquitectura del CRSD en la version 11gr2
Primero vamos a recordar la arquitectura del sistema
crs11g

CRSD

El Cluster Ready Services Daemon va a ser el responsable de gestionar los recursos de aplicación del cluster, esto es las bases de datos,y el resto de elementos y aplicaciones. Esta información la sacará el OCR (Oracle cluster registry )

Podemos dividir estos procesos que gestiona en dos grandes grupos:

CRSD oraagent

El CRSD oraagent administra (start/stop/check/clean) varios recursos como son bases de datos, instancias,servicios,diskgroups,node listeners,SCAN listeners…
Podemos tener mas de un oraagent (en la imagen tenemos uno para el grid y otro para la base de datos), esto sucede cuando hay mas de un propietario de la instalacin ( por ejemplo en grid y el de la base de datos)

CRSD orarootagent

CRSD orarootagent es el que se encarga de gestionar (start/stop/check/clean) Elementos como el GNS, las VIPs y los recursos de red.

Arquitectura CRS en 11gR2 I

En la version 11gR2 del RAC la arquitectura del Cluster ready services ha cambiado considerablemente.
En estas dos imágenes, podemos ver el arbol de procesos en la version 10g-11gr1 y la 11gR2

Procesos en la 10g y 11gR1
CRS10g

Procesos en la 10g y 11gR2
crs11g

Como podemos ver el arbol de procesos se ha dividido en dos ramas bien diferenciadas, el OAHSD que manejará los procesos de bajo nivel, y el CRSD que seguirá manejando estos procesos de alto nivel.

[table width=»650″ colwidth=»200|300|150″ colalign=»left|left|left»]
Elemento,Proceso ,Dueño
Oracle High Availability Service, ohasd ,init root
Cluster Ready Service (CRS), Cluster Ready Services, root
Cluster Synchronization Service (CSS), ocssd cssd monitor cssdagent ,grid owner
Event Manager (EVM), evmd evmlogger, grid owner
Cluster Time Synchronization Service (CTSS), octssd, root
Oracle Notification Service (ONS), ons eons, grid owner
Oracle Agent, oragent, grid owner
Oracle Root Agent, orarootagent, root
Grid Naming Service (GNS), gnsd, root
Grid Plug and Play (GPnP), gpnpd ,grid owner
Multicast domain name service (mDNS), mdnsd, grid owner
[/table]
Echemos un vistazo a estos daemons:

OAHASD

Es el primer proceso de todos, este es el que busca en el /etc/oracle/scls_scr/hostname
Además de usar este fichero (no es texto plano) también va a utilizar el directorio de /var/tmp/.oracle para conexiones named pipe
Wste demonio se arranca automáticamente desde el inittab y está respawneado, pero también puede hacerse desde

/etc/init.d/ini.oahsd run

El arranque y la parada será con

crscrl start crs 

crscrl stop crs

En caso de querer deshabilitar manualmente este arranque podemos hacerlo con

crsctl disable crs

crsctl enable crs

Vamos a verlos por ramas:

OAHSD oraagent

Es el agente que administra /start/stop los procesos :
[table width=»650″ colwidth=»100|550″ colalign=»left|left»]
Proceso , Funcionalidad
ora.asm,• El ASM deberá de star levantado para que el CSRD pueda acceder a la información contenida dentro\, esto es levantado desde aquí para que esté disponible
ora.emvd,•Es el Event Monitor Daemon y se encarga de publicar y suscribir los eventos del nodo ( como puede ser «database down».
ora.mdnsd,•Multicast Domain Name Services\, es usado en el PNP\, así como para res`pmder al DNS peticiones del Grid Naming Service Daemon (GNSD)
ora.GPNPD,• Grid Plug and Play Daemon \, otro de los nuevos del 11R2 que se usa par ala sincronizacion del GPnP profile entre los nodos.
ora.GPNPD,• Encargado del nuevo protocolo de intercomuicacion del grid Grid IPC
[/table]

Parametrizacion del kernel en linux: swappiness

Hoy vamos a ver una parámetro poco documentado de la relaccion entre Linux y Oracle.
Cuando miramos las recomendaciones de Oracle para el kernel a la hora de instalarlo en un sistema operativo Linux nos encontramos con:
Configuring Kernel Parameters and Resource Limits

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586

Pero no hay ni rastro de este parámetro swappiness al que hago referencia. Si miramos en la wikipedia nos indica que :

Swappiness es una propiedad del Núcleo Linux que permite establecer un balance entre el uso del Espacio de intercambio (swap en inglés, por eso el nombre de la propiedad) y la Memoria de acceso aleatorio (RAM).
El swappiness puede tomar valores desde el 0 hasta el 100. Si se establece 0 el núcleo intentará no hacer intercambio, mientras que si se establece 100 el sistema intentará mantener la Memoria de acceso aleatorio lo más libre posible haciendo intercambio.

Este valor está configurado por defecto en las distribuciones Linux a 60 ,y como os decía no encontramos apenas referencias a el en la documentación de Oracle.Pero ¿que significa este valor del swappines a 60?

Significa que, cuando lleguemos al uso de ese 60% de memoria el proceso kswapd se lanzará a hacer su trabajo, haciendo que el rendimiento de nuestra base de datos caíga en picado por el uso de recursos del sistema del proceso kswapd.

¿Que hacer si esto ocurre?

La solucion pasa por modificar este parámetro para que el kswapd no empiece hasta un 10% de memoria libre.

echo vm.swappiness=10 >> /etc/sysctl.conf
sysctl -p

Como os comentaba, esta opcion del kernel de linux está muy poco documentada por parte de Oracle, yo solamente he encontrado referencias a ella en:

Obtener informacion del alert

Hoy vamos a ver una entrada muy rápida sobre alguna información albergada en el alert.log

Como hemos hablado en alguna entrada anterior , las versiones 11 y 12 de Oracle disponen de una vista con la información del alert.log, ¿de que nos sirve esto?
Pues puede sernos muy útil para obtener mediante consultas SQL algunos patrones, por ejemplo

Veces que se ha hecho un ALTER en lo que llevamos de año

select    
 ORIGINATING_TIMESTAMP,
 MESSAGE_TEXT
    from sys.x$dbgalertext
where  ORIGINATING_TIMESTAMP >
      TO_TIMESTAMP('01-01-14 00:00:00','DD-MM-RR HH24:MI:SS')
 and ( MESSAGE_TEXT like 'ALTER%')

Podemos filtrar mucho mas, por ejemplo , quitando las opciones de rman
Veces que se ha hecho un ALTER en lo que llevamos de año quitando el rman

 
 select    
   ORIGINATING_TIMESTAMP,
   MESSAGE_TEXT
     from sys.x$dbgalertext
   where  ORIGINATING_TIMESTAMP >
      TO_TIMESTAMP('01-01-14 00:00:00','DD-MM-RR HH24:MI:SS')
     and module_id not in ('rman')
     and ( MESSAGE_TEXT like 'ALTER%')
    and( MESSAGE_TEXT not like 'ALTER DATABASE BACKUP CONTROLFILE TO %')

O si queremos ver las veces que se ha llevado a cabo un evento concreto como arrancado la base de datos
Veces que se ha hecho un ALTER DATABASE OPEN

 select    
   ORIGINATING_TIMESTAMP,
   MESSAGE_TEXT
     from sys.x$dbgalertext
   where  ORIGINATING_TIMESTAMP > 
         TO_TIMESTAMP('01-01-14 00:00:00','DD-MM-RR HH24:MI:SS')
 and( MESSAGE_TEXT like 'ALTER DATABASE OPEN%')  
 

Como decía al principio, es una entrada muy sencilla, pero que, puede aportarnos información útil en muchos casos