[purge_adrci.sh]
ADRCI es un programa que sirve para gestionar logs, incidencias, alertas y trazas de aplicaciones de ORACLE, como por ejemplo las bases de datos. Es una herramienta útil para identificar y empaquetar las incidencias que nos puedan dar las bases de daos en algún momento y mandarlas fácilmente a Oracle para analizarlas.
purge_ADRCI.sh es un script que busca cuales son los homes de las bases de datos ORACLE instaladas en nuestro servidor y limpia los ficheros generados, como logs, incidencias, alertas y trazas mas antiguos de x dias (en este script definido en 30 dias).
el script usa adrci en modo batch (aunque también funciona en modo de terminal virtual).
oracle@intbd01:~> adrci exec=»show homes»
ADR Homes:
diag/rdbms/salnitre/salnitre1
diag/asm/+asm/+ASM1
diag/clients/user_oracle/host_1234_12
diag/tnslsnr/salnitre01/listener_salnitre01
este comando nos muestra dónde están los datos de las aplicaciones que tenemos instaladas.
echo «[ADRCI] purgando el home $url_home de los reports mas antiguos de $dias dias» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minutos -type ALERT» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minutos -type INCIDENT» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minutos -type TRACE» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minutos -type CDUMP» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minutos -type HM» >> $LOGD
esta parte del script busca cada uno de los distintos tipos de bases de datos que almacena el adrci y los mas antiguos de $minutos, los borra. Por desgracia las trazas de la versión 11.1 no las borra, así que añadiremos otra línea que lo hace manualmente:
# eliminacion manual de los fitcheros y directorios de traza
echo «[ADRCI] limpiando los ficheros de traza» >> $LOGD
find /ORACLE/$url_home/trace/*_ora*trc -mtime +$dias -exec rm {} ; >> $LOGD
find /ORACLE/$url_home/trace/cdmp_* -mtime +$dias -exec rm -Rf {} ; >> $LOGD
Una vez ha hecho esto, hay 4 tipo de errores posibles.
1. Que no se hayan borrado ficheros mas antiguos de $dias, esto pasa cuando la maquina se sobresatura y empieza a crear directorios, el ADRCI no borra los ficheros generados dentro de directorios, luego el script te avisará en qué directorio quedan ficheros antiguos por borrar.
2. No se encuentra oraenv.sh: oraenv.sh define las variables de entorno, este fichero tiene que estar en ~ (/ORACLE/home/oracle/), si no el script no sabrá donde ir a buscarlo. Si no se define este fichero cron no encuentra adrci y adrci no encontrará donde se encuentran los homes de oracle.
3. No hay ADR homes: esto quiere decir que no hay ningún producto de oracle instalado en la maquina o no están definidas las variables de entorno que hacen referencia a orahome.
4. No se encuentra adrci: o no está instalado, o las variables de entorno no están definidas correctamente, comprueba que oraenv.sh está en su sitio.
Para cualquier otra duda consultar los comentarios del script:
#!/bin/bash#————— variables de entorno —————————————–
. /ORACLE/home/oracle/oraenv.shDLOG=$HOME/log
LOGD=$DLOG/purge_ADRCI.log
LOGH=$DLOG/purge_ADRCI.historico# definir la vida de los ficheros (los ficheros mas antiguos de $dias se borraran)
dias=30
((minutos=$dias*24*60))MAIL=mi@mail.com
#//////////////////////////////////////////////////////////////////////////////////////////////
#/////////////////////////// CUERPO PROGAMA ///////////////////////////////////////////
#//////////////////////////////////////////////////////////////////////////////////////////////cd /ORACLE/home/oracle
echo -e «**************** INICIO PURGA DE LOS ARDCI ORACLE | » `date` » ****************» > $LOGD
adrci exec=»show homes» |grep -v : |while read url_home
do
echo «[ADRCI] purgando el home $url_home de los reports mas antiguos de $dias días» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minuts -type ALERT» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minuts -type INCIDENT» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minuts -type TRACE» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minuts -type CDUMP» >> $LOGD
adrci exec=»set homepath $url_home;purge -age $minuts -type HM» >> $LOGD# eliminación manual de los ficheros y directorios de traza
echo «[ADRCI] limpiando los ficheros de traza» >> $LOGD
find /ORACLE/$url_home/trace/*_ora*trc -mtime +$dias -exec rm {} ; >> $LOGD
find /ORACLE/$url_home/trace/cdmp_* -mtime +$dias -exec rm -Rf {} ; >> $LOGD# ERROR 1 # aún hay ficheros mas antiguos a la fecha
# solución: comprueba los derechos sobre los ficheros
ERROR=»COMPLETED»
ERROR11=`find /ORACLE/$url_home/trace/*_ora*trc -mtime +$dias |wc -l`
ERROR12=`find /ORACLE/$url_home/alert/* -mtime +$dias |wc -l`
ERROR13=`find /ORACLE/$url_home/incident/* -mtime +$dias |wc -l`
ERROR14=`find /ORACLE/$url_home/cdump/* -mtime +$dias |wc -l`
ERROR15=`find /ORACLE/$url_home/hm/* -mtime +$dias |wc -l`if [[ $ERROR11 -ne 0 || $ERROR12 -ne 0 || $ERROR13 -ne 0 || $ERROR14 -ne 0 || $ERROR15 -ne 0 ]]; then
ERROR=»MAL [ERROR 1]»
fiecho -e «error?: » $ERROR >> $LOGD
echo -e «trazas: » $ERROR11 >> $LOGD
echo -e «alerts: » $ERROR12 >> $LOGD
echo -e «incidentes: » $ERROR13 >> $LOGD
echo -e «cdumps: » $ERROR14 >> $LOGD
echo -e «hm: » $ERROR15 >> $LOGDdone
if [ `cat $LOGD |grep «MAL» |wc -l` -ne 0 ]; then
ERROR=»MAL [ERROR 1]»
ERROR1=1
else
ERROR=»COMPLETED»
ERROR1=0
fi# ERROR 2 # no existe oraenv.sh
# solución: cambiar la ubicación del script oraenv.sh o crear un vinculo simbólico a ~ con un fichero llamado así
ERROR2=`cat $DLOG/purge_ADRCI.cron.log |grep «oraenv» |grep «No such file or directory» |wc -l`if [ $ERROR2 -ne 0 ]; then
ERROR=»MAL [ERROR 2]»
fi# ERROR 3 # No ADR homes, adrci se ha ejecutado pero por algún motivo no encuentra los homes.
# solución: comprobar las variables de entorno o que haya bases de datos instaladas
ERROR3=`cat $DLOG/purge_ADRCI.log |grep «No ADR homes» |wc -l`if [ $ERROR3 -ne 0 ]; then
ERROR=»MALAMENT [ERROR 3]»
fi# ERROR 4 # No se encuentra adrci
# solución: comprobar las variables de entorno, mirar si si `echo $PATH` muestra lo mismo que hay en oraenv.sh
ERROR4=`cat $DLOG/purge_ADRCI.cron.log |grep «adrci: command not found» |wc -l`if [ $ERROR4 -ne 0 ]; then
ERROR=»MAL [ERROR 4]»
fi# ERROR N # Descripción
# solución: solución al problema n# Para identificar los errores
echo «error: » $ERROR >> $LOGD
echo «error1 (ficheros antiguos): » $ERROR1 >> $LOGD
echo «error2 (oraenv): » $ERROR2 >> $LOGD
echo «error3 (no adrci homes): » $ERROR3 >> $LOGD
echo «error4 (no adrci exec): » $ERROR4 >> $LOGDecho -e «**************** FINALIZA LA PURGA DE LOS ADRCI ORACLE | $ERROR | » `date` » *******» >> $LOGD
echo -e «////////////////////////////////////////////////////////////////////////////» >> $LOGDif [ «$ERROR» != «COMPLETED» ]; then
echo -e «[ERROR DETECTADO] Recogiendo logs…»
cat $DLOG/purge_ADRCI.cron.log >> $LOGD
echo -e «[ERROR DETECTADO] logs recogidos correctamente.» >> $LOGD
echo -e «[ERROR DETECTADO] consultad el script purge_ADRCI.sh para mas información» >> $LOGD
echo -e «[ERROR DETECTADO] se manda un correo electrónico a: $MAIL» >> $LOGD
cat $LOGD |mailx -s «ALERTA `hostname` : ADRCI ] $ERROR» $MAIL
ficat $LOGD >> $LOGH