révison des script avec gemini : organisation, commentaire et harmonisation

This commit is contained in:
Yacine31
2025-11-10 03:30:58 +01:00
parent bd0e4de6bf
commit 27a022b41b
15 changed files with 386 additions and 230 deletions

23
.env.example Normal file
View File

@@ -0,0 +1,23 @@
# Fichier d'exemple pour les variables d'environnement du script de backup RMAN
# Copiez ce fichier en .env et adaptez les valeurs à votre environnement.
# Propriétaire des binaires Oracle
ORACLE_OWNER=oracle
# Répertoire de stockage des backups RMAN
BKP_LOCATION=/u01/backup/rman
# Répertoire de stockage des logs de backup
BKP_LOG_DIR=/u01/backup/log
# Politique de rétention RMAN (nombre de backups à conserver)
BKP_REDUNDANCY=3
# Nombre de canaux RMAN à utiliser en parallèle
PARALLELISM=4
# URL du service de notification (ntfy.sh) pour les erreurs
NTFY_URL=https://ntfy.sh/your_topic
# Durée de rétention des fichiers de log de backup (en jours)
BKP_LOG_RETENTION=30

View File

@@ -1,30 +1,44 @@
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------
#
# Purge ADR contents (adr_purge.sh) # Purge ADR contents (adr_purge.sh)
# 00 05 * * 0 adr_purge.sh # 00 05 * * 0 adr_purge.sh
# Add the above line with `crontab -e` to the oracle user's cron # Add the above line with `crontab -e` to the oracle user's cron
ALERT_RET="129600" # 90 Days # --- Configuration de la rétention en JOURS ---
INCIDENT_RET="43200" # 30 Days ALERT_RET_DAYS=90
TRACE_RET="43200" # 30 Days INCIDENT_RET_DAYS=30
CDUMP_RET="43200" # 30 Days TRACE_RET_DAYS=30
HM_RET="43200" # 30 Days CDUMP_RET_DAYS=30
HM_RET_DAYS=30
echo "INFO: adrci purge started at `date`" # --- Calcul de la rétention en MINUTES pour adrci ---
ALERT_RET_MINUTES=$((ALERT_RET_DAYS * 24 * 60))
INCIDENT_RET_MINUTES=$((INCIDENT_RET_DAYS * 24 * 60))
TRACE_RET_MINUTES=$((TRACE_RET_DAYS * 24 * 60))
CDUMP_RET_MINUTES=$((CDUMP_RET_DAYS * 24 * 60))
HM_RET_MINUTES=$((HM_RET_DAYS * 24 * 60))
echo "INFO: adrci purge started at $(date)"
adrci exec="show homes"|grep -v 'ADR Homes' | while read file_line adrci exec="show homes"|grep -v 'ADR Homes' | while read file_line
do do
echo "INFO: adrci purging diagnostic destination " $file_line echo "INFO: adrci purging diagnostic destination \"$file_line\""
echo "INFO: purging ALERT older than 90 days" echo "INFO: purging ALERT older than $ALERT_RET_DAYS days"
adrci exec="set homepath $file_line;purge -age $ALERT_RET -type ALERT" adrci exec="set homepath '$file_line';purge -age $ALERT_RET_MINUTES -type ALERT"
echo "INFO: purging INCIDENT older than 30 days" echo "INFO: purging INCIDENT older than $INCIDENT_RET_DAYS days"
adrci exec="set homepath $file_line;purge -age $INCIDENT_RET -type INCIDENT" adrci exec="set homepath '$file_line';purge -age $INCIDENT_RET_MINUTES -type INCIDENT"
echo "INFO: purging TRACE older than 30 days" echo "INFO: purging TRACE older than $TRACE_RET_DAYS days"
adrci exec="set homepath $file_line;purge -age $TRACE_RET -type TRACE" adrci exec="set homepath '$file_line';purge -age $TRACE_RET_MINUTES -type TRACE"
echo "INFO: purging CDUMP older than 30 days" echo "INFO: purging CDUMP older than $CDUMP_RET_DAYS days"
adrci exec="set homepath $file_line;purge -age $CDUMP_RET -type CDUMP" adrci exec="set homepath '$file_line';purge -age $CDUMP_RET_MINUTES -type CDUMP"
echo "INFO: purging HM older than 30 days" echo "INFO: purging HM older than $HM_RET_DAYS days"
adrci exec="set homepath $file_line;purge -age $HM_RET -type HM" adrci exec="set homepath '$file_line';purge -age $HM_RET_MINUTES -type HM"
echo "" echo ""
echo "" echo ""
done done
echo echo
echo "INFO: adrci purge finished at `date`" echo "INFO: adrci purge finished at $(date)"

View File

