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)
# 00 05 * * 0 adr_purge.sh
# Add the above line with `crontab -e` to the oracle user's cron
ALERT_RET="129600" # 90 Days
INCIDENT_RET="43200" # 30 Days
TRACE_RET="43200" # 30 Days
CDUMP_RET="43200" # 30 Days
HM_RET="43200" # 30 Days
# --- Configuration de la rétention en JOURS ---
ALERT_RET_DAYS=90
INCIDENT_RET_DAYS=30
TRACE_RET_DAYS=30
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
do
echo "INFO: adrci purging diagnostic destination " $file_line
echo "INFO: purging ALERT older than 90 days"
adrci exec="set homepath $file_line;purge -age $ALERT_RET -type ALERT"
echo "INFO: purging INCIDENT older than 30 days"
adrci exec="set homepath $file_line;purge -age $INCIDENT_RET -type INCIDENT"
echo "INFO: purging TRACE older than 30 days"
adrci exec="set homepath $file_line;purge -age $TRACE_RET -type TRACE"
echo "INFO: purging CDUMP older than 30 days"
adrci exec="set homepath $file_line;purge -age $CDUMP_RET -type CDUMP"
echo "INFO: purging HM older than 30 days"
adrci exec="set homepath $file_line;purge -age $HM_RET -type HM"
echo "INFO: adrci purging diagnostic destination \"$file_line\""
echo "INFO: purging ALERT older than $ALERT_RET_DAYS days"
adrci exec="set homepath '$file_line';purge -age $ALERT_RET_MINUTES -type ALERT"
echo "INFO: purging INCIDENT older than $INCIDENT_RET_DAYS days"
adrci exec="set homepath '$file_line';purge -age $INCIDENT_RET_MINUTES -type INCIDENT"
echo "INFO: purging TRACE older than $TRACE_RET_DAYS days"
adrci exec="set homepath '$file_line';purge -age $TRACE_RET_MINUTES -type TRACE"
echo "INFO: purging CDUMP older than $CDUMP_RET_DAYS days"
adrci exec="set homepath '$file_line';purge -age $CDUMP_RET_MINUTES -type CDUMP"
echo "INFO: purging HM older than $HM_RET_DAYS days"
adrci exec="set homepath '$file_line';purge -age $HM_RET_MINUTES -type HM"
echo ""
echo ""
done
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 :
# 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)
@@ -26,24 +31,41 @@ fi
# Charger les variables d'environnement depuis le fichier .env
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
install -d ${BKP_APP_LOCATION}
mkdir -p ${BKP_APP_LOCATION}
#------------------------------------------------------------------------------
# sauvegarde
#------------------------------------------------------------------------------
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
# 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/audit" \
--exclude="${ORA_APP_LOCATION}/oracle/diag" \
${ORA_APP_LOCATION}
# notification
curl -d "$(hostname) - backup des binaires terminée" ${NTFY_URL}
"${ORA_APP_LOCATION}"; then
# notification de succès
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
#------------------------------------------------------------------------------
@@ -12,8 +12,12 @@
# 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
@@ -21,7 +25,7 @@
f_help() {
cat <<CATEOF
syntax : $O ORACLE_SID
syntax : $0 ORACLE_SID
CATEOF
exit $1
@@ -33,7 +37,12 @@ exit $1
#------------------------------------------------------------------------------
f_print()
{
echo "[`date +"%Y/%m/%d %H:%M:%S"`] : $1" >> $BKP_LOG_FILE
# 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
fi
} #f_print
@@ -49,7 +58,7 @@ ORACLE_SID=$1
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)
@@ -67,7 +76,27 @@ fi
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
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
#------------------------------------------------------------------------------
if (test `whoami` != $ORACLE_OWNER)
then
if [[ "$(whoami)" != "$ORACLE_OWNER" ]]; then
echo
echo "-----------------------------------------------------"
echo "Vous devez etre $ORACLE_OWNER pour lancer ce script"
@@ -95,10 +123,10 @@ then
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}
install -d ${BKP_LOG_DIR}
mkdir -p ${BKP_LOCATION}
mkdir -p ${BKP_LOG_DIR}
#------------------------------------------------------------------------------
# génération du script de la sauvegarde RMAN
@@ -139,25 +167,25 @@ EOF
LOG_MODE=$(echo $LOG_MODE | sed 's/^\s*//g')
if [ "$LOG_MODE" == "NOARCHIVELOG" ]; then
echo "validate check logical database;" > ${RMAN_CMD_FILE}
cat > ${RMAN_CMD_FILE} <<EOF
validate check logical database;
EOF
else
# run {
echo "
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ;
CONFIGURE DEVICE TYPE DISK PARALLELISM $PARALLELISM ;
CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY};
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;
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;
CROSSCHECK ARCHIVELOG ALL;
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}
# }
cat > ${RMAN_CMD_FILE} <<EOF
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ;
CONFIGURE DEVICE TYPE DISK PARALLELISM ${PARALLELISM} ;
CONFIGURE RETENTION POLICY TO REDUNDANCY ${BKP_REDUNDANCY};
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;
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;
CROSSCHECK ARCHIVELOG ALL;
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";
EOF
fi
#------------------------------------------------------------------------------
# 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}
#------------------------------------------------------------------------------
# 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 "^ORA-[0-9]:" ${BKP_LOG_FILE} | wc -l)
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 ${NTFY_URL}
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 -------------------------"

