Translate

Affichage des articles dont le libellé est archive. Afficher tous les articles
Affichage des articles dont le libellé est archive. Afficher tous les articles

jeudi 9 novembre 2017

Script de validation de l'état d'une Bd StandBy

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 : 



vendredi 15 mai 2015

Script - DB SIZE

Bonjour

      Voici un petit script pour estimer la taille de la base de données


SET LINESIZE 200
COL TRI2 NOPRINT
COL GBYTES FORMAT 999,999,999,999.99
BREAK ON GTOTAL ON REPORT
BREAK ON STOTAL ON TYPE
COMPUTE SUM OF GBYTES ON TYPE
SELECT '1' TRI2, 'DATA' TYPE, TRI, GBYTES
 FROM ( SELECT TRI, SUM(GO) GBYTES
          FROM (SELECT 'DATAFILES' TRI, NAME FICHIER, BYTES/1024/1024/1024 GO
                  FROM V$DATAFILE  --DBA_DATA_FILES
                UNION
                SELECT 'TEMPFILES' TRI, NAME FICHIER, BYTES/1024/1024/1024 GO
                  FROM V$TEMPFILE  --DBA_TEMP_FILES 
                UNION
                SELECT 'CONTROLFILES' TRI, NAME FICHIER , BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024/1024 GO
                  FROM V$CONTROLFILE 
                 ORDER BY TRI  )
         GROUP BY TRI
        ) A
UNION   
SELECT '2' TRI2, 'ARCHIVE' TYPE, 'ARCHIVELOG' TRI, ROUND(SUM(BLOCKS*BLOCK_SIZE/1024/1024/1024),2) GBYTES
   FROM V$ARCHIVED_LOG
  WHERE DELETED = 'NO' 
UNION
SELECT '3' TRI2, 'REDOLOGS' TYPE, 'REDOLOGS' TRI, ROUND(SUM(A.BYTES)/1024/1024/1024,2) GBYTES
  FROM V$LOG A, V$LOGFILE B
 WHERE A.GROUP# = B.GROUP#
ORDER BY TRI2  ;