@@ -1,4 +1,9 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------------
# Ce script effectue une sauvegarde des binaires d'une application Oracle.
# Il crée une archive tar compressée du répertoire de l'application,
# en excluant les sous-répertoires non essentiels (admin, audit, diag).
# Une notification est envoyée à la fin de l'opération (succès ou échec).
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Historique : # Historique :
# 25/09/2023 : YOU - premiere version pour sauvegarder les binaires # 25/09/2023 : YOU - premiere version pour sauvegarder les binaires
@@ -9,7 +14,7 @@
#---------------------------------------- #----------------------------------------
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# inititalisation des variables d'environnement # initialisation des variables d'environnement
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
@@ -26,24 +31,41 @@ fi
# Charger les variables d'environnement depuis le fichier .env # Charger les variables d'environnement depuis le fichier .env
source "$ENV_FILE" source "$ENV_FILE"
#------------------------------------------------------------------------------
# Variables attendues dans le fichier .env :
#------------------------------------------------------------------------------
# BKP_APP_LOCATION : répertoire de stockage des sauvegardes des binaires (ex: /backup/oracle_bin)
# ORA_APP_LOCATION : répertoire de base des binaires Oracle (ex: /u01/app/oracle)
# NTFY_URL : URL pour les notifications (service ntfy.sh)
#------------------------------------------------------------------------------
# S'assurer que toutes les variables utilisées sont définies
set -u
# Gérer les erreurs dans les pipelines
set -o pipefail
# creation du repertoire de sauvegarde. S'il existe la commande install ne fait rien # creation du repertoire de sauvegarde. S'il existe la commande install ne fait rien
install -d ${BKP_APP_LOCATION} mkdir -p ${BKP_APP_LOCATION}
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# sauvegarde # sauvegarde
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
cd ${BKP_APP_LOCATION} cd ${BKP_APP_LOCATION}
# suppression des anciennes sauvegardes # suppression des anciennes sauvegardes (note: cette commande supprime TOUTES les anciennes sauvegardes)
rm -fv backup_bin_oraapp_*.tgz rm -fv backup_bin_oraapp_*.tgz
# compression du repertoire oracle app avec exclusion des répertoires admin, diag et audit # compression du repertoire oracle app avec exclusion des répertoires admin, diag et audit
sudo tar cfz ${BKP_APP_LOCATION}/backup_bin_oraapp_$(date +%Y%m%d).tgz \ if sudo tar cfz "${BKP_APP_LOCATION}/backup_bin_oraapp_$(date +%Y%m%d).tgz" \
--exclude="${ORA_APP_LOCATION}/oracle/admin" \ --exclude="${ORA_APP_LOCATION}/oracle/admin" \
--exclude="${ORA_APP_LOCATION}/oracle/audit" \ --exclude="${ORA_APP_LOCATION}/oracle/audit" \
--exclude="${ORA_APP_LOCATION}/oracle/diag" \ --exclude="${ORA_APP_LOCATION}/oracle/diag" \
${ORA_APP_LOCATION} "${ORA_APP_LOCATION}"; then
# notification de succès
# notification curl -d "$(hostname) - backup des binaires terminée" "${NTFY_URL}"
curl -d "$(hostname) - backup des binaires terminée" ${NTFY_URL} else
# notification d'échec
curl -d "$(hostname) - ERREUR: backup des binaires a échoué" "${NTFY_URL}"
exit 1 # Quitter avec un code d'erreur
fi

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# ORACLE DATABASE : BACKUP RMAN DB + AL # ORACLE DATABASE : BACKUP RMAN DB + AL
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
@@ -12,8 +12,12 @@
# 10/08/2023 : YOU - base noarchivelog : execution de rman validate # 10/08/2023 : YOU - base noarchivelog : execution de rman validate
# 25/09/2023 : YOU - simplification, 1 seul parametre pour le script # 25/09/2023 : YOU - simplification, 1 seul parametre pour le script
# 25/07/2024 : YOU - fichier .env pour les variables d'environnement # 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 # fonction d'aide
@@ -21,7 +25,7 @@
f_help() { f_help() {
cat <<CATEOF cat <<CATEOF
syntax : $O ORACLE_SID syntax : $0 ORACLE_SID
CATEOF CATEOF
exit $1 exit $1
@@ -33,7 +37,12 @@ exit $1
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
f_print() f_print()
{ {
# on vérifie que le fichier de log est défini
if [ -z "${BKP_LOG_FILE}" ]; then
echo "[`date +"%Y/%m/%d %H:%M:%S"`] : $1"
else
echo "[`date +"%Y/%m/%d %H:%M:%S"`] : $1" >> $BKP_LOG_FILE echo "[`date +"%Y/%m/%d %H:%M:%S"`] : $1" >> $BKP_LOG_FILE
fi
} #f_print } #f_print
@@ -49,7 +58,7 @@ ORACLE_SID=$1
export ORACLE_SID export ORACLE_SID
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# inititalisation des variables d'environnement # initialisation des variables d'environnement
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
@@ -67,7 +76,27 @@ fi
source "$ENV_FILE" source "$ENV_FILE"
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# vérifier si ORACLE_SID est dans /etc/orata # 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 if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script"
@@ -85,8 +114,7 @@ ${SCRIPTS_DIR}/is_standby.sh ${ORACLE_SID} && exit 2
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# si ce n'est pas le user oracle qui lance le script, on quitte # si ce n'est pas le user oracle qui lance le script, on quitte
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
if (test `whoami` != $ORACLE_OWNER) if [[ "$(whoami)" != "$ORACLE_OWNER" ]]; then
then
echo echo
echo "-----------------------------------------------------" echo "-----------------------------------------------------"
echo "Vous devez etre $ORACLE_OWNER pour lancer ce script" echo "Vous devez etre $ORACLE_OWNER pour lancer ce script"
@@ -95,10 +123,10 @@ then
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# initialisation des chemins, s'ils n'existent pas ils seront créés par la commande install # initialisation des chemins, s'ils n'existent pas ils seront créés
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
install -d ${BKP_LOCATION} mkdir -p ${BKP_LOCATION}
install -d ${BKP_LOG_DIR} mkdir -p ${BKP_LOG_DIR}
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# génération du script de la sauvegarde RMAN # génération du script de la sauvegarde RMAN
@@ -139,25 +167,25 @@ EOF
LOG_MODE=$(echo $LOG_MODE | sed 's/^\s*//g') LOG_MODE=$(echo $LOG_MODE | sed 's/^\s*//g')
if [ "$LOG_MODE" == "NOARCHIVELOG" ]; then if [ "$LOG_MODE" == "NOARCHIVELOG" ]; then
echo "validate check logical database;" > ${RMAN_CMD_FILE} cat > ${RMAN_CMD_FILE} <<EOF
validate check logical database;
EOF
else else
# run { cat > ${RMAN_CMD_FILE} <<EOF
echo " alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ;
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ; CONFIGURE DEVICE TYPE DISK PARALLELISM ${PARALLELISM} ;
CONFIGURE DEVICE TYPE DISK PARALLELISM $PARALLELISM ; CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY};
CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY}; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BKP_LOCATION}/ctrlfile_auto_%F';
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BKP_LOCATION}/ctrlfile_auto_%F'; BACKUP DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/data_%T_%t_%s_%p' TAG 'DATA_${DATE_JOUR}' AS COMPRESSED BACKUPSET DATABASE;
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';
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 DEVICE TYPE DISK FORMAT '${BKP_LOCATION}/arch_%T_%t_%s_%p' TAG 'ARCH_${DATE_JOUR}' AS COMPRESSED BACKUPSET ARCHIVELOG ALL DELETE ALL INPUT; CROSSCHECK ARCHIVELOG ALL;
CROSSCHECK ARCHIVELOG ALL; DELETE NOPROMPT OBSOLETE;
DELETE NOPROMPT OBSOLETE; DELETE NOPROMPT EXPIRED BACKUPSET;
DELETE NOPROMPT EXPIRED BACKUPSET; BACKUP CURRENT CONTROLFILE FORMAT '${BKP_LOCATION}/control_%T_%t_%s_%p' TAG 'CTLFILE_${DATE_JOUR}';
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 \"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";
SQL \"CREATE PFILE=''${BKP_LOCATION}/pfile_${ORACLE_SID}.ora'' FROM SPFILE\"; EOF
" > ${RMAN_CMD_FILE}
# }
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Execution du script RMAN # Execution du script RMAN
@@ -166,17 +194,16 @@ f_print "------------------------- DEBUT DE LA BACKUP -------------------------"
${ORACLE_HOME}/bin/rman target / cmdfile=${RMAN_CMD_FILE} log=${BKP_LOG_FILE} ${ORACLE_HOME}/bin/rman target / cmdfile=${RMAN_CMD_FILE} log=${BKP_LOG_FILE}
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Mail si des erreurs dans le fichier de sauvegarde # Notification en cas d'erreur dans le fichier de sauvegarde
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# ERR_COUNT=$(egrep "^RMAN-[0-9]*|^ORA-[0-9]:" ${BKP_LOG_FILE} | wc -l) ERR_COUNT=$(egrep "^RMAN-[0-9]*|^ORA-[0-9]:" ${BKP_LOG_FILE} | wc -l)
ERR_COUNT=$(egrep "^ORA-[0-9]:" ${BKP_LOG_FILE} | wc -l)
if [ ${ERR_COUNT} -ne 0 ]; then if [ ${ERR_COUNT} -ne 0 ]; then
curl -H "t: Erreur RMAN base ${ORACLE_SID} sur le serveur $(hostname)" -d "$(cat ${BKP_LOG_FILE})" -L ${NTFY_URL} curl -H "t: Erreur RMAN base ${ORACLE_SID} sur le serveur $(hostname)" -d "$(cat ${BKP_LOG_FILE})" -L ${NTFY_URL}
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Nettoyage auto des logs : durée de concervation déterminée par la variable : ${BKP_LOG_RETENTION} # Nettoyage auto des logs : durée de conservation déterminée par la variable : ${BKP_LOG_RETENTION}
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
f_print "------------------------- NETTOYAGE DES LOGS -------------------------" f_print "------------------------- NETTOYAGE DES LOGS -------------------------"

