Script de validation de l'état de votre Bd StandBy
Ceci a été testé sur des serveurs Solaris et avec des bd's 11g et 12c
#!/usr/bin/bash
#################################################################################
###
### Script : ValidStatusStBy.sh
### Description : Verification de l etat de la BD StandBy
### Author : Victor Tijero
### Parametres :
### 1.- ORACLE_SID
### 2.- UNIQUE_NAME DE LA STANDBY
### 3.- (Y/N) MODE FLASHBACK ACTIVE ATTENDU DANS LA BD STBY
### 4.- UNIQUE_NAME DE LA STANDBY
### 5.- (Y/N) iENVOYER UN EMAIL AVEC LE RESULTAT
###
###
#################################################################################
. ${HOME}/.profile
NLS_LANG="CANADIAN FRENCH_AMERICA.WE8ISO8859P1"
export NLS_LANG
NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS'
export NLS_DATE_FORMAT
####################################
# Initialisation variables
####################################
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
ORACLE_SID=${1}
DB_UNIQUE_NAME_STB=${2}
MOD_FLSH_ACT=${3:-Y}
NBR_JRS_TOLR_SNAP=${4:-1}
ENV_EMAIL=${5:-Y}
#-------------------------------------------------------------------------------
export ORACLE_SID
export DB_UNIQUE_NAME_STB
export MOD_FLSH_ACT
export NBR_JRS_TOLR_SNAP
export ENV_EMAIL
export V_DATE=`date +%Y%m%d_%H%M`
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
if [ ! "$1" ]; then
echo -e "ERROR - Valeur de la variable ORACLE_SID n a pas ete indique"
exit
fi
if [ ! "$2" ]; then
echo -e "ERROR - Valeur de la variable DB_UNIQUE_NAME_STB n a pas ete indique"
exit
fi
if [ ! "$3" ]; then
echo -e "ERROR - Valeur de la variable MOD_FLSH_ACT n a pas ete indique. Valeur Y assigne par defaut"
else
if [ "$MOD_FLSH_ACT" != "Y" -a "$MOD_FLSH_ACT" != "y" -a "$MOD_FLSH_ACT" != "N" -a "$MOD_FLSH_ACT" != "n" ]; then
echo -e "ERROR - Valeur de la variable MOD_FLSH_ACT doit etre Y ou N"
exit
fi
fi
if [ ! "$4" ]; then
echo -e "WARNING - Valeur de la variable NBR_JRS_TOLR ne peut pas etre NULL. Valeur 1 assigne par defaut"
else
if [ $NBR_JRS_TOLR_SNAP -le 0 ]; then
echo -e "WARNING - Valeur de la variable NBR_JRS_TOLR ne peut pas etre 0. Valeur 1 assigne par defaut"
fi
fi
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
if [ ! -d /Scripts/DataGuard/${DB_UNIQUE_NAME_STB} ]; then
mkdir -p /Scripts/DataGuard/${DB_UNIQUE_NAME_STB}
fi
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
FTEMP=/Scripts/DataGuard/${DB_UNIQUE_NAME_STB}/VerifStatusStdBy_${DB_UNIQUE_NAME_STB}.tmp
LOGFL=/Scripts/DataGuard/${DB_UNIQUE_NAME_STB}/VerifStatusStdBy_${DB_UNIQUE_NAME_STB}.log
export FTEMP
export LOGFL
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
echo -e "ORACLE_SID..........:" $ORACLE_SID
echo -e "DB_UNIQUE_NAME_STB..:" $DB_UNIQUE_NAME_STB
echo -e "MOD_FLSH_ACT........:" $MOD_FLSH_ACT
echo -e "NBR_JRS_TOLR_SNAP...:" $NBR_JRS_TOLR_SNAP
echo -e "ENV_EMAIL...........:" $ENV_EMAIL
#-------------------------------------------------------------------------------
if [ -f ${LOGFL} ]; then
echo -e "Delete Log..........:" $LOGFL
rm -f $LOGFL
fi
if [ -f $FTEMP ]; then
echo -e "Delete du Temp..... :" $FTEMP
rm -f $FTEMP
fi
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
sqlplus -s / as sysdba <<EOF >$FTEMP
set feed off pages 0 trimspool on linesize 500
SELECT CHECK_MODE_BD||','||CHECK_FLASHBK||','||CHECK_RESTPNT||','||CHECK_LOGSAPP||','||CHECK_LOGSREC||','||CHECK_APPLLOG RESULT
FROM (
SELECT '1CHECK_MODE_BD' ACHECK, DATABASE_ROLE AS VALEUR
FROM V\$DATABASE
UNION
SELECT '2CHECK_FLASHBK' ACHECK, FLASHBACK_ON AS VALEUR
FROM V\$DATABASE
UNION
SELECT '3CHECK_RESTPNT' ACHECK, NAME AS VALEUR
FROM V\$RESTORE_POINT WHERE GUARANTEE_FLASHBACK_DATABASE = 'YES'
UNION
SELECT '4CHECK_LOGSAPP' ACHECK, TO_CHAR(NEXT_TIME,'YYYYMMDD_HH24MI') AS VALEUR
FROM ( SELECT DISTINCT INC_B.INCARNATION#,
FIRST_VALUE(ARC.NEXT_TIME) OVER (ORDER BY ARC.SEQUENCE# DESC) NEXT_TIME,
FIRST_VALUE(ARC.SEQUENCE#) OVER (ORDER BY ARC.SEQUENCE# DESC) SEQUENCE#,
FIRST_VALUE(ARC.NAME ) OVER (ORDER BY ARC.SEQUENCE# DESC) NAME
FROM V\$DATABASE_INCARNATION INC_B, V\$ARCHIVED_LOG ARC
WHERE ARC.APPLIED = 'YES' AND
ARC.RESETLOGS_CHANGE# = INC_B.RESETLOGS_CHANGE#
AND ARC.RESETLOGS_TIME = INC_B.RESETLOGS_TIME
AND INC_B.INCARNATION# = ( SELECT (CASE DBS.DATABASE_ROLE WHEN 'SNAPSHOT STANDBY' THEN INC_A.PRIOR_INCARNATION# ELSE INC_A.INCARNATION# END ) INCARNATION
FROM V\$DATABASE DBS, V\$DATABASE_INCARNATION INC_A
WHERE INC_A.STATUS ='CURRENT' ) )
UNION
SELECT '5CHECK_LOGSREC' ACHECK, TO_CHAR(NEXT_TIME,'YYYYMMDD_HH24MI') AS VALEUR
FROM ( SELECT DISTINCT INC_B.INCARNATION#,
FIRST_VALUE(ARC.NEXT_TIME) OVER (ORDER BY ARC.SEQUENCE# DESC) NEXT_TIME,
FIRST_VALUE(ARC.SEQUENCE#) OVER (ORDER BY ARC.SEQUENCE# DESC) SEQUENCE#,
FIRST_VALUE(ARC.NAME ) OVER (ORDER BY ARC.SEQUENCE# DESC) NAME
FROM V\$DATABASE_INCARNATION INC_B, V\$ARCHIVED_LOG ARC
WHERE ARC.RESETLOGS_CHANGE# = INC_B.RESETLOGS_CHANGE#
AND ARC.RESETLOGS_TIME = INC_B.RESETLOGS_TIME
AND INC_B.INCARNATION# = ( SELECT (CASE DBS.DATABASE_ROLE WHEN 'SNAPSHOT STANDBY' THEN INC_A.PRIOR_INCARNATION# ELSE INC_A.INCARNATION# END ) INCARNATION
FROM V\$DATABASE DBS, V\$DATABASE_INCARNATION INC_A
WHERE INC_A.STATUS ='CURRENT' ) )
UNION
SELECT DISTINCT '6CHECK_APPLLOG' ACHECK, STATUS VALEUR
FROM V\$MANAGED_STANDBY
WHERE STATUS = 'APPLYING_LOG'
ORDER BY ACHECK )
PIVOT ( MAX(VALEUR) FOR ACHECK IN ( '1CHECK_MODE_BD' AS CHECK_MODE_BD,
'2CHECK_FLASHBK' AS CHECK_FLASHBK,
'3CHECK_RESTPNT' AS CHECK_RESTPNT,
'4CHECK_LOGSAPP' AS CHECK_LOGSAPP,
'5CHECK_LOGSREC' AS CHECK_LOGSREC,
'6CHECK_APPLLOG' AS CHECK_APPLLOG
) );
EOF
#################################################################################
#################################################################################
# now process the temp file
V_FOOT="0"
IFS=","
while read CHECK_MODE_BD CHECK_FLASHBK CHECK_RESTPNT CHECK_LOGSAPP CHECK_LOGSREC CHECK_APPLLOG
do
###############################################################
###############################################################
## Ne pas creer le fichier sauf erreur
## Si un fichier de Log existe c est parce qu il y a une erreur
echo " "
echo "ORACLE_SID..........:" $ORACLE_SID
echo "DB_UNIQUE_NAME_STB..:" $DB_UNIQUE_NAME_STB
echo "NBR_JRS_TOLR_SNAP...:" $NBR_JRS_TOLR_SNAP
echo "CHECK_MODE_BD.......:" $CHECK_MODE_BD
echo "CHECK_FLASHBK.......:" $CHECK_FLASHBK
echo "CHECK_RESTPNT.......:" $CHECK_RESTPNT
echo "V_DATE..............:" $V_DATE
echo "CHECK_LOGSREC.......:" $CHECK_LOGSREC
echo "CHECK_LOGSAPP.......:" $CHECK_LOGSAPP
echo " "
###############################################################
###############################################################
if [ ! -z $FTEMP ]; then
if [ `grep "ORA-" $FTEMP | wc -l` -ge 1 ]; then
echo -e " \n" >> $LOGFL
echo -e "ERROR - Possible probleme de connexion a la Bd $ORACLE_SID\n" >> $LOGFL
echo -e "Parametres........:\n" >> $LOGFL
echo -e " ORACLE_SID..........:" $ORACLE_SID >> $LOGFL
echo -e " DB_UNIQUE_NAME_STB..:" $DB_UNIQUE_NAME_STB >> $LOGFL
echo -e " NBR_JRS_TOLR_SNAP...:" $NBR_JRS_TOLR_SNAP >> $LOGFL
echo -e " ORACLE_HOME.........:" $ORACLE_HOME >> $LOGFL
echo -e " \n" >> $LOGFL
echo -e "Erreur detecte....:\n" >> $LOGFL
cat $FTEMP >> $LOGFL
echo -e " \n" >> $LOGFL
#exit
fi
fi
########################################################
# Validation en fonction du FlashBack de la BD
########################################################
#------------------------------------------------------------#
if [ "$CHECK_FLASHBK" == "NO" ]; then
if [ "$MOD_FLSH_ACT" == "Y" -o "$MOD_FLSH_ACT" == "y" ]; then
echo -e " \n" >> $LOGFL
echo -e "WARNING - La Bd Standby ${DB_UNIQUE_NAME_STB} semble ne pas etre en mode Flashback \n" >> $LOGFL
echo -e "WARNING - Le Flashback est normalement active en PROD sur toutes les BDs avec une configuration DataGuard\n" >> $LOGFL
echo -e " \n" >> $LOGFL
fi
fi
#------------------------------------------------------------#
########################################################
# Validation en fonction de l APPLY des logs
# Une tolerance en fonction du parametre est appliquee
########################################################
#---------------------------------------------------#
# Structure YYYMMDD - HEURES - APPLY
#---------------------------------------------------#
VAH_REC_H=`echo $CHECK_LOGSREC | cut -d_ -f2 | cut -c1,2`
VAH_REC_M=`echo $CHECK_LOGSREC | cut -d_ -f2 | cut -c3,4`
VAH_APP_H=`echo $CHECK_LOGSAPP | cut -d_ -f2 | cut -c1,2`
VAH_APP_M=`echo $CHECK_LOGSAPP | cut -d_ -f2 | cut -c3,4`
V_DIF_APPLY_LOG_H=`expr $VAH_REC_H - $VAH_APP_H`
#---------------------------------------------------#
# Structure YYYMMDD - JOURS - APPLY
#---------------------------------------------------#
VAJ_REC=`echo $CHECK_LOGSREC | cut -d_ -f1`
VAJ_REC=$(/opt/csw/bin/gdate -d "$VAJ_REC $VAH_REC_H:$VAH_REC_M:00" '+%s' )
VAJ_APP=`echo $CHECK_LOGSAPP | cut -d_ -f1`
VAJ_APP=$(/opt/csw/bin/gdate -d "$VAJ_APP $VAH_APP_H:$VAH_APP_M:00" '+%s' )
V_DIF_APPLY_LOG_J=$(( ( $VAJ_REC - $VAJ_APP ) / 86400 ))
#---------------------------------------------------#
if [ "$CHECK_MODE_BD" == "SNAPSHOT STANDBY" ]; then
if [ $V_DIF_APPLY_LOG_J -gt $NBR_JRS_TOLR_SNAP ]; then #### Difference en jours. Au moins 1 jour
echo -e "INFORMATION - La Bd StandBy ${DB_UNIQUE_NAME_STB} est en Mode Snapshot \n" >> $LOGFL
echo -e "INFORMATION - Le seuil de tolerance en mode snapshot a ete etabli a ${NBR_JRS_TOLR_SNAP} jours \n" >> $LOGFL
echo -e "INFORMATION - Il se peut que des travaux soient en cours sur cette BD mais il faudrait valider\n" >> $LOGFL
echo -e "ERROR - La BD semble ne pas appliquer de logs il y a ${V_DIF_APPLY_LOG_J} jours \n" >> $LOGFL
V_FOOT="1"
fi
else
if [ ! "$CHECK_APPLLOG" ]; then #### L Apply est arrete
echo -e "INFORMATION - La Bd StandBy ${DB_UNIQUE_NAME_STB} est en Mode Physical \n" >> $LOGFL
echo -e "ERROR - La Bd semble ne pas avoir l APPLY des logs active dans sa configuration\n" >> $LOGFL
fi
if [ $V_DIF_APPLY_LOG_J -gt 0 ]; then #### Difference en jours. Au moins 1 jour
if [ $V_DIF_APPLY_LOG_J -gt 1 ]; then
echo -e "ERROR(0A) - La BD semble ne pas appliquer de logs il y a ${V_DIF_APPLY_LOG_J} jours \n" >> $LOGFL
V_FOOT="1"
else
V_DIF_ABS=`expr 24 + ${V_DIF_APPLY_LOG_H}`
if [ $V_DIF_ABS -gt 2 ]; then #### Difference en heures. Plus de 2 heures
echo -e "ERROR(1A) - La BD semble ne pas aplliquer de logs il y a plus ou moins ${V_DIF_ABS} heures \n" >> $LOGFL
V_FOOT="1"
fi
fi
else
if [ $V_DIF_APPLY_LOG_H -gt 2 ]; then #### Difference en heures. Plus de 2 heures
echo -e "ERROR(2A) - La BD semble ne pas appliquer de logs il y a plus ou moins ${V_DIF_APPLY_LOG_H} heures \n" >> $LOGFL
V_FOOT="1"
fi
fi
fi
###########################################################
########################################################
# Validation en fonction de la reception des logs
# Une tolerance de 2 heures est appliquee
########################################################
#---------------------------------------------------#
# Structure YYYMMDD - HEURES - RECEPTION
#---------------------------------------------------#
VRH_DTE_H=`echo $V_DATE | cut -d_ -f2 | cut -c1,2`
VRH_DTE_M=`echo $V_DATE | cut -d_ -f2 | cut -c3,4`
VRH_REC_H=`echo $CHECK_LOGSREC | cut -d_ -f2 | cut -c1,2`
VRH_REC_M=`echo $CHECK_LOGSREC | cut -d_ -f2 | cut -c3,4`
V_DIF_RECEP_LOG_H=`expr $VRH_DTE_H - $VRH_REC_H `
#---------------------------------------------------#
# Structure YYYMMDD - JOURS - RECEPTION
#---------------------------------------------------#
VRJ_DTE=`echo $V_DATE | cut -d_ -f1`
VRJ_DTE=$(/opt/csw/bin/gdate -d "$VRJ_DTE $VRH_DTE_H:$VRH_DTE_M:00" '+%s' )
VRJ_REC=`echo $CHECK_LOGSREC | cut -d_ -f1`
VRJ_REC=$(/opt/csw/bin/gdate -d "$VRJ_REC $VRH_REC_H:$VRH_REC_M:00" '+%s' )
V_DIF_RECEP_LOG_J=$(( ( $VRJ_DTE - $VRJ_REC ) / 86400 ))
#---------------------------------------------------#
if [ $V_DIF_RECEP_LOG_J -gt 0 ]; then #### Difference en jours. Au moins 1 jour
if [ $V_DIF_RECEP_LOG_J -gt 1 ]; then #### Difference en jours.
echo -e "ERROR(0R) - La BD semble ne pas recevoir de logs il y a ${V_DIF_RECEP_LOG_J} jours \n" >> $LOGFL
V_FOOT="1"
else
V_DIF_ABS=`expr 24 + ${V_DIF_RECEP_LOG_H}`
if [ $V_DIF_ABS -gt 2 ]; then #### Difference en heures. Plus de 2 heures
echo -e "ERROR(1R) - La BD semble ne pas recevoir de logs il y a plus ou moins ${V_DIF_ABS} heures \n" >> $LOGFL
V_FOOT="1"
fi
fi
else
if [ $V_DIF_RECEP_LOG_H -gt 2 ]; then #### Difference en heures. Plus de 2 heures
echo -e "ERROR(2R) - La BD semble ne pas recevoir de logs il y a plus ou moins ${V_DIF_RECEP_LOG_H} heures \n" >> $LOGFL
V_FOOT="1"
fi
fi
#---------------------------------------------------#
if [ $V_DIF_RECEP_LOG_J -gt 0 ]; then
if [ $V_FOOT == "1" ]; then
echo -e "INFORMATION - Dernier Log recu........ "${CHECK_LOGSREC}" \n" >> $LOGFL
echo -e "INFORMATION - Dernier Log applique....."${CHECK_LOGSAPP}" \n" >> $LOGFL
fi
fi
#------------------------------------------------------------#
EMAIL=YOUR.EMAIL@YOUR.DOMAIN
export EMAIL
#------------------------------------------------------------#
if [ -f ${LOGFL} ]; then
if [ "${ENV_EMAIL}" == "Y" ]; then
cat $LOGFL | mailx -s "Bd StandBy ${DB_UNIQUE_NAME_STB} a surveiller " $EMAIL
fi
cat $LOGFL
else
echo " "
echo "Tout semble correct"
echo " "
fi
exit
done <$FTEMP
exit
À la fin, si jamais il y a un problème, vous pouvez recevoir un message comme celui-ci :