1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
| #!/bin/sh
LIST_BASE="BUR102 SUR102 MOA102 TDUN102 CRDV102 CRRE102" # listes des bases a sauvegarder
MAILDEST="_Info_DBA@truc.fr" #destinataire des mail de log
if [ $1 ] ;then LIST_BASE=$1;fi; #sauvegarde du SID passe en parametre
# GetRes REQ SID
#fonction qui affiche le resultat de la requete passee en parametre
#
GetRes()
{
REQ=$1
ORACLE_SID=$2
RES=`sqlplus -s "/ as sysdba" <<FINSQL
WHENEVER SQLERROR EXIT 1
set head off pages 0 feedback off
${REQ}
exit 0
FINSQL`
STATUS=$?
echo ${RES}
return $STATUS
}
#procedure executant une sauvegarde RMAN full
# parametere
# ORACLE_SID
# doit etre lance en par un user pouvant faire une connexion / as sysdba
rmanfull()
{
export ORACLE_SID=$1
RMANCONNECT="rman/password@repositoryrman" #connection au repository RMAN
#definition du format de date pour que la date soit plus claire dans les log RMAN
export NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'
TMPFIC=tmpx.$$
#verification si la base est demarree
$ORACLE_HOME/bin/rman TARGET / <<FINRMAN>${TMPFIC}
exit;
FINRMAN
grep -q "connected to target database (not started)" ${TMPFIC}
if [ $? = 0 ] #si la base n'est pas demarree on la demarre en mode mount et on l'arrete apres la sauvegarde
then
echo "la base $ORACLE_SID est arrete"
PREBACKUP="startup mount;"
POSTBACKUP="shutdown immediate;"
else
PREBACKUP=""
POSTBACKUP=""
fi
echo nettoyage avant sauvegarde
$ORACLE_HOME/bin/rman TARGET / CATALOG ${RMANCONNECT}<<FINRMAN
#divers crosscheck pour eviter les problemes si nettoyage manuel
crosscheck backup;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired archivelog all;
delete noprompt obsolete;
exit;
FINRMAN
#definition de l'emplacement du log
DB_RECOVERY=`GetRes "select value from v\\$parameter where name like 'db_recovery_file_dest';" ${ORACLE_SID}`
DATE=`date +%Y%m%d%H%M%S`
DATE2=`date +%Y/%m/%d-%H:%M:%S`
RMANLOG="${DB_RECOVERY}/${ORACLE_SID}/log/rman_full_${ORACLE_SID}_${DATE}.log"
if ! [ -d $(dirname $RMANLOG) ] ; then mkdir -p $(dirname $RMANLOG);fi;
RMANLOGGENERAL="${DB_RECOVERY}/log/rman_log_general.csv"
if ! [ -d $(dirname $RMANLOGGENERAL) ] ; then mkdir -p $(dirname $RMANLOGGENERAL);fi;
if ! [ -f $RMANLOGGENERAL ] ; then echo "INSTANCE;Status de la sauvegarde;DATE;SERVEUR;Emplacement du log">$RMANLOGGENERAL;fi
;
TAG="TAG${DATE}${ORACLE_SID}"
#gestion des log rman
find ${DB_RECOVERY}/${ORACLE_SID}/log -name 'rman_full_*.log' -mtime +90 -exec rm -f {} \;
echo sauvegarde du init${ORACLE_SID}.ora |tee -a ${RMANLOG}
sqlplus / as sysdba<<FINSQL>>${RMANLOG}
set echo on
create pfile='${DB_RECOVERY}/${ORACLE_SID}/init${ORACLE_SID}.ora' from spfile;
FINSQL
echo Sauvegarde RMAN de $ORACLE_SID
$ORACLE_HOME/bin/rman log="${RMANLOG}" <<FINRMAN
set echo on;
connect target /
${PREBACKUP} #demarrage de la base ....
# Configuration de redundancy
configure retention policy to redundancy 1;
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 2;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
#sauvegarde full
backup database plus archivelog delete input tag '${TAG}';
#on efface tout ce qui a deja ete sauvegarde
delete noprompt obsolete;
${POSTBACKUP}
exit;
FINRMAN
}
#procedure de synchronisation du catalog RMAN
# parametere
# ORACLE_SID
# doit etre lance en par un user pouvant faire une connexion / as sysdba
#doit etre lance apres rmanfull pour que le rmanlog soit defini
rmanRESYNC ()
{
ORACLE_SID=$1
echo "test connexion et inscription au catalog rman"
$ORACLE_HOME/bin/rman TARGET / CATALOG ${RMANCONNECT} log=${TMPFIC}<<FINRMAN
set echo on;
#inscription au catalog
REGISTER DATABASE;
#syncronisation du catalog avec le control file
RESYNC CATALOG;
exit;
FINRMAN
grep -q "connected to recovery catalog database" ${TMPFIC}
if [ $? = 0 ] #si le catalog marche on l'utilise
then "echo connexion au catalog RMAN ${RMANCONNECT}">>${RMANLOG};
else echo "pas de connexion au catalog RMAN ${RMANCONNECT}">>${RMANLOG};
fi
}
rm ${TMPFIC}
save ()
{
ORACLE_SID=$1
rmanfull $ORACLE_SID
if [ $? = 0 ]
then
rmanRESYNC $ORACLE_SID
SAV_STATUS="Reussie"
RETURNVALUE=0
else
rmanRESYNC $ORACLE_SID
SAV_STATUS="Echec"
RETURNVALUE=-1000
fi
MSGTXT="Sauvegarde de l instance $ORACLE_SID : ${SAV_STATUS} $(date +%Y/%m/%d-%H:%M:%S)"
MSGOBJ="${SAV_STATUS} : $(basename $0) $ORACLE_SID sur $(uname -n)"
MSGLOG="${ORACLE_SID};${SAV_STATUS};${DATE2};`uname -n`;${RMANLOG}"
echo "${MSGTXT}">>${RMANLOG}
echo "${MSGTXT}"| /usr/local/bin/mutt -s "${MSGOBJ}" "${MAILDEST}" -a "${RMANLOG}"
echo "${MSGLOG}">>${RMANLOGGENERAL}
echo "copie du log general par samba"
ux2dos ${RMANLOGGENERAL}>${TMPFIC}
#parametre pour smbclient
DIR_REMOTE='\oi_dba\Suivi_sauvegarde\'
FIC_LOG_MOD_REMOTE=${DIR_REMOTE}$(basename ${RMANLOGGENERAL})
SERVICENAME="//hator/users"
USERSAMBA="admindba%admindba"
/opt/samba/bin/smbclient ${SERVICENAME} -U ${USERSAMBA} -c "mkdir ${DIR_REMOTE};put ${TMPFIC} ${FIC_LOG_MOD_REMOTE};e
xit"
rm ${TMPFIC}
echo fin $0 de $ORACLE_SID
return ${RETURNVALUE}
}
# Lancement des sauvegardes
for ORACLE_SID in ${LIST_BASE}
do
save $ORACLE_SID &
done |
Partager