View File

@@ -1,7 +1,9 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# ORACLE DATABASE : BACKUP ALL B # ORACLE DATABASE : BACKUP ALL B
# sauvegarde de touts les bases ouvertes (en mode archivelog) #------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
@@ -9,7 +11,7 @@ export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# boucle de sauvegarde des bases # boucle de sauvegarde des bases
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
for b in $(ps -ef | grep pmon | grep -v grep | cut -d_ -f3 | sort) for b in $(ps -ef | grep pmon | grep -v grep | cut -d_ -f3 | grep -Ev '+ASM|+APX' | sort)
do do
${SCRIPTS_DIR}/backup_rman.sh $b bash ${SCRIPTS_DIR}/backup_rman.sh $b
done done

View File

@@ -1,7 +1,20 @@
#!/bin/bash #!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------
#
# Ce script vérifie les "Transfer Log Gap" et "Apply Log Gap" pour une base
# de données Dbvisit Standby et alerte si le seuil est dépassé.
#
# --- Configuration ---
THRESHOLD=10
# --- Main ---
# Vérifier si le nombre d'arguments est correct # Vérifier si le nombre d'arguments est correct
if [ "$#" -ne 1 ]; then if [[ "$#" -ne 1 ]]; then
echo "Usage: $0 <DBNAME>" echo "Usage: $0 <DBNAME>"
exit 1 exit 1
fi fi
@@ -17,19 +30,20 @@ transfer_log_gap=$(echo "$output" | awk '/Transfer Log Gap/{print $4}')
apply_log_gap=$(echo "$output" | awk '/Apply Log Gap/{print $4}') apply_log_gap=$(echo "$output" | awk '/Apply Log Gap/{print $4}')
# Test pour Transfer Log Gap # Test pour Transfer Log Gap
if [ "$transfer_log_gap" -gt 10 ]; then if [[ "$transfer_log_gap" -gt "$THRESHOLD" ]]; then
# Afficher le message d'alerte avec la valeur actuelle # Afficher le message d'alerte avec la valeur actuelle
echo "Alerte : La valeur de Transfer Log Gap ($transfer_log_gap) pour $DBNAME est supérieure à 10." echo "Alerte : La valeur de Transfer Log Gap ($transfer_log_gap) pour $DBNAME est supérieure à $THRESHOLD."
else else
# Afficher un message indiquant que tout est OK # Afficher un message indiquant que tout est OK
echo "La valeur de Transfer Log Gap pour $DBNAME est inférieure ou égale à 10." echo "OK : La valeur de Transfer Log Gap pour $DBNAME est de $transfer_log_gap (inférieure ou égale à $THRESHOLD)."
fi fi
# Test pour Apply Log Gap # Test pour Apply Log Gap
if [ "$apply_log_gap" -gt 10 ]; then if [[ "$apply_log_gap" -gt "$THRESHOLD" ]]; then
# Afficher le message d'alerte avec la valeur actuelle # Afficher le message d'alerte avec la valeur actuelle
echo "Alerte : La valeur de Apply Log Gap ($apply_log_gap) pour $DBNAME est supérieure à 10." echo "Alerte : La valeur de Apply Log Gap ($apply_log_gap) pour $DBNAME est supérieure à $THRESHOLD."
else else
# Afficher un message indiquant que tout est OK # Afficher un message indiquant que tout est OK
echo "La valeur de Apply Log Gap pour $DBNAME est inférieure ou égale à 10." echo "OK : La valeur de Apply Log Gap pour $DBNAME est de $apply_log_gap (inférieure ou égale à $THRESHOLD)."
fi fi

View File

@@ -1,6 +1,8 @@
#!/bin/bash #!/bin/bash
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# 24/01/2019 - YOU : Premiere version pour liter les backup RMAN de 30j # Historique :
# 24/01/2019 : YOU - Premiere version pour liter les backup RMAN de 30j
# 10/11/2025 : Gemini - Améliorations : syntaxe, lisibilité et robustesse
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Environnement Variables # Environnement Variables
export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS' export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
@@ -10,10 +12,7 @@ unset NLS_LANG
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Fonction test_dba : teste si l'utilisateur est DBA # Fonction test_dba : teste si l'utilisateur est DBA
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
if test "$(id|grep dba)" if ! id | grep -q dba; then
then
echo > /dev/null
else
echo "" echo ""
echo "=============================================================" echo "============================================================="
echo " Abandon, l'utilisateur doit appartenir au groupe DBA " echo " Abandon, l'utilisateur doit appartenir au groupe DBA "
@@ -25,29 +24,29 @@ fi
# reporter toutes les instances préntes sur ce serveur # reporter toutes les instances préntes sur ce serveur
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
for r in $(ps -eaf | grep pmon | egrep -v 'grep|ASM1|APX1' | cut -d '_' -f3) for r in $(ps -eaf | grep pmon | grep -Ev 'grep|ASM1|APX1' | cut -d '_' -f3)
do do
echo "-----------------------------------------------------" echo "-----------------------------------------------------"
echo " Base de donnee a traiter: " $r echo " Base de donnee a traiter: " $r
echo "-----------------------------------------------------" echo "-----------------------------------------------------"
export ORACLE_SID=$r export ORACLE_SID=$r
# vérifier si ORACLE_SID est dans /etc/orata # vérifier si ORACLE_SID est dans /etc/oratab
if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then if ! grep -q "^${ORACLE_SID}:" /etc/oratab; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script"
exit 2 exit 2
fi fi
. oraenv -s > /dev/null . oraenv -s > /dev/null
sqlplus -S / as sysdba << EOF sqlplus -S / as sysdba << EOF
set head off pages 0 feedback off set head off pages 0 feedback off linesize 250;
set linesize 250 heading off;
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ; alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ;
set heading on pagesize 999; set heading on pagesize 999;
column status format a25; column status format a25;
column input_bytes_display format a12; column input_bytes_display format a12;
column output_bytes_display format a12; column output_bytes_display format a12;
column device_type format a10; column device_type format a10;
SET SERVEROUTPUT ON;
declare declare
base varchar2(40) ; base varchar2(40) ;
serv varchar2(40) ; serv varchar2(40) ;

