diff --git a/backup_rman.sh b/backup_rman.sh index 187db31..fca605c 100755 --- a/backup_rman.sh +++ b/backup_rman.sh @@ -3,35 +3,40 @@ # ORACLE DATABASE : BACKUP RMAN DB + AL #------------------------------------------------------------------------------ # Historique : -# 14/09/2011 : YAO - Creation -# 13/10/2015 : YAO - ajout des params en ligne de commande -# 24/10/2017 : YAO - ajout de level 0 + stby ctlfile + spfile including ctrl file -# 20/03/2023 : YAO - mise à jour des variable (/u0x) +# 14/09/2011 : YOU - Creation +# 12/10/2015 : YOU - adaptation à l'ensemble des bases +# 13/10/2015 : YOU - ajout des params en ligne de commande +# 03/05/2016 : YOU - adaptation a l'environnement SOM +# 04/05/2016 : YOU - ajout du niveau de sauvegarde : incrementale 0 ou 1 +# 09/11/2022 : YOU - backup simple => db full +# 10/08/2023 : YOU - base noarchivelog : execution de rman validate +# 25/09/2023 : YOU - simplification, 1 seul parametre pour le script #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ -# fonction init : c'est ici qu'il faut modifier toutes les variables liees -# a l'environnement +# fonction init : c'est ici qu'il faut modifier toutes les variables liées +# à l'environnement #------------------------------------------------------------------------------ f_init() { export ORACLE_OWNER=oracle - export NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS" - # les differents repertoires + # les différents répertoires export SCRIPTS_DIR=/home/oracle/scripts export BKP_LOG_DIR=$SCRIPTS_DIR/logs - export BKP_LOCATION=/u04/backup/${ORACLE_SID} + export BKP_LOCATION=/u04/backup/${ORACLE_SID}/rman + + # nombre de sauvegarde RMAN en ligne à garder + export BKP_REDUNDANCY=1 + export DATE_JOUR=$(date +%Y.%m.%d-%H.%M) + export BKP_LOG_FILE=${BKP_LOG_DIR}/backup_rman_${ORACLE_SID}_${DATE_JOUR}.log + export RMAN_CMD_FILE=${BKP_LOG_DIR}/rman_cmd_file_${ORACLE_SID}.rman - # nombre de sauvegarde RMAN en ligne a garder - export BKP_REDUNDANCY=2 - export DATE_JOUR=$(date +%Y%m%d-%H%M) - export BKP_LOG_FILE=${BKP_LOG_DIR}/backup_rman_${ORACLE_SID}_${BKP_TYPE}_${DATE_JOUR}.log - export RMAN_CMD_FILE=${SCRIPTS_DIR}/rman_cmdfile_${ORACLE_SID}_${BKP_TYPE}.rman # nombre de jours de conservation des logs de la sauvegarde export BKP_LOG_RETENTION=15 - # nombre de jours de conservation des archivelog sur disque - export ARCHIVELOG_RETENTION=1 + + # nombre de canaux à utiliser + export PARALLELISM=1 } # f_init @@ -41,41 +46,13 @@ f_init() { f_help() { cat < backup full (database + archivelog) - -t AL => backup des archivelog seulement +syntax : $O ORACLE_SID CATEOF exit $1 } #f_help -#------------------------------------------------------------------------------ -# fonction backup_is_running -#------------------------------------------------------------------------------ -f_is_running() { - - RUNNING_BKP=$($ORACLE_HOME/bin/sqlplus -s / as sysdba <> $BKP_LOG_FILE } #f_print + #------------------------------------------------------------------------------ -# fonction de traitement des options de la ligne de commande -#------------------------------------------------------------------------------ -f_options() { - - case ${BKP_TYPE} in - [dD][bB]) - BKP_DB_PLUS_AL=TRUE; - ;; - [aA][lL]) - BKP_DB_PLUS_AL=FALSE; - ;; - *) f_help 2; - ;; - esac - -} #f_options - - -#---------------------------------------- -#------------ MAIN ---------------------- -#---------------------------------------- - -while getopts s:t:h o -do - case $o in - t) BKP_TYPE=$OPTARG; - ;; - s) ORACLE_SID=$OPTARG; - ;; - h) f_help 0; - ;; - *) f_help 2; - ;; - esac -done - # traitement de la ligne de commande -f_options +#------------------------------------------------------------------------------ - -[ "${BKP_TYPE}" ] || f_help 2; -BKP_TYPE=$(echo ${BKP_TYPE} | tr [a-z] [A-Z]) [ "${ORACLE_SID}" ] || f_help 2; # positionner les variables d'environnement ORACLE export ORACLE_SID ORAENV_ASK=NO PATH=/usr/local/bin:$PATH -. oraenv -s +. oraenv -s >/dev/null +#------------------------------------------------------------------------------ # inititalisation des variables d'environnement +#------------------------------------------------------------------------------ f_init - +#------------------------------------------------------------------------------ # si ce n'est pas le user oracle qui lance le script, on quitte +#------------------------------------------------------------------------------ if (test `whoami` != $ORACLE_OWNER) then echo @@ -149,54 +91,63 @@ then exit 2 fi -# initialisation des chemins, s'ils n'existent pas ils seront crees par la commande install +#------------------------------------------------------------------------------ +# initialisation des chemins, s'ils n'existent pas ils seront créés par la commande install +#------------------------------------------------------------------------------ install -d ${BKP_LOCATION} install -d ${BKP_LOG_DIR} -# verifier si un backup RMAN est en cours -f_is_running +#------------------------------------------------------------------------------ +# génération du script de la sauvegarde RMAN +#------------------------------------------------------------------------------ -# generation du script de la sauvegarde RMAN -echo " -run { -CONFIGURE DEVICE TYPE DISK PARALLELISM 1 ; -CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY}; +# récupération du mode archive ou pas +LOG_MODE=$($ORACLE_HOME/bin/sqlplus -S / as sysdba < ${RMAN_CMD_FILE} - -# si sauvegarde DB (-t db) on ajoute cette ligne -if [ "${BKP_DB_PLUS_AL}" == "TRUE" ]; then -echo " -BACKUP INCREMENTAL LEVEL 0 DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/data_%T_%t_%s_%p' TAG 'DATA_${DATE_JOUR}' as compressed backupset database; -" >> ${RMAN_CMD_FILE} +if [ "$LOG_MODE" == "NOARCHIVELOG" ]; then + echo "validate check logical database;" > ${RMAN_CMD_FILE} +else + echo " + run { + CONFIGURE DEVICE TYPE DISK PARALLELISM $PARALLELISM ; + CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY}; + BACKUP DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/data_%T_%t_%s_%p' TAG 'DATA_${DATE_JOUR}' AS COMPRESSED BACKUPSET DATABASE; + SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT'; + BACKUP DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/arch_%T_%t_%s_%p' TAG 'ARCH_${DATE_JOUR}' AS COMPRESSED BACKUPSET ARCHIVELOG ALL DELETE ALL INPUT; + DELETE NOPROMPT OBSOLETE; + DELETE NOPROMPT EXPIRED BACKUPSET; + BACKUP CURRENT CONTROLFILE FORMAT '${BKP_LOCATION}/control_%T_%t_%s_%p' TAG 'CTLFILE_${DATE_JOUR}'; + SQL \"ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS ''${BKP_LOCATION}/${ORACLE_SID}_control_file.trc'' REUSE\"; + SQL \"CREATE PFILE=''${BKP_LOCATION}/pfile_${ORACLE_SID}.ora'' FROM SPFILE\"; + } + " > ${RMAN_CMD_FILE} fi - -# on continue avec la partie commune : backup des archivelog + spfile + controlfile -echo " -SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT'; -BACKUP DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/arch_%T_%t_%s_%p' TAG 'ARCH_${DATE_JOUR}' AS COMPRESSED BACKUPSET ARCHIVELOG ALL DELETE ALL INPUT; - -BACKUP SPFILE INCLUDE CURRENT CONTROLFILE FORMAT '${BKP_LOCATION}/spfile_ctrlfile_%T_%t_%s_%p' TAG 'SPFILE_CTRLFILE_${DATE_JOUR}'; -BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '${BKP_LOCATION}/standby_ctrlfile_%T_%t_%s_%p' TAG 'STBY-CTLFILE_${DATE_JOUR}'; - -CROSSCHECK ARCHIVELOG ALL; -DELETE NOPROMPT ARCHIVELOG ALL; -DELETE NOPROMPT OBSOLETE; -DELETE NOPROMPT EXPIRED BACKUPSET; - -sql \"ALTER DATABASE BACKUP CONTROLFILE TO TRACE as ''${BKP_LOCATION}/controlfile_${ORACLE_SID}.trc'' reuse\"; -SQL \"CREATE PFILE=''${BKP_LOCATION}/pfile_${ORACLE_SID}.ora'' FROM SPFILE\"; -} -" >> ${RMAN_CMD_FILE} - +#------------------------------------------------------------------------------ # Execution du script RMAN +#------------------------------------------------------------------------------ f_print "------------------------- DEBUT DE LA BACKUP -------------------------" ${ORACLE_HOME}/bin/rman target / cmdfile=${RMAN_CMD_FILE} log=${BKP_LOG_FILE} -# Nettoyage auto des logs : duree de concervation determinee par la variable : ${BKP_LOG_RETENTION} +#------------------------------------------------------------------------------ +# Mail si des erreurs dans le fichier de sauvegarde +#------------------------------------------------------------------------------ +ERR_COUNT=$(egrep "^RMAN-[0-9]*|^ORA-[0-9]:" ${BKP_LOG_FILE} | wc -l) + +if [ ${ERR_COUNT} -ne 0 ]; then + curl -H "t: Erreur RMAN base ${ORACLE_SID} sur le serveur $(hostname)" -d "$(cat ${BKP_LOG_FILE})" -L https://ntfy.axiome.io/backup-rman +fi + +#------------------------------------------------------------------------------ +# Nettoyage auto des logs : durée de concervation déterminée par la variable : ${BKP_LOG_RETENTION} +#------------------------------------------------------------------------------ + f_print "------------------------- NETTOYAGE DES LOGS -------------------------" find ${BKP_LOG_DIR} -type f -iname "backup_rman_${BKP_TYPE}*.log" -mtime +${BKP_LOG_RETENTION} -exec rm -fv "{}" \; >> $BKP_LOG_FILE - f_print "------------------------- BACKUP ${BKP_TYPE} TERMINE -------------------------"