View File

@@ -1,7 +1,9 @@
#!/bin/sh
#!/bin/bash
#------------------------------------------------------------------------------
# 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)
@@ -9,7 +11,7 @@ export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
#------------------------------------------------------------------------------
# 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
${SCRIPTS_DIR}/backup_rman.sh $b
bash ${SCRIPTS_DIR}/backup_rman.sh $b
done

View File

@@ -1,7 +1,20 @@
#!/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
if [ "$#" -ne 1 ]; then
if [[ "$#" -ne 1 ]]; then
echo "Usage: $0 <DBNAME>"
exit 1
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}')
# 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
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
# 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
# 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
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
# 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

View File

@@ -1,6 +1,8 @@
#!/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
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
#---------------------------------------------------------------------------
if test "$(id|grep dba)"
then
echo > /dev/null
else
if ! id | grep -q dba; then
echo ""
echo "============================================================="
echo " Abandon, l'utilisateur doit appartenir au groupe DBA "
@@ -25,29 +24,29 @@ fi
# 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
echo "-----------------------------------------------------"
echo " Base de donnee a traiter: " $r
echo "-----------------------------------------------------"
export ORACLE_SID=$r
# vérifier si ORACLE_SID est dans /etc/orata
if [ "$(grep -v '^$|^#' /etc/oratab | grep -c "^${ORACLE_SID}:")" -ne 1 ]; then
# vérifier si ORACLE_SID est dans /etc/oratab
if ! grep -q "^${ORACLE_SID}:" /etc/oratab; then
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script"
exit 2
fi
. oraenv -s > /dev/null
sqlplus -S / as sysdba << EOF
set head off pages 0 feedback off
set linesize 250 heading off;
set head off pages 0 feedback off linesize 250;
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS' ;
set heading on pagesize 999;
column status format a25;
column input_bytes_display format a12;
column output_bytes_display format a12;
column device_type format a10;
SET SERVEROUTPUT ON;
declare
base varchar2(40) ;
serv varchar2(40) ;

View File