View File

@@ -1,16 +1,15 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Historique : # Historique :
# 14/09/2011 : YOU - Creation # 14/09/2011 : YOU - Creation
# 14/10/2015 : YOU - script générique pour toutes les bases # 14/10/2015 : YOU - script générique pour toutes les bases
# 15/12/2022 : YOU - retention de 1 jour # 15/12/2022 : YOU - retention de 1 jour
# 25/09/2023 : YOU - simplification du passage des paramètres # 25/09/2023 : YOU - simplification du passage des paramètres
# 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et bonnes pratiques
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# fonction init : c'est ici qu'il faut modifier toutes les variables liées # Ajout de set -o pipefail pour la gestion des erreurs dans les pipes
# à l'environnement set -o pipefail
#------------------------------------------------------------------------------
export ORACLE_OWNER=oracle
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# fonction d'aide # fonction d'aide
@@ -22,7 +21,7 @@ echo "
syntaxe : $0 ORACLE_SID syntaxe : $0 ORACLE_SID
------ ------
" "
exit $1 exit
} #f_help } #f_help
@@ -30,12 +29,12 @@ exit $1
#------------ MAIN ---------------------- #------------ MAIN ----------------------
#---------------------------------------- #----------------------------------------
ORACLE_SID=$1 ORACLE_SID=
[ "${ORACLE_SID}" ] || f_help 2; [ "${ORACLE_SID}" ] || f_help 2;
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# inititalisation des variables d'environnement # initialisation des variables d'environnement
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
@@ -52,21 +51,30 @@ fi
# Charger les variables d'environnement depuis le fichier .env # Charger les variables d'environnement depuis le fichier .env
source "$ENV_FILE" source "$ENV_FILE"
#------------------------------------------------------------------------------
# Variables attendues dans le fichier .env :
#------------------------------------------------------------------------------
# ORACLE_OWNER : propritaire des binaires oracle (ex: oracle)
# EXP_LOCATION : répertoire de stockage des exports (ex: /u01/export)
# DPDIR : nom de l'objet DIRECTORY oracle (ex: DATA_PUMP_DIR)
# NTFY_URL : URL pour les notifications d'erreur (service ntfy.sh)
# NLS_LANG : partie base de la variable NLS_LANG (ex: FRENCH_FRANCE)
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# si ce n'est pas le user oracle qui lance le script, on quitte # si ce n'est pas le user oracle qui lance le script, on quitte
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
if (test `whoami` != $ORACLE_OWNER) if [[ "$(whoami)" != "$ORACLE_OWNER" ]]; then
then
echo "Vous devez etre $ORACLE_OWNER pour lancer ce script" echo "Vous devez etre $ORACLE_OWNER pour lancer ce script"
exit exit 1
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# positionner les variables d'environnement ORACLE # positionner les variables d'environnement ORACLE
# et vérifier si ORACLE_SID est dans /etc/orata # et vérifier si ORACLE_SID est dans /etc/oratab
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# vérifier si ORACLE_SID est pésente dans le fichier /etc/oratab # vérifier si ORACLE_SID est présente dans le fichier /etc/oratab
if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script"
exit 2 exit 2
@@ -95,8 +103,8 @@ NLS_CHARACTERSET=$(echo $NLS_CHARACTERSET | sed 's/^\s*//g')
# on complète la variable NLS_LANG qui vient du fichier .env avec la variable NLS_CHARACTERSET # on complète la variable NLS_LANG qui vient du fichier .env avec la variable NLS_CHARACTERSET
export NLS_LANG="${NLS_LANG}.${NLS_CHARACTERSET}" export NLS_LANG="${NLS_LANG}.${NLS_CHARACTERSET}"
# creation du repertoire de sauvegarde. S'il existe la commande install ne fait rien # creation du repertoire de sauvegarde. S'il existe la commande ne fait rien
install -d ${EXP_LOCATION} mkdir -p ${EXP_LOCATION}
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# creation du répertoire DPDIR au niveau de la base # creation du répertoire DPDIR au niveau de la base
@@ -124,11 +132,11 @@ cd ${EXP_LOCATION}
tar cfz export_${ORACLE_SID}.tgz export_${ORACLE_SID}.{dmp,log} && rm -f export_${ORACLE_SID}.dmp tar cfz export_${ORACLE_SID}.tgz export_${ORACLE_SID}.{dmp,log} && rm -f export_${ORACLE_SID}.dmp
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Mail si des erreurs dans le fichier de sauvegarde # Notification en cas d'erreur dans le fichier de sauvegarde
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
EXPDP_LOG_FILE=${EXP_LOCATION}/export_${ORACLE_SID}.log EXPDP_LOG_FILE=${EXP_LOCATION}/export_${ORACLE_SID}.log
ERR_COUNT=$(egrep "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE} | wc -l) ERR_COUNT=$(grep -E "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE} | wc -l)
MSG=$(egrep "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE}) MSG=$(grep -E "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE})
if [ ${ERR_COUNT} -ne 0 ]; then if [ ${ERR_COUNT} -ne 0 ]; then
curl -H "t: Erreur expdp base ${ORACLE_SID} sur le serveur $(hostname)" -d "$MSG" -L ${NTFY_URL} curl -H "t: Erreur expdp base ${ORACLE_SID} sur le serveur $(hostname)" -d "$MSG" -L ${NTFY_URL}

View File

@@ -1,13 +1,14 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# ORACLE DATABASE : EXPDP ALL DB # ORACLE DATABASE : EXPDP ALL DB
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Historique : # Historique :
# 21/04/2023 : YOU - Creation : export datapump de toutes les bases ouvertes # 21/04/2023 : YOU - Creation : export datapump de toutes les bases ouvertes
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# inititalisation des variables d'environnement # initialisation des variables d'environnement
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
@@ -16,7 +17,7 @@ export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
# toutes les bases ouvertes sont sauvegardées par le expdp # toutes les bases ouvertes sont sauvegardées par le expdp
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
for i in $(ps -ef | grep pmon | grep -v grep | cut -d_ -f3 | egrep -v '+ASM|+APX') for i in $(ps -ef | grep pmon | grep -v grep | cut -d_ -f3 | grep -Ev '+ASM|+APX')
do do
sh ${SCRIPTS_DIR}/export_datapump.sh $i bash ${SCRIPTS_DIR}/export_datapump.sh $i
done done

View File

