#!/bin/bash #------------------------------------------------------------------------------ # ORACLE DATABASE : BACKUP RMAN DB + AL #------------------------------------------------------------------------------ # Historique : # 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 # 25/07/2024 : YOU - fichier .env pour les variables d'environnement # 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et bonnes pratiques #------------------------------------------------------------------------------ # Ajout de set -o pipefail pour la gestion des erreurs dans les pipes set -o pipefail #------------------------------------------------------------------------------ # fonction d'aide #------------------------------------------------------------------------------ f_help() { cat <> $BKP_LOG_FILE fi } #f_print #------------------------------------------------------------------------------ # traitement de la ligne de commande #------------------------------------------------------------------------------ ORACLE_SID=$1 [ "${ORACLE_SID}" ] || f_help 2; # positionner les variables d'environnement ORACLE export ORACLE_SID #------------------------------------------------------------------------------ # initialisation des variables d'environnement #------------------------------------------------------------------------------ export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) # Nom du fichier .env ENV_FILE=${SCRIPTS_DIR}"/.env" # Vérifier si le fichier .env existe if [ ! -f "$ENV_FILE" ]; then echo "Erreur : Le fichier $ENV_FILE n'existe pas." echo "Erreur : Impossible de charger les variables d'environnement." exit 1 fi # Charger les variables d'environnement depuis le fichier .env source "$ENV_FILE" #------------------------------------------------------------------------------ # Variables attendues dans le fichier .env : #------------------------------------------------------------------------------ # ORACLE_OWNER : propritaire des binaires oracle (ex: oracle) # BKP_LOCATION : répertoire de stockage des backups (ex: /u01/backup/rman) # BKP_LOG_DIR : répertoire de stockage des logs (ex: /u01/backup/log) # BKP_REDUNDANCY : politique de rétention RMAN (ex: 3) # PARALLELISM : parallélisme pour les backups RMAN (ex: 4) # NTFY_URL : URL pour les notifications d'erreur (service ntfy.sh) # BKP_LOG_RETENTION : durée de rétention des fichiers de log (en jours, ex: 30) #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ # initialisation des variables du script #------------------------------------------------------------------------------ export BKP_TYPE="full" export DATE_JOUR=$(date +%Y%m%d) export RMAN_CMD_FILE="${BKP_LOG_DIR}/rman_cmd_${ORACLE_SID}_${DATE_JOUR}.rcv" export BKP_LOG_FILE="${BKP_LOG_DIR}/backup_rman_${BKP_TYPE}_${ORACLE_SID}_${DATE_JOUR}.log" #------------------------------------------------------------------------------ # vérifier si ORACLE_SID est dans /etc/oratab #------------------------------------------------------------------------------ if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" exit 2 fi ORAENV_ASK=NO PATH=/usr/local/bin:$PATH . oraenv -s >/dev/null # si la base est standby on sort ${SCRIPTS_DIR}/is_standby.sh ${ORACLE_SID} && exit 2 #------------------------------------------------------------------------------ # si ce n'est pas le user oracle qui lance le script, on quitte #------------------------------------------------------------------------------ if [[ "$(whoami)" != "$ORACLE_OWNER" ]]; then echo echo "-----------------------------------------------------" echo "Vous devez etre $ORACLE_OWNER pour lancer ce script" echo "-----------------------------------------------------" exit 2 fi #------------------------------------------------------------------------------ # initialisation des chemins, s'ils n'existent pas ils seront créés #------------------------------------------------------------------------------ mkdir -p ${BKP_LOCATION} mkdir -p ${BKP_LOG_DIR} #------------------------------------------------------------------------------ # génération du script de la sauvegarde RMAN #------------------------------------------------------------------------------ # # si une autre sauvegarde est en cours, on quitte # RUNNING_RMAN=$($ORACLE_HOME/bin/sqlplus -S / as sysdba < 0, donc backup RMAN en cours ... on quitte f_print "... " f_print "Sauvegarde RMAN en cours ... fin du script" f_print "... " exit 2 fi # # récupération du mode archive ou pas # - si archivelog : on sauvegarde la base # - sinon : on fait validate check logical database # LOG_MODE=$($ORACLE_HOME/bin/sqlplus -S / as sysdba < ${RMAN_CMD_FILE} < ${RMAN_CMD_FILE} <> $BKP_LOG_FILE f_print "------------------------- BACKUP ${BKP_TYPE} TERMINE -------------------------"