@@ -1,16 +1,15 @@
#!/bin/sh
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 14/09/2011 : YOU - Creation
# 14/10/2015 : YOU - script générique pour toutes les bases
# 15/12/2022 : YOU - retention de 1 jour
# 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
# à l'environnement
#------------------------------------------------------------------------------
export ORACLE_OWNER=oracle
# Ajout de set -o pipefail pour la gestion des erreurs dans les pipes
set -o pipefail
#------------------------------------------------------------------------------
# fonction d'aide
@@ -22,7 +21,7 @@ echo "
syntaxe : $0 ORACLE_SID
------
"
exit $1
exit
} #f_help
@@ -30,12 +29,12 @@ exit $1
#------------ MAIN ----------------------
#----------------------------------------
ORACLE_SID=$1
ORACLE_SID=
[ "${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)
@@ -52,21 +51,30 @@ 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)
# 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
#------------------------------------------------------------------------------
if (test `whoami` != $ORACLE_OWNER)
then
if [[ "$(whoami)" != "$ORACLE_OWNER" ]]; then
echo "Vous devez etre $ORACLE_OWNER pour lancer ce script"
exit
exit 1
fi
#------------------------------------------------------------------------------
# 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
echo "Base ${ORACLE_SID} absente du fichier /etc/oratab ... fin du script"
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
export NLS_LANG="${NLS_LANG}.${NLS_CHARACTERSET}"
# creation du repertoire de sauvegarde. S'il existe la commande install ne fait rien
install -d ${EXP_LOCATION}
# creation du repertoire de sauvegarde. S'il existe la commande ne fait rien
mkdir -p ${EXP_LOCATION}
#------------------------------------------------------------------------------
# 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
#------------------------------------------------------------------------------
# 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
ERR_COUNT=$(egrep "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE} | wc -l)
MSG=$(egrep "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE})
ERR_COUNT=$(grep -E "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE} | wc -l)
MSG=$(grep -E "^EXP-[0-9]*|^ORA-[0-9]:" ${EXPDP_LOG_FILE})
if [ ${ERR_COUNT} -ne 0 ]; then
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
#------------------------------------------------------------------------------
# Historique :
# 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)
@@ -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
#------------------------------------------------------------------------------
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
sh ${SCRIPTS_DIR}/export_datapump.sh $i
bash ${SCRIPTS_DIR}/export_datapump.sh $i
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
# Exemple de sortie :
@@ -17,72 +19,97 @@
# 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
# 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
ps -ef | grep pmon | grep -v grep | awk '{print $8}' | cut -d_ -f3 | while read sid
do
export ORACLE_SID=${sid}
. oraenv -s
# SQL query for the first block of parameters
SQL_BLOCK1="
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 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
echo "---------"
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 "db_name,db_unique_name,NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET,NLS_SORT,NLS_LANGUAGE,NLS_TERRITORY"
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
echo "---------"
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 "db_name,db_unique_name,LOG_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_PL,FLASHBACK_ON"
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

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
#
@@ -8,7 +13,7 @@
f_help() {
echo
echo syntax : is_primary.sh ORACLE_SID
echo "syntax : $0 ORACLE_SID"
echo
exit $1
@@ -18,14 +23,14 @@ exit $1
ORACLE_SID=$1
[ "${ORACLE_SID}" ] || f_help 2;
[ -n "${ORACLE_SID}" ] || f_help 2;
# positionner les variables d'environnement ORACLE
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
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
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
#
@@ -8,7 +13,7 @@
f_help() {
echo
echo syntax : is_standby.sh ORACLE_SID
echo "syntax : $0 ORACLE_SID"
echo
exit $1
@@ -18,14 +23,14 @@ exit $1
ORACLE_SID=$1
[ "${ORACLE_SID}" ] || f_help 2;
[ -n "${ORACLE_SID}" ] || f_help 2;
# positionner les variables d'environnement ORACLE
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
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
fi

View File

@@ -1,25 +1,22 @@
#!/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,
# Thus effectively allowing all ohter scripts to be used
# (They shoud be in the same directory....)
MYFULLNAME="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"
MYDIR=`dirname ${MYFULLNAME}`
MYDIR=$(dirname "${MYFULLNAME}")
PATH=${PATH}:${MYDIR}
MYNAME=`basename ${0}`
MYNAME=$(basename "${0}")
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()
{
@@ -41,6 +38,7 @@ LISTENERS_LIST=
KEEPTIME=60
CMD="rm"
DRY=0
VERBOSE=0
while getopts "hdvl:k:" OPTION; do
case ${OPTION} in
@@ -68,11 +66,11 @@ while getopts "hdvl:k:" OPTION; do
esac
done
if [ -z ${LISTENERS_LIST} ];
if [[ -z "${LISTENERS_LIST}" ]];
then
# No listener given? Catch them all!
LISTENERS_LIST=`ps -ef | grep tnslsnr | grep -v grep |awk '{ print $9 }'`
if [[ $VERBOSE -ne 0 ]];
LISTENERS_LIST=$(ps -ef | grep tnslsnr | grep -v grep |awk '{ print $9 }')
if [[ "${VERBOSE}" -ne 0 ]];
then
echo "Currently active listeners:
${LISTENERS_LIST}."
@@ -81,67 +79,68 @@ fi
for LISTENER in ${LISTENERS_LIST};
do
if [[ $VERBOSE -ne 0 ]]; then
if [[ "${VERBOSE}" -ne 0 ]]; then
echo "Treating listener ${LISTENER}:"
fi
# 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=`dirname ${OH_BIN}`
export ORACLE_HOME=`dirname ${OH_BIN}`
if [[ $VERBOSE -ne 0 ]];
OH_BIN=$(ps -ef | grep "tnslsnr ${LISTENER} " | grep -v grep | awk '{ print $8 }')
OH_BIN=$(dirname "${OH_BIN}")
export ORACLE_HOME=$(dirname "${OH_BIN}")
if [[ "${VERBOSE}" -ne 0 ]];
then
echo "The ORACLE_HOME is ${ORACLE_HOME}"
fi
if ${ORACLE_HOME}/bin/lsnrctl status ${LISTENER} >/dev/null 2>&1 ;
if "${ORACLE_HOME}"/bin/lsnrctl status "${LISTENER}" >/dev/null 2>&1 ;
then
LOGFILE=`${ORACLE_HOME}/bin/lsnrctl status ${LISTENER} | grep "^Listener Log File" | awk '{print $4}'`
BASE=`basename ${LOGFILE}`
DIR=`dirname ${LOGFILE}`
LOGFILE=$("${ORACLE_HOME}"/bin/lsnrctl status "${LISTENER}" | grep "^Listener Log File" | awk '{print $4}')
BASE=$(basename "${LOGFILE}")
DIR=$(dirname "${LOGFILE}")
if [[ ${BASE} == "log.xml" ]]; then
if [[ "${BASE}" == "log.xml" ]]; then
VERSION=11
else
VERSION=10
fi
if [[ $VERBOSE -ne 0 ]]; then
if [[ "${VERBOSE}" -ne 0 ]]; then
PRINT="-print "
echo "this is a v${VERSION} listener, with logfile ${BASE} in ${DIR}."
else
PRINT=""
fi
if [[ ${VERSION} -eq 11 ]];
if [[ "${VERSION}" -eq 11 ]];
then
# 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:
DIR=`dirname ${DIR}`/trace
DIR=$(dirname "${DIR}")/trace
# and ${LOGFILE} as well:
# First some magic to get the filename (Oracls ${DIR} | grep -i ${LISTENER}".log$"le uses lowercase sometimes)
LOGFILE=`ls ${DIR} | grep -i ${LISTENER}".log$"`
# First some magic to get the filename (Oracle uses lowercase sometimes)
LOGFILE=$(ls "${DIR}" | grep -i "${LISTENER}.log$")
# And prepend the directory's name
LOGFILE=${DIR}"/"${LOGFILE}
LOGFILE="${DIR}"/"${LOGFILE}"
# And continue as if we were in v10...
BASE=`basename ${LOGFILE}`
DIR=`dirname ${LOGFILE}`
BASE=$(basename "${LOGFILE}")
DIR=$(dirname "${LOGFILE}")
fi
# Copy the listener*.log
DATETIME=`date +%Y%m%d_%H%M%S`
if [[ $VERBOSE -ne 0 ]]; then
DATETIME=$(date +%Y%m%d_%H%M%S)
if [[ "${VERBOSE}" -ne 0 ]]; then
echo "Saving ${LOGFILE} to ${LOGFILE}_${DATETIME}"
fi
if [[ ${DRY} -eq 0 ]]; then
cp ${LOGFILE} ${LOGFILE}_${DATETIME} && > ${LOGFILE}
if [[ "${DRY}" -eq 0 ]]; then
cp "${LOGFILE}" "${LOGFILE}_${DATETIME}" && > "${LOGFILE}"
else
echo "Would have moved ${LOGFILE} to ${LOGFILE}_${DATETIME}, and truncated ${LOGFILE}".
fi
find ${DIR} -name "${BASE}_*" -mtime +${KEEPTIME} ${PRINT} -exec ${CMD} {} \;
find "${DIR}" -name "${BASE}_*" -mtime "+${KEEPTIME}" ${PRINT} -exec ${CMD} {} \;
else
echo "Listener ${LISTENER} not responding."
fi
done

View File

@@ -1,5 +1,10 @@
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et efficacité
#------------------------------------------------------------------------------
LANG=C
COL_NORMAL=$(tput sgr0)
COL_ROUGE=$(tput setaf 1)
@@ -48,8 +53,7 @@ show_alert()
-e "s,.*WARNING.*,${COL_VIOLET}&${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,.*(Online Redo|online redo|Current log).*,${COL_CYAN}&${COL_NORMAL},g" \
-e "s,.*,${COL_NORMAL}&${COL_NORMAL},"
-e "s,.*(Online Redo|online redo|Current log).*,${COL_CYAN}&${COL_NORMAL},g"
}
@@ -88,7 +92,7 @@ fi
# determiner si c'est une instance DB ou ASM
# 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"
else
SUB_DIR="rdbms"
@@ -97,7 +101,7 @@ fi
#--------------------------------------------
# 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
# pas d'entrée dans /etc/oratab
echo "-----"
@@ -109,7 +113,7 @@ fi
#--------------------------------------------
# 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
# instance démarrée, on lui demande le chemin vers l'alertlog
@@ -118,13 +122,15 @@ then
export ORAENV_ASK=NO
. oraenv -s >/dev/null
SQL1="set head off"
SQL2="select value from v\$parameter where name='diagnostic_dest';"
DIAG_DEST=$(echo -e "$SQL1\n$SQL2" | sqlplus -s / as sysdba | grep -v "^$")
SQL1="set head off"
SQL2="select value from v\$parameter where name='db_unique_name';"
DB_UNIQ_NAME=$(echo -e "$SQL1\n$SQL2" | sqlplus -s / as sysdba | grep -v "^$")
SQL_QUERY="
set pagesize 0 feedback off heading off verify off
select value from v\$parameter where name='diagnostic_dest';
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
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"
else
@@ -144,7 +150,7 @@ then
else
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
exit 1

View File

@@ -1,5 +1,10 @@
#!/bin/bash
#------------------------------------------------------------------------------
# Historique :
# 10/11/2025 : Gemini - Améliorations : lisibilité, robustesse et efficacité
#------------------------------------------------------------------------------
LANG=C
COL_NORMAL=$(tput sgr0)
COL_ROUGE=$(tput setaf 1)
@@ -32,11 +37,11 @@ EOF
#--------------------------------------------
#--------------- Fonction d'affichage coloré du fichier log
#--------------------------------------------
show_alert()
show_listener_log()
{
echo ${COL_ROUGE}
echo ===========
echo Fichier alert : ${TRC_LOG}
echo Fichier log Listener : ${TRC_LOG}
echo Ctrl + C pour quitter
echo ===========
echo ${COL_NORMAL}
@@ -46,8 +51,7 @@ show_alert()
-e "s,^($(date +'%Y-%m-%d')).*,${COL_JAUNE}&${COL_NORMAL},g" \
-e "s,.*WARNING.*,${COL_VIOLET}&${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,.*,${COL_NORMAL}&${COL_NORMAL},"
-e "s,.*(stop|start|Start).*,${COL_CYAN}&${COL_NORMAL},g"
}
@@ -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
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
# 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
else
# 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)
TRC_LOG="${DIAG_DEST}/diag/tnslsnr/${H_NAME}/${LOWER_LISTENER_NAME}/trace/${LOWER_LISTENER_NAME}.log"
fi
@@ -109,10 +113,10 @@ fi
#--------------------------------------------
if [ -e "${TRC_LOG}" ]
then
show_alert
show_listener_log
else
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
exit 1
echo