@@ -1,5 +1,7 @@
#!/bin/sh #!/bin/bash
#------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : performance et robustesse
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# Script pour récupérer les paramètres des bases avant migration # Script pour récupérer les paramètres des bases avant migration
# Exemple de sortie : # Exemple de sortie :
@@ -17,72 +19,97 @@
# ora12os7.local,orcl1120,orcl1120,NOARCHIVELOG,NO,NO,NO # ora12os7.local,orcl1120,orcl1120,NOARCHIVELOG,NO,NO,NO
#------------------------------------------------------------------------ #------------------------------------------------------------------------
f_sql_param() {
param=$(sqlplus -s '/ as sysdba' << EOF
set pages 0 feedback off;
select value from v\$parameter where name='$1';
EOF
)
echo "$param"
} #f_sql_param
f_nls_param() {
param=$(sqlplus -s '/ as sysdba' << EOF
set pages 0 feedback off;
select value from nls_database_parameters where PARAMETER='$1';
EOF
)
echo "$param"
} #f_nls_param
f_db_param() {
param=$(sqlplus -s '/ as sysdba' << EOF
set pages 0 feedback off;
select $1 from v\$database;
EOF
)
echo "$param"
} #f_db_param
f_ins_host_name() {
param=$(sqlplus -s '/ as sysdba' << EOF
set pages 0 feedback off;
select host_name from v\$instance;
EOF
)
echo "$param"
}
export ORAENV_ASK=NO export ORAENV_ASK=NO
# Consolidate SID discovery
# Exclude ASM and APX instances
ORACLE_SIDS=($(ps -ef | grep pmon | grep -Ev 'grep|\+ASM|\+APX' | awk '{print $8}' | cut -d_ -f3))
echo db_name,db_unique_name,global_names,db_domain,compatible,service_names,memory_target,sga_target,pga_aggregate_target,processes,open_cursors # SQL query for the first block of parameters
ps -ef | grep pmon | grep -v grep | awk '{print $8}' | cut -d_ -f3 | while read sid SQL_BLOCK1="
do set pagesize 0 feedback off heading off verify off
export ORACLE_SID=${sid} select
. oraenv -s (select host_name from v\$instance) || ',' ||
(select value from v\$parameter where name='db_name') || ',' ||
(select value from v\$parameter where name='db_unique_name') || ',' ||
(select value from v\$parameter where name='global_names') || ',' ||
(select value from v\$parameter where name='db_domain') || ',' ||
(select value from v\$parameter where name='compatible') || ',' ||
(select value from v\$parameter where name='service_names') || ',' ||
(select value from v\$parameter where name='memory_target') || ',' ||
(select value from v\$parameter where name='sga_target') || ',' ||
(select value from v\$parameter where name='pga_aggregate_target') || ',' ||
(select value from v\$parameter where name='processes') || ',' ||
(select value from v\$parameter where name='open_cursors')
from dual;
"
echo $(f_ins_host_name),$(f_sql_param "db_name"),$(f_sql_param "db_unique_name"),$(f_sql_param "global_names"),$(f_sql_param "db_domain"),$(f_sql_param "compatible"),$(f_sql_param "service_names"),$(f_sql_param "memory_target"),$(f_sql_param "sga_target"),$(f_sql_param "pga_aggregate_target"),$(f_sql_param "processes"),$(f_sql_param "open_cursors") # SQL query for the second block of parameters
SQL_BLOCK2="
set pagesize 0 feedback off heading off verify off
select
(select host_name from v\$instance) || ',' ||
(select value from v\$parameter where name='db_name') || ',' ||
(select value from v\$parameter where name='db_unique_name') || ',' ||
(select value from nls_database_parameters where PARAMETER='NLS_CHARACTERSET') || ',' ||
(select value from nls_database_parameters where PARAMETER='NLS_NCHAR_CHARACTERSET') || ',' ||
(select value from nls_database_parameters where PARAMETER='NLS_SORT') || ',' ||
(select value from nls_database_parameters where PARAMETER='NLS_LANGUAGE') || ',' ||
(select value from nls_database_parameters where PARAMETER='NLS_TERRITORY')
from dual;
"
# SQL query for the third block of parameters
SQL_BLOCK3="
set pagesize 0 feedback off heading off verify off
select
(select host_name from v\$instance) || ',' ||
(select value from v\$parameter where name='db_name') || ',' ||
(select value from v\$parameter where name='db_unique_name') || ',' ||
LOG_MODE || ',' ||
FORCE_LOGGING || ',' ||
SUPPLEMENTAL_LOG_DATA_PL || ',' ||
FLASHBACK_ON
from v\$database;
"
# Print headers
echo "db_name,db_unique_name,global_names,db_domain,compatible,service_names,memory_target,sga_target,pga_aggregate_target,processes,open_cursors"
# Loop through each discovered SID
for sid in "${ORACLE_SIDS[@]}"; do
export ORACLE_SID="${sid}"
. oraenv -s > /dev/null 2>&1 # Suppress oraenv output
# Check if the database is actually up and accessible
if sqlplus -s / as sysdba <<< "select 1 from dual;" >/dev/null 2>&1; then
sqlplus -s / as sysdba <<< "$SQL_BLOCK1" | sed 's/^\s*//;s/\s*$//'
else
echo "ERROR: Could not connect to ${ORACLE_SID}. Skipping." >&2
fi
done done
echo "---------" echo "---------"
echo db_name,db_unique_name,NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET,NLS_SORT,NLS_LANGUAGE,NLS_TERRITORY echo "db_name,db_unique_name,NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET,NLS_SORT,NLS_LANGUAGE,NLS_TERRITORY"
ps -ef | grep pmon | grep -v grep | awk '{print $8}' | cut -d_ -f3 | while read sid
do
export ORACLE_SID=${sid}
. oraenv -s
echo $(f_ins_host_name),$(f_sql_param "db_name"),$(f_sql_param "db_unique_name"),$(f_nls_param "NLS_CHARACTERSET"),$(f_nls_param "NLS_NCHAR_CHARACTERSET"),$(f_nls_param "NLS_SORT"),$(f_nls_param "NLS_LANGUAGE"),$(f_nls_param "NLS_TERRITORY") for sid in "${ORACLE_SIDS[@]}"; do
export ORACLE_SID="${sid}"
. oraenv -s > /dev/null 2>&1
if sqlplus -s / as sysdba <<< "select 1 from dual;" >/dev/null 2>&1; then
sqlplus -s / as sysdba <<< "$SQL_BLOCK2" | sed 's/^\s*//;s/\s*$//'
fi
done done
echo "---------" echo "---------"
echo db_name,db_unique_name,LOG_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_PL,FLASHBACK_ON echo "db_name,db_unique_name,LOG_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_PL,FLASHBACK_ON"
ps -ef | grep pmon | grep -v grep | awk '{print $8}' | cut -d_ -f3 | while read sid
do
export ORACLE_SID=${sid}
. oraenv -s
echo $(f_ins_host_name),$(f_sql_param "db_name"),$(f_sql_param "db_unique_name"),$(f_db_param "LOG_MODE"),$(f_db_param "FORCE_LOGGING"),$(f_db_param "SUPPLEMENTAL_LOG_DATA_PL"),$(f_db_param "FLASHBACK_ON") for sid in "${ORACLE_SIDS[@]}"; do
export ORACLE_SID="${sid}"
. oraenv -s > /dev/null 2>&1
if sqlplus -s / as sysdba <<< "select 1 from dual;" >/dev/null 2>&1; then
sqlplus -s / as sysdba <<< "$SQL_BLOCK3" | sed 's/^\s*//;s/\s*$//'
fi
done done

View File

@@ -1,3 +1,8 @@
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------
# #
# retourne true si la base est primaire # retourne true si la base est primaire
# #
@@ -8,7 +13,7 @@
f_help() { f_help() {
echo echo
echo syntax : is_primary.sh ORACLE_SID echo "syntax : $0 ORACLE_SID"
echo echo
exit $1 exit $1
@@ -18,14 +23,14 @@ exit $1
ORACLE_SID=$1 ORACLE_SID=$1
[ "${ORACLE_SID}" ] || f_help 2; [ -n "${ORACLE_SID}" ] || f_help 2;
# positionner les variables d'environnement ORACLE # positionner les variables d'environnement ORACLE
export ORACLE_SID export ORACLE_SID
# vérifier si ORACLE_SID est dans /etc/orata # vérifier si ORACLE_SID est dans /etc/oratab
if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" >&2
exit 2 exit 2
fi fi

View File

@@ -1,3 +1,8 @@
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité et robustesse
#------------------------------------------------------------------------------
# #
# retourne true si la base est standby # retourne true si la base est standby
# #
@@ -8,7 +13,7 @@
f_help() { f_help() {
echo echo
echo syntax : is_standby.sh ORACLE_SID echo "syntax : $0 ORACLE_SID"
echo echo
exit $1 exit $1
@@ -18,14 +23,14 @@ exit $1
ORACLE_SID=$1 ORACLE_SID=$1
[ "${ORACLE_SID}" ] || f_help 2; [ -n "${ORACLE_SID}" ] || f_help 2;
# positionner les variables d'environnement ORACLE # positionner les variables d'environnement ORACLE
export ORACLE_SID export ORACLE_SID
# vérifier si ORACLE_SID est dans /etc/orata # vérifier si ORACLE_SID est dans /etc/oratab
if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script" >&2
exit 2 exit 2
fi fi

View File

@@ -1,25 +1,22 @@
#!/bin/bash #!/bin/bash
#. /home/oracle/.bash_profile #------------------------------------------------------------------------------
# Ce script est conçu pour purger les anciens fichiers de log des listeners Oracle.
# Il peut détecter automatiquement les listeners actifs ou cibler des listeners spécifiques.
# Il offre des options pour définir la durée de rétention, un mode verbeux et un mode "dry-run".
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : syntaxe, lisibilité et robustesse
#------------------------------------------------------------------------------
# Find the FULL path of the script, and add the directory it is in to the PATH, # Find the FULL path of the script, and add the directory it is in to the PATH,
# Thus effectively allowing all ohter scripts to be used # Thus effectively allowing all ohter scripts to be used
# (They shoud be in the same directory....) # (They shoud be in the same directory....)
MYFULLNAME="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")" MYFULLNAME="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"
MYDIR=`dirname ${MYFULLNAME}` MYDIR=$(dirname "${MYFULLNAME}")
PATH=${PATH}:${MYDIR} PATH=${PATH}:${MYDIR}
MYNAME=`basename ${0}` MYNAME=$(basename "${0}")
LANG=C LANG=C
#############
test_instance()
{
ps -ef | grep pmon_${ORACLE_SID} | grep -v grep | grep -- ${ORACLE_SID} >/dev/null
if [ $? -eq 1 ]; then
return 1
else
return 0
fi
}
usage() usage()
{ {
@@ -41,6 +38,7 @@ LISTENERS_LIST=
KEEPTIME=60 KEEPTIME=60
CMD="rm" CMD="rm"
DRY=0 DRY=0
VERBOSE=0
while getopts "hdvl:k:" OPTION; do while getopts "hdvl:k:" OPTION; do
case ${OPTION} in case ${OPTION} in
@@ -68,11 +66,11 @@ while getopts "hdvl:k:" OPTION; do
esac esac
done done
if [ -z ${LISTENERS_LIST} ]; if [[ -z "${LISTENERS_LIST}" ]];
then then
# No listener given? Catch them all! # No listener given? Catch them all!
LISTENERS_LIST=`ps -ef | grep tnslsnr | grep -v grep |awk '{ print $9 }'` LISTENERS_LIST=$(ps -ef | grep tnslsnr | grep -v grep |awk '{ print $9 }')
if [[ $VERBOSE -ne 0 ]]; if [[ "${VERBOSE}" -ne 0 ]];
then then
echo "Currently active listeners: echo "Currently active listeners:
${LISTENERS_LIST}." ${LISTENERS_LIST}."
@@ -81,67 +79,68 @@ fi
for LISTENER in ${LISTENERS_LIST}; for LISTENER in ${LISTENERS_LIST};
do do
if [[ $VERBOSE -ne 0 ]]; then if [[ "${VERBOSE}" -ne 0 ]]; then
echo "Treating listener ${LISTENER}:" echo "Treating listener ${LISTENER}:"
fi fi
# Fetching the ORACLE_HOME for the listener, based on the executable's name... # Fetching the ORACLE_HOME for the listener, based on the executable's name...
OH_BIN=`ps -ef | grep "tnslsnr ${LISTENER} " | grep -v grep | awk '{ print $8 }'` OH_BIN=$(ps -ef | grep "tnslsnr ${LISTENER} " | grep -v grep | awk '{ print $8 }')
OH_BIN=`dirname ${OH_BIN}` OH_BIN=$(dirname "${OH_BIN}")
export ORACLE_HOME=`dirname ${OH_BIN}` export ORACLE_HOME=$(dirname "${OH_BIN}")
if [[ $VERBOSE -ne 0 ]]; if [[ "${VERBOSE}" -ne 0 ]];
then then
echo "The ORACLE_HOME is ${ORACLE_HOME}" echo "The ORACLE_HOME is ${ORACLE_HOME}"
fi fi
if ${ORACLE_HOME}/bin/lsnrctl status ${LISTENER} >/dev/null 2>&1 ; if "${ORACLE_HOME}"/bin/lsnrctl status "${LISTENER}" >/dev/null 2>&1 ;
then then
LOGFILE=`${ORACLE_HOME}/bin/lsnrctl status ${LISTENER} | grep "^Listener Log File" | awk '{print $4}'` LOGFILE=$("${ORACLE_HOME}"/bin/lsnrctl status "${LISTENER}" | grep "^Listener Log File" | awk '{print $4}')
BASE=`basename ${LOGFILE}` BASE=$(basename "${LOGFILE}")
DIR=`dirname ${LOGFILE}` DIR=$(dirname "${LOGFILE}")
if [[ ${BASE} == "log.xml" ]]; then if [[ "${BASE}" == "log.xml" ]]; then
VERSION=11 VERSION=11
else else
VERSION=10 VERSION=10
fi fi
if [[ $VERBOSE -ne 0 ]]; then if [[ "${VERBOSE}" -ne 0 ]]; then
PRINT="-print " PRINT="-print "
echo "this is a v${VERSION} listener, with logfile ${BASE} in ${DIR}." echo "this is a v${VERSION} listener, with logfile ${BASE} in ${DIR}."
else else
PRINT="" PRINT=""
fi fi
if [[ ${VERSION} -eq 11 ]]; if [[ "${VERSION}" -eq 11 ]];
then then
# Purge the lingering *.xlm logfiles in there # Purge the lingering *.xlm logfiles in there
find ${DIR} -name "log_*.xml" -mtime +${KEEPTIME} ${PRINT} -exec ${CMD} {} \; find "${DIR}" -name "log_*.xml" -mtime "+${KEEPTIME}" ${PRINT} -exec ${CMD} {} \;
# now forge the ${DIR} into some v10 compatible one: # now forge the ${DIR} into some v10 compatible one:
DIR=`dirname ${DIR}`/trace DIR=$(dirname "${DIR}")/trace
# and ${LOGFILE} as well: # and ${LOGFILE} as well:
# First some magic to get the filename (Oracls ${DIR} | grep -i ${LISTENER}".log$"le uses lowercase sometimes) # First some magic to get the filename (Oracle uses lowercase sometimes)
LOGFILE=`ls ${DIR} | grep -i ${LISTENER}".log$"` LOGFILE=$(ls "${DIR}" | grep -i "${LISTENER}.log$")
# And prepend the directory's name # And prepend the directory's name
LOGFILE=${DIR}"/"${LOGFILE} LOGFILE="${DIR}"/"${LOGFILE}"
# And continue as if we were in v10... # And continue as if we were in v10...
BASE=`basename ${LOGFILE}` BASE=$(basename "${LOGFILE}")
DIR=`dirname ${LOGFILE}` DIR=$(dirname "${LOGFILE}")
fi fi
# Copy the listener*.log # Copy the listener*.log
DATETIME=`date +%Y%m%d_%H%M%S` DATETIME=$(date +%Y%m%d_%H%M%S)
if [[ $VERBOSE -ne 0 ]]; then if [[ "${VERBOSE}" -ne 0 ]]; then
echo "Saving ${LOGFILE} to ${LOGFILE}_${DATETIME}" echo "Saving ${LOGFILE} to ${LOGFILE}_${DATETIME}"
fi fi
if [[ ${DRY} -eq 0 ]]; then if [[ "${DRY}" -eq 0 ]]; then
cp ${LOGFILE} ${LOGFILE}_${DATETIME} && > ${LOGFILE} cp "${LOGFILE}" "${LOGFILE}_${DATETIME}" && > "${LOGFILE}"
else else
echo "Would have moved ${LOGFILE} to ${LOGFILE}_${DATETIME}, and truncated ${LOGFILE}". echo "Would have moved ${LOGFILE} to ${LOGFILE}_${DATETIME}, and truncated ${LOGFILE}".
fi fi
find ${DIR} -name "${BASE}_*" -mtime +${KEEPTIME} ${PRINT} -exec ${CMD} {} \; find "${DIR}" -name "${BASE}_*" -mtime "+${KEEPTIME}" ${PRINT} -exec ${CMD} {} \;
else else
echo "Listener ${LISTENER} not responding." echo "Listener ${LISTENER} not responding."
fi fi
done done

View File

@@ -1,5 +1,10 @@
#!/bin/bash #!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et efficacité
#------------------------------------------------------------------------------
LANG=C LANG=C
COL_NORMAL=$(tput sgr0) COL_NORMAL=$(tput sgr0)
COL_ROUGE=$(tput setaf 1) COL_ROUGE=$(tput setaf 1)
@@ -48,8 +53,7 @@ show_alert()
-e "s,.*WARNING.*,${COL_VIOLET}&${COL_NORMAL},g" \ -e "s,.*WARNING.*,${COL_VIOLET}&${COL_NORMAL},g" \
-e "s,.*(ERROR:|ORA-|drop|DROP|Delete).*,${GRAS}${COL_ROUGE}&${COL_NORMAL},g" \ -e "s,.*(ERROR:|ORA-|drop|DROP|Delete).*,${GRAS}${COL_ROUGE}&${COL_NORMAL},g" \
-e "s,^(ARC|RFS|LNS|MRP).*,${COL_BLUE}&${COL_NORMAL},g" \ -e "s,^(ARC|RFS|LNS|MRP).*,${COL_BLUE}&${COL_NORMAL},g" \
-e "s,.*(Online Redo|online redo|Current log).*,${COL_CYAN}&${COL_NORMAL},g" \ -e "s,.*(Online Redo|online redo|Current log).*,${COL_CYAN}&${COL_NORMAL},g"
-e "s,.*,${COL_NORMAL}&${COL_NORMAL},"
} }
@@ -88,7 +92,7 @@ fi
# determiner si c'est une instance DB ou ASM # determiner si c'est une instance DB ou ASM
# si l'instant est ASM alors le sous reprtoire est asm, sinon rdbms # si l'instant est ASM alors le sous reprtoire est asm, sinon rdbms
#-------------------------------------------- #--------------------------------------------
if [ "$(echo ${ORACLE_SID} | tr A-Z a-z | grep asm)" ]; then if [[ "${ORACLE_SID}" == "+ASM"* ]]; then
SUB_DIR="asm" SUB_DIR="asm"
else else
SUB_DIR="rdbms" SUB_DIR="rdbms"
@@ -97,7 +101,7 @@ fi
#-------------------------------------------- #--------------------------------------------
# determiner si l'instance est dans /etc/oratab # determiner si l'instance est dans /etc/oratab
#-------------------------------------------- #--------------------------------------------
if [ $(cat /etc/oratab | grep "^${ORACLE_SID}:" | grep -v grep | wc -l) -eq 0 ] ; if ! grep -q "^${ORACLE_SID}:" /etc/oratab ;
then then
# pas d'entrée dans /etc/oratab # pas d'entrée dans /etc/oratab
echo "-----" echo "-----"
@@ -109,7 +113,7 @@ fi
#-------------------------------------------- #--------------------------------------------
# determiner si l'instance est démarrée ou pas # determiner si l'instance est démarrée ou pas
#-------------------------------------------- #--------------------------------------------
if [ $(ps -ef | grep pmon_${ORACLE_SID}\$ | grep -v grep | wc -l) -eq 1 ] ; if pgrep -f "pmon_${ORACLE_SID}$" >/dev/null ;
then then
# instance démarrée, on lui demande le chemin vers l'alertlog # instance démarrée, on lui demande le chemin vers l'alertlog
@@ -118,13 +122,15 @@ then
export ORAENV_ASK=NO export ORAENV_ASK=NO
. oraenv -s >/dev/null . oraenv -s >/dev/null
SQL1="set head off" SQL_QUERY="
SQL2="select value from v\$parameter where name='diagnostic_dest';" set pagesize 0 feedback off heading off verify off
DIAG_DEST=$(echo -e "$SQL1\n$SQL2" | sqlplus -s / as sysdba | grep -v "^$") select value from v\$parameter where name='diagnostic_dest';
select value from v\$parameter where name='db_unique_name';
SQL1="set head off" "
SQL2="select value from v\$parameter where name='db_unique_name';" # Exécute la requête SQL, filtre les lignes vides/blanches, et supprime les espaces en début/fin de ligne
DB_UNIQ_NAME=$(echo -e "$SQL1\n$SQL2" | sqlplus -s / as sysdba | grep -v "^$") SQL_OUTPUT=$(echo -e "$SQL_QUERY" | sqlplus -s / as sysdba | grep -vE '^\s*$' | sed 's/^\s*//g;s/\s*$//g')
DIAG_DEST=$(echo "$SQL_OUTPUT" | head -n 1)
DB_UNIQ_NAME=$(echo "$SQL_OUTPUT" | tail -n 1)
F_ALERT="${DIAG_DEST}/diag/${SUB_DIR}/$(echo ${DB_UNIQ_NAME} | tr 'A-Z' 'a-z')/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log" F_ALERT="${DIAG_DEST}/diag/${SUB_DIR}/$(echo ${DB_UNIQ_NAME} | tr 'A-Z' 'a-z')/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log"
else else
@@ -144,7 +150,7 @@ then
else else
echo echo
echo "-----" echo "-----"
echo "----- le fichier : ${COL_ROUGE}${GRAS_ARR_PLAN}${F_ALERT}${COL_NORMAL} est introuvable !!" echo "----- le fichier : ${COL_ROUGE}${GRAS}${F_ALERT}${COL_NORMAL} est introuvable !!"
echo "-----" echo "-----"
echo echo
exit 1 exit 1

View File

@@ -1,5 +1,10 @@
#!/bin/bash #!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et efficacité
#------------------------------------------------------------------------------
LANG=C LANG=C
COL_NORMAL=$(tput sgr0) COL_NORMAL=$(tput sgr0)
COL_ROUGE=$(tput setaf 1) COL_ROUGE=$(tput setaf 1)
@@ -32,11 +37,11 @@ EOF
#-------------------------------------------- #--------------------------------------------
#--------------- Fonction d'affichage coloré du fichier log #--------------- Fonction d'affichage coloré du fichier log
#-------------------------------------------- #--------------------------------------------
show_alert() show_listener_log()
{ {
echo ${COL_ROUGE} echo ${COL_ROUGE}
echo =========== echo ===========
echo Fichier alert : ${TRC_LOG} echo Fichier log Listener : ${TRC_LOG}
echo Ctrl + C pour quitter echo Ctrl + C pour quitter
echo =========== echo ===========
echo ${COL_NORMAL} echo ${COL_NORMAL}
@@ -46,8 +51,7 @@ show_alert()
-e "s,^($(date +'%Y-%m-%d')).*,${COL_JAUNE}&${COL_NORMAL},g" \ -e "s,^($(date +'%Y-%m-%d')).*,${COL_JAUNE}&${COL_NORMAL},g" \
-e "s,.*WARNING.*,${COL_VIOLET}&${COL_NORMAL},g" \ -e "s,.*WARNING.*,${COL_VIOLET}&${COL_NORMAL},g" \
-e "s,.*(ERROR:|ORA-|TNS-).*,${GRAS}${COL_ROUGE}&${COL_NORMAL},g" \ -e "s,.*(ERROR:|ORA-|TNS-).*,${GRAS}${COL_ROUGE}&${COL_NORMAL},g" \
-e "s,.*(stop|start|Start).*,${COL_CYAN}&${COL_NORMAL},g" \ -e "s,.*(stop|start|Start).*,${COL_CYAN}&${COL_NORMAL},g"
-e "s,.*,${COL_NORMAL}&${COL_NORMAL},"
} }
@@ -92,14 +96,14 @@ UPPER_LISTENER_NAME=$(echo ${LISTENER_NAME} | tr 'a-z' 'A-Z')
# determiner si le listener est démarrée ou pas # determiner si le listener est démarrée ou pas
if [ $(ps -ef | grep "tnslsnr ${UPPER_LISTENER_NAME}" | grep -v grep | wc -l) -eq 1 ] ; if pgrep -f "tnslsnr ${UPPER_LISTENER_NAME}" >/dev/null ;
then then
# listener démarré, on lui demande le chemin vers le fichier log # listener démarré, on lui demande le chemin vers le fichier log
TRC_DIR=$(lsnrctl show trc_directory ${UPPER_LISTENER_NAME} | grep "^LISTENER parameter" | cut -d' ' -f6) TRC_DIR=$(lsnrctl show trc_directory ${UPPER_LISTENER_NAME} | grep "TRC_DIRECTORY =" | cut -d'=' -f2 | tr -d '[:space:]"')
TRC_LOG=${TRC_DIR}/${LOWER_LISTENER_NAME}.log TRC_LOG=${TRC_DIR}/${LOWER_LISTENER_NAME}.log
else else
# le listener n'est pas démarré, on récupère le chemin par défaut # le listener n'est pas démarré, on récupère le chemin par défaut
DIAG_DEST=$(adrci exec="SHOW BASE" | grep -o '".*"' | tr -d '"') DIAG_DEST=$(adrci exec="SHOW BASE" | grep "ADR base is" | cut -d'"' -f2)
H_NAME=$(hostname | cut -d. -f1) H_NAME=$(hostname | cut -d. -f1)
TRC_LOG="${DIAG_DEST}/diag/tnslsnr/${H_NAME}/${LOWER_LISTENER_NAME}/trace/${LOWER_LISTENER_NAME}.log" TRC_LOG="${DIAG_DEST}/diag/tnslsnr/${H_NAME}/${LOWER_LISTENER_NAME}/trace/${LOWER_LISTENER_NAME}.log"
fi fi
@@ -109,10 +113,10 @@ fi
#-------------------------------------------- #--------------------------------------------
if [ -e "${TRC_LOG}" ] if [ -e "${TRC_LOG}" ]
then then
show_alert show_listener_log
else else
echo echo
echo "le fichier : ${COL_ROUGE}${GRAS_ARR_PLAN}${TRC_LOG}${COL_NORMAL} est introuvable !!" echo "le fichier : ${COL_ROUGE}${GRAS}${TRC_LOG}${COL_NORMAL} est introuvable !!"
echo echo
exit 1 exit 1
echo echo