mise à jour v2

Grosse mise à jour :
- style moderne des tableaux et code
- code structuré et factorisé
- sql et sh affinés
This commit is contained in:
Yacine31
2025-11-19 15:55:11 +01:00
parent 2832bd82e8
commit 4e7683aee2
66 changed files with 586 additions and 577 deletions

View File

@@ -1 +1 @@
export EXPDP_DIR="/u04/expdp"
export EXPDP_DIR="/u04/expdp"

7
.gitignore vendored
View File

@@ -1,2 +1,7 @@
# fichier avec les variables d'environnement
.env
.env
AGENTS.md
chat_gemin_db_report.md
DOCUMENTATION.md
GEMINI.md
LEGENDE_COMMANDES.md

View File

@@ -1,30 +1,62 @@
Ensemble de scripts qui génèrent des rapports html avec quelques infos du serveur, les bases de données en cours d'exécution, les fichiers, les logs et les sauvegardes
# DB Report
Génère des rapports HTML détaillés sur la configuration d'un serveur et de ses bases de données Oracle.
## Fonctionnalités
- Génération d'un rapport de configuration pour le serveur hôte.
- Collecte automatique des bases de données Oracle en cours d'exécution.
- Génération d'un rapport HTML structuré et détaillé pour chaque base de données.
- Support pour les instances ASM et les PDBs (Pluggable Databases).
- Scripts modulaires pour une personnalisation facile.
## Prérequis
- Système Linux/Unix avec Bash.
- Oracle Database installé et configuré (avec `sqlplus` et `oraenv`).
- Permissions pour exécuter des requêtes SQL en tant que `sysdba`.
## Installation
## Sous Linux
```bash
git clone https://github.com/Yacine31/db_report
cd db_report
# Copier le fichier .env.local dans .env
cp .env.lcal .env
# Executer le script
# Copier le fichier d'exemple de configuration (optionnel)
cp .env.local .env
# Éditer .env si nécessaire (e.g., pour personnaliser OUTPUT_DIR)
```
## Utilisation
```bash
# Exécuter le script principal
bash rapport_bdd.sh
```
Le résultat est dans le sous répertoire ``` output/YYYYMMDD ```
## Sortie
Le script génère deux types de rapports dans le répertoire `output/YYYYMMDD/`:
1. **Rapport Serveur** : Un rapport unique contenant les informations de configuration du système d'exploitation.
- Nom du fichier : `Rapport_{hostname}_{timestamp}.html`
## Sous Windows
Télécharger le zip ici : [https://github.com/Yacine31/db_report/archive/refs/heads/main.zip](https://github.com/Yacine31/db_report/archive/refs/heads/main.zip)
2. **Rapports Base de Données** : Un rapport détaillé pour chaque instance de base de données Oracle détectée.
- Nom du fichier : `Rapport_{hostname}_{SID}_{timestamp}.html`
- Décompresser dans c:\db_report
- Exécuter le script rapport_bdd.cmd
Un script de synthèse (`summary.sh`) est également exécuté pour agréger certaines données des différentes bases.
## Structure du projet
- `rapport_bdd.sh` : Script principal qui orchestre la génération du rapport serveur et des rapports de base de données.
- `sh/` : Scripts Bash pour la collecte des informations système (utilisés pour le rapport serveur).
- `sql/` : Requêtes SQL pour les données de base de données.
- `html/` : Templates HTML pour l'en-tête et le pied de page des rapports.
- `asm/` : Scripts SQL spécifiques aux instances ASM.
- `summary/` : Scripts SQL utilisés par le script de synthèse.
- `summary.sh` : Script d'agrégation des rapports.
## Personnalisation
- Modifiez `.env` pour changer le répertoire de sortie.
- Ajoutez des scripts dans `sh/` ou `sql/` pour étendre les rapports.
Ou avec GIT :
Installer git [https://git-scm.com/download/win](https://git-scm.com/download/win)
```cmd
cd /d c:\
git clone https://github.com/Yacine31/db_report
cd db_report
rapport_bdd.cmd
```

View File

@@ -1,6 +1,6 @@
PRO <h2>Configuratiom ASM</h2>
SELECT
SELECT /* db-html-report */
DG.NAME,
DG.STATE,
DG.TYPE,
@@ -13,7 +13,7 @@ FROM
V$ASM_DISKGROUP DG;
-- Viewing disks in disk groups with V$ASM_DISK
SELECT
SELECT /* db-html-report */
DG.NAME "Disk Grp Name",
A.NAME "Name",
A.FAILGROUP,
@@ -37,7 +37,7 @@ ORDER BY
A.NAME;
-- Viewing disk group clients with V$ASM_CLIENT
SELECT
SELECT /* db-html-report */
DG.NAME AS DISKGROUP,
C.INSTANCE_NAME AS INSTANCE,
DB_NAME AS DBNAME,

View File

@@ -1,6 +1,6 @@
prompt <h2>Les dernières erreurs ASM (Les 30 derniers jours et les 50 dernières lignes)</h2>
SELECT
SELECT /* db-html-report */
TO_CHAR(ORIGINATING_TIMESTAMP, 'DD-MM-YYYY HH-MM-SS') "Date",
MESSAGE_TEXT "Message"
FROM

View File

@@ -1 +0,0 @@
SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF

View File

@@ -1,11 +0,0 @@
# Info systeme
Get-WmiObject Win32_ComputerSystem | Select-Object Manufacturer, Model, TotalPhysicalMemory
# Lister les espaces disques
Get-Volume | Format-Table -AutoSize
# lister les bases en cours d'exécution
net start | find /i "OracleService"
# lister les listener en cours d'exécution
net start | find /i "TNSListener"

View File

@@ -10,12 +10,12 @@
<style type="text/css">
body { font:12pt; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f9f9f9; padding: 20px; color: #333; }
body { font:12pt; font-family: 'Inter', 'Roboto', 'Helvetica Neue', Arial, sans-serif; background-color: #f9f9f9; padding: 20px; color: #333; }
h1 { font-size:16pt; font-weight:bold; color:#336699; border-bottom:1px solid #336699; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px; }
h2 { font-size:14pt; font-weight:bold; color:#336699; margin-top:10pt; margin-bottom:0pt; }
h3 { font-size:14pt; font-weight:normal; color:#336699; margin-top:4pt; margin-bottom:0pt; }
p { line-height: 1.0; margin-bottom: 1.2em; }
pre { display: inline-block; background-color: #f8f8f8; border: 1px solid #ccc; padding: 1em; overflow-x: auto; font-family: monospace; font-size: 0.9em; line-height: 1.2; color: #333; white-space: pre-wrap; word-break: break-all; }
pre { display: inline-block; background-color: #f8f8f8; border: 1px solid #ccc; padding: 1em; overflow-x: auto; font-family: 'Fira Code', 'Cascadia Code', 'JetBrains Mono', 'Roboto Mono', 'Source Code Pro', monospace; font-size: 0.9em; line-height: 1.2; color: #333; white-space: pre-wrap; word-break: break-all; }
a {color:#663300; }
table { font-size:10pt; border-collapse: collapse; margin: 10px 0; background-color: #fff; empty-cells:show; white-space:nowrap; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
li { font-size:10pt; color:black; padding-left:4px; padding-right:4px; padding-bottom:2px; }
@@ -40,5 +40,16 @@ font.f { font-size:10pt; color:#999999; border-top:1px solid #336699;
.red { background-color: #f44336; }
/* Alignement des cellules numériques à droite */
.numeric { text-align: right; }
.error-block {
background-color: #ffe0e0; /* Light red background */
color: #cc0000; /* Dark red text */
border: 1px solid #cc0000; /* Red border */
padding: 0.8em;
margin: 0.5em 0;
font-weight: bold;
white-space: pre-wrap; /* Preserve whitespace and wrap long lines */
word-break: break-all;
}
a[href="#top"] { position: fixed; bottom: 20px; right: 20px; background: #336699; color: white; padding: 10px; text-decoration: none; border-radius: 5px; }
</style>

View File

@@ -1,32 +0,0 @@
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%r in ('net start ^| find /i "OracleService"') do (
set "ORACLE_SID=%%r"
set "ORACLE_SID=!ORACLE_SID:~13!"
set HTML_FILE=Rapport_%COMPUTERNAME%_!ORACLE_SID!_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.html
set TMP_SQLFILE="tmp_sqlfile.sql"
set DATE_JOUR=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
type sql\00_html_header.html > !HTML_FILE!
echo ^<h1^>Rapport de base de donnees^</h1^> >> !HTML_FILE!
echo ^<h2^>Date : !DATE_JOUR!^</h2^> >> !HTML_FILE!
echo ^<h2^>Hostname : %COMPUTERNAME%^</h2^> >> !HTML_FILE!
echo ^<h2^>Base de donnees : !ORACLE_SID!^</h2^> >> !HTML_FILE!
echo ^<br^><br^> >> !HTML_FILE!
echo ^<h1^>Configuration de la base de donnees !ORACLE_SID! ^</h1^> >> !HTML_FILE!
for %%f in (sql\*.sql) do (
echo SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF > !TMP_SQLFILE!
echo WHENEVER SQLERROR CONTINUE >> !TMP_SQLFILE!
type %%f >> !TMP_SQLFILE!
echo. >> !TMP_SQLFILE!
echo EXIT >> !TMP_SQLFILE!
echo Execution du script %%f
call sqlplus -S / as sysdba @!TMP_SQLFILE! >> !HTML_FILE!
)
type sql\99_html_footer.html >> !HTML_FILE!
echo Rapport de la base !ORACLE_SID! dans le fichier html : !HTML_FILE!
)

View File

@@ -1,67 +1,180 @@
#!/bin/bash
# Script de génération de rapports HTML pour les bases de données Oracle.
# Collecte des informations système, ASM, PDBs et configurations via scripts Bash/SQL.
# Stoppe le script en cas d'erreur (erreurs, variables non définies, pipes échoués)
set -euo pipefail
source sh/utils.sh
# --- Configuration initiale ---
# Définit les variables globales et charge la configuration utilisateur.
# Définit la langue pour les commandes (évite les problèmes de locale)
export LANG=en_US
DATETIME=`date +%Y%m%d%H%M`
HNAME=$(hostname)
OUTPUT_DIR=output/$(date +%Y%m%d)
mkdir -p ${OUTPUT_DIR}
# Génère un timestamp pour nommer les fichiers
timestamp="$(date +%Y%m%d%H%M)"
# Récupère le nom d'hôte du serveur
hostname="$(hostname)"
for r in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3)
do
export ORAENV_ASK=NO
export ORACLE_SID=$r
export HTML_FILE=${OUTPUT_DIR}/Rapport_${HNAME}_${ORACLE_SID}_${DATETIME}.html
. oraenv -s > /dev/null
# Charge la configuration depuis .env si le fichier existe
if [ -f .env ]; then
# shellcheck source=.env
source .env
fi
cat html/00_html_header.html >> ${HTML_FILE}
DATE_JOUR=$(date +"%d/%m/%Y %Hh%M")
echo "<h1>Rapport de base de données ${ORACLE_SID} sur le serveur $HNAME </h1>
<h2>Date : ${DATE_JOUR}</h2>
<h2>Hostname : $HNAME</h2>
<h2>Base de données : ${ORACLE_SID}</h2>" >> ${HTML_FILE}
echo "<br><br>" >> ${HTML_FILE}
# execution des scripts shell
echo "<h1>Configuration système</h1>" >> ${HTML_FILE}
for f in sh/*.sh
do
echo "[INFO] Serveur $HNAME - Exécution du script : $f"
bash $f >> ${HTML_FILE}
done
# Définit le répertoire de sortie (peut être surchargé par la variable OUTPUT_DIR dans .env)
output_dir_base="${OUTPUT_DIR:-"output"}"
output_dir="${output_dir_base}/$(date +%Y%m%d)"
echo "<br><br>" >> ${HTML_FILE}
# --- Définitions des fonctions ---
# Contient les fonctions utilitaires pour logging et exécution de scripts.
# Si ASM, on exécute les scripts ASM
if [ $(ps -ef | grep pmon | grep ASM | wc -l) -gt 0 ]; then
echo "<h1>Configuration de l'instance ASM</h1>" >> ${HTML_FILE}
for f in asm/*.sql
do
echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f"
cat asm/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE}
done
fi
# Fonction: execute_scripts
# Description: Exécute une série de scripts (Bash ou SQL) et ajoute leur sortie au rapport HTML.
# Vérifie d'abord si des scripts correspondent au pattern.
# Paramètres:
# $1 (section_title) - Titre de la section dans le rapport HTML.
# $2 (script_pattern) - Chemin vers les scripts (e.g., "sh/*.sh").
# $3 (script_type) - Type de script : "sh" pour Bash, "sql" pour SQL.
# $4 (sql_header_file) - Fichier d'en-tête SQL (optionnel, utilisé seulement pour "sql").
# Exemple : execute_scripts "Configuration système" "sh/*.sh" "sh"
execute_scripts() {
local section_title="$1"
local script_pattern="$2"
local script_type="$3"
local sql_header_file="${4:-}"
# vérifier si la base est une CDB
if [ "$(/bin/sh sql/cdb/is_CDB.sh | tail -1)" == "YES" ]; then
# Executer les scripts sql pour les PDB
for f in sql/cdb/*.sql; do
# Exécuter les scripts SQL pour les PDB
echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f"
cat sql/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE}
done
fi
# Vérifie s'il y a des fichiers correspondants au pattern pour éviter les erreurs
# Utilise ls au lieu de find pour compatibilité, avec shellcheck désactivé pour SC2012
# shellcheck disable=SC2012
# if [ -z "$(ls -1 "${script_pattern}" 2>/dev/null)" ]; then
# log_info "Aucun script trouvé pour le pattern '${script_pattern}', section ignorée."
# return
# fi
# execution des scripts sql
echo "<h1>Configuration de la base de données ${ORACLE_SID}</h1>" >> ${HTML_FILE}
for f in sql/*.sql
do
echo "[INFO] Base ${ORACLE_SID} - Exécution du script : $f"
cat sql/sql_header.txt $f | sqlplus -s / as sysdba >> ${HTML_FILE}
done
echo "<h1>"${section_title}"</h1>" >> "${html_report_file}"
# Boucle sur chaque script correspondant au pattern
for script_file in ${script_pattern}; do
log_info "Exécution du script : ${script_file}"
case "${script_type}" in
sh)
# Exécute le script Bash et ajoute sa sortie au rapport
bash "${script_file}" >> "${html_report_file}"
;;
sql)
# Concatène l'en-tête SQL avec le script et l'exécute via sqlplus
cat "${sql_header_file}" "${script_file}" | sqlplus -s / as sysdba >> "${html_report_file}"
;;
esac
done
echo "<br><br>" >> "${html_report_file}"
echo "<p><a href=\"#top\">Retour en haut de page</a></p>" >> "${html_report_file}"
} # execute_scripts
cat html/99_html_footer.html >> ${HTML_FILE}
echo Rapport dans le fichier html : ${HTML_FILE}
done
# --- Script principal ---
# Orchestre la génération des rapports pour chaque base de données détectée.
# execution des scripts de synthèse :
bash summary.sh
# Crée le répertoire de sortie si nécessaire
mkdir -p "${output_dir}"
#--------------- LES SERVEURS
log_info "Début de la génération des rapports pour le serveur : "${hostname}""
# Définit le nom du fichier HTML du rapport
html_report_file="${output_dir}/Rapport_"${hostname}"_"${timestamp}".html"
# Copie l'en-tête HTML et ajoute l'ancre pour le lien "retour en haut"
cat html/00_html_header.html > "${html_report_file}"
echo '<div id="top"></div>' >> "${html_report_file}"
# Génère la date formatée pour l'affichage dans le rapport
current_date="$(date +"%d/%m/%Y %Hh%M")"
{
echo "<h1>Rapport de configuration du serveur "${hostname}"</h1>"
echo "<h2>Date : "${current_date}"</h2>"
echo "<h2>Hostname : "${hostname}"</h2>"
echo "<br><br>"
} >> "${html_report_file}"
# Exécute les scripts de collecte d'informations via la fonction execute_scripts
execute_scripts "Configuration système" "sh/*.sh" "sh"
# Ajoute le pied de page HTML au rapport
cat html/99_html_footer.html >> "${html_report_file}"
log_info "Rapport généré : "${html_report_file}""
#---------------
#--------------- LES BASES
# Détecte les bases de données Oracle en cours d'exécution
# Exclut les instances ASM et APX pour se concentrer sur les bases utilisateur
database_sids="$(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3 || true)"
if [ -z "${database_sids}" ]; then
echo "[WARN] Aucune base de données Oracle détectée. Fin du script."
exit 0
fi
log_info "Début de la génération des rapports pour les bases : "${database_sids}""
for database_sid in ${database_sids}; do
# Désactive les prompts d'oraenv et définit la base courante
export ORAENV_ASK=NO
export ORACLE_SID="${database_sid}"
log_info "Traitement de la base de données : "${ORACLE_SID}""
# Configure l'environnement Oracle pour la base actuelle
# shellcheck source=/dev/null
. oraenv -s > /dev/null
# Définit le nom du fichier HTML du rapport
html_report_file="${output_dir}/Rapport_"${hostname}"_"${ORACLE_SID}"_"${timestamp}".html"
# --- Génération du rapport HTML pour cette base ---
# Initialise le fichier HTML avec l'en-tête et les infos générales.
# Copie l'en-tête HTML et ajoute l'ancre pour le lien "retour en haut"
cat html/00_html_header.html > "${html_report_file}"
echo '<div id="top"></div>' >> "${html_report_file}"
# Génère la date formatée pour l'affichage dans le rapport
current_date="$(date +"%d/%m/%Y %Hh%M")"
{
echo "<h1>Rapport de base de données "${ORACLE_SID}" sur le serveur "${hostname}"</h1>"
echo "<h2>Date : "${current_date}"</h2>"
echo "<h2>Hostname : "${hostname}"</h2>"
echo "<h2>Base de données : "${ORACLE_SID}"</h2>"
echo "<br><br>"
} >> "${html_report_file}"
# # Exécute les scripts de collecte d'informations via la fonction execute_scripts
# execute_scripts "Configuration système" "sh/*.sh" "sh"
# Si une instance ASM est détectée, exécute les scripts ASM
if [ "$(ps -ef | grep pmon | grep ASM | wc -l)" -gt 0 ]; then
execute_scripts "Configuration de l'instance ASM" "asm/*.sql" "sql" "sql/sql_header.txt"
fi
# Si la base est un CDB (Container Database), exécute les scripts pour les PDBs
if [ "$(/bin/sh sql/cdb/is_CDB.sh | tail -1)" = "YES" ]; then
execute_scripts "Informations sur les PDBs" "sql/cdb/*.sql" "sql" "sql/sql_header.txt"
fi
execute_scripts "Configuration de la base de données "${ORACLE_SID}"" "sql/*.sql" "sql" "sql/sql_header.txt"
# Ajoute le pied de page HTML au rapport
cat html/99_html_footer.html >> "${html_report_file}"
log_info "Rapport généré : "${html_report_file}""
done
#---------------
# Une fois tous les rapports générés, exécute le script de synthèse pour agréger les données
log_info "Exécution du script de synthèse."
export OUTPUT_DIR="${output_dir}"
export DATETIME="${timestamp}"
export HNAME="${hostname}"
bash summary.sh
log_info "Fin du script."

View File

@@ -1,59 +0,0 @@
DATETIME=$(date +%Y%m%d_%H%M)
HNAME=$(hostname)
DATE_REP=$(date +%Y_%m_%d)
ID_CLIENT=$1
if [ "x${ID_CLIENT}" == "x" ]
then
echo "$0 ID_CLIENT"
exit 1
fi
for r in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3)
do
export ORAENV_ASK=NO
export ORACLE_SID=$r
# OUTPUT_DIR=output/${HNAME}/${ORACLE_SID}/${DATE_REP}
OUTPUT_DIR=${ID_CLIENT}/${HNAME}/${ORACLE_SID}/${DATE_REP}
mkdir -p ${OUTPUT_DIR}
# export CSV_FILE=${OUTPUT_DIR}/Rapport_${HNAME}_${ORACLE_SID}_${DATETIME}.csv
. oraenv -s > /dev/null
DATE_JOUR=$(date +"%d/%m/%Y %Hh%M")
# execution des scripts shell
for f in sh/*.sh
do
CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sh$/.csv/g')
/bin/sh $f > ${CSV_FILE}
done
# Si ASM, on exécute les scripts ASM
if [ $(ps -ef | grep pmon | grep ASM | wc -l) -gt 0 ]; then
for f in asm/*.sql
do
CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sql$/.csv/g')
sed '1 s/^/SET PAGES 999 FEEDBACK OFF MARKUP CSV ON SPOOL ON PREFORMAT OFF ENTMAP OFF\n/' $f | grep -v "^prompt" | sqlplus -s / as sysdba > ${CSV_FILE}
done
fi
# execution des scripts sql
echo "<h1>Configuration de la base de données ${ORACLE_SID}</h1>" >> ${CSV_FILE}
for f in sql/*.sql
do
CSV_FILE=${OUTPUT_DIR}/$(basename $f | sed 's/.sql$/.csv/g')
sed '1 s/^/SET PAGES 999 FEEDBACK OFF MARKUP CSV ON SPOOL ON PREFORMAT OFF ENTMAP OFF\n/' $f | grep -v "^prompt" | sqlplus -s / as sysdba > ${CSV_FILE}
done
# suppression du zip s'il existe déjà
rm -f ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip 2>/dev/null
# compression pour récupérer la totalité en zip
zip -r ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip ${OUTPUT_DIR} 1>/dev/null
echo Les fichiers CSV sont dans le répertoire : ${OUTPUT_DIR}
echo Pour récupérer les fichiers dans un seul zip : ${ID_CLIENT}_${HNAME}_${ORACLE_SID}_${DATE_REP}.zip
done

View File

@@ -1,122 +1,100 @@
# faire des commandes pour AIX et pour Linux
#!/bin/bash
# Importe les fonctions utilitaires
source "$(dirname "$0")/utils.sh"
# --- Script principal ---
os_type=$(uname -s)
echo "<h2>Bases de données en cours d'exécution :</h2>"
echo "<pre>"
ps -ef | grep pmon | grep -v grep
echo "</pre>"
print_h2 "Bases de données en cours d'exécution"
run_and_print "ps -ef | grep pmon | grep -v grep"
echo "<h2>Listeners en cours d'exécution :</h2>"
echo "<pre>"
ps -ef | grep tnslsnr | grep -v grep
echo "</pre>"
print_h2 "Listeners en cours d'exécution"
run_and_print "ps -ef | grep tnslsnr | grep -v grep"
echo "<h2>Statut du listener :</h2>"
# ps -ef | grep tnslsnr | egrep -i "LISTENER_${ORACLE_SID}" | grep -v grep | while read l
ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read l
do
# Récupérer le chemin ORACLE_HOME à partir de la sortie de ps -ef
# ---- La commande grep -o ne fonctionne pas sur AIX, on la remplace par perl -lne
# binary_path=$(echo $l | grep -o '/[^ ]*' | sed 's#/bin/tnslsnr##')
binary_path=$(echo $l | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##')
# Extraire le nom du listener
# listener_name=$(echo $l | grep -o 'tnslsnr [^ ]*' | sed 's/tnslsnr //')
listener_name=$(echo $l | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //')
# Construire la commande lsnrctl status
lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name"
# exécuter la commande
echo "<br><pre>"
echo $lsnrctl_command
echo export TNS_ADMIN=$binary_path/network/admin
export TNS_ADMIN=$binary_path/network/admin
eval "$lsnrctl_command"
echo "</pre><br>"
print_h2 "Statut du listener : ${listener_name}"
# Boucle pour le statut du listener, car elle est plus complexe
ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read -r l; do
binary_path=$(echo "$l" | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##')
listener_name=$(echo "$l" | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //')
if [ -n "$binary_path" ] && [ -n "$listener_name" ]; then
export TNS_ADMIN="$binary_path/network/admin"
lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name"
# echo "<b>Listener: ${listener_name}</b>"
run_and_print "$lsnrctl_command"
fi
done
echo "<h2>Uptime :</h2>"
echo "<pre>"
uptime
echo "</pre>"
print_h2 "Uptime"
run_and_print "uptime"
case "$os_type" in
AIX)
echo "<h2>Espace disque (lsfs) :</h2>"
echo "<pre>"
lsfs
echo "</pre>"
print_h2 "Espace disque (lsfs)"
run_and_print "lsfs"
;;
Linux)
echo "<h2>Contenu du fichier /etc/fstab :</h2>"
echo "<pre>"
cat /etc/fstab | egrep -v '^#|^$'
echo "</pre>"
print_h2 "Contenu du fichier /etc/fstab"
run_and_print "cat /etc/fstab | egrep -v '^#|^$'"
;;
esac
echo "<h2>Contenu du contab du compte oracle :</h2>"
echo "<pre>"
crontab -l
echo "</pre>"
print_h2 "Contenu du contab du compte oracle"
run_and_print "crontab -l"
echo "<h2>Limites de l'utilisateur "oracle" (ulimit -a) :</h2>"
echo "<pre>"
ulimit -a | sort
echo "</pre>"
print_h2 "Limites de l'utilisateur (ulimit -a)"
run_and_print "ulimit -a | sort"
# espace disque en fonction de l'OS
case "$os_type" in
AIX)
echo "<h2>Espace disque (df -g) :</h2>"
echo "<pre>"
df -g
echo "</pre>"
print_h2 "Espace disque (df -g)"
run_and_print "df -g"
;;
Linux)
echo "<h2>Espace disque (df -h) :</h2>"
echo "<pre>"
df -h
echo "</pre>"
print_h2 "Espace disque (df -h)"
run_and_print "df -h"
;;
esac
case "$os_type" in
Linux)
echo "<h2>Liste des disques disponibles (lsblk) :</h2>"
echo "<pre>"
lsblk
echo "</pre>"
print_h2 "Liste des disques disponibles (lsblk)"
run_and_print "lsblk"
echo "<h2>Taille mémoire en Mo (free -m) :</h2>"
echo "<pre>"
free -m
echo "</pre>"
print_h2 "Taille mémoire en Mo (free -m)"
run_and_print "free -m"
echo "<h2>Caractéristiques CPU (lscpu) :</h2>"
echo "<pre>"
lscpu
echo "</pre>"
print_h2 "Caractéristiques CPU (lscpu)"
run_and_print "lscpu"
echo "<h2>Les 50 dernières erreur dans /var/log/messages :</h2>"
if sudo -l &> /dev/null ; then
# L'utilisateur a les droits sudo. on continue
echo "<pre>"
sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50
echo "</pre>"
else
echo "<pre>"
echo "L'utilisateur n'a les droits pour lire les fichiers log."
echo "</pre>"
fi
print_h2 "Statistiques VM (vmstat 2 20)"
run_and_print "vmstat 2 20"
print_h2 "Top 10 processus par utilisation CPU (ps --width 150)"
run_and_print "ps -eo pid,user,%cpu,%mem,vsz,rss,tty,stat,start,time,command --sort=-%cpu --width 1000 | head -n 17 | cut -c 1-180"
print_h2 "Derniers messages du noyau (dmesg -T | tail -n 30)"
if sudo -ln &> /dev/null; then
run_and_print "sudo dmesg -T | tail -n 30"
else
echo "<pre>L'utilisateur n'a pas les droits sudo pour exécuter dmesg.</pre>"
fi
print_h2 "Les 30 dernières erreurs dans /var/log/messages"
if sudo -ln &> /dev/null; then
run_and_print "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -30"
else
echo "<pre>L'utilisateur n'a pas les droits sudo pour lire les fichiers log.</pre>"
fi
;;
esac
case "$os_type" in
AIX)
echo "<h2>Configuration système (prtconf) :</h2>"
echo "<pre>"
prtconf
echo "</pre>"
print_h2 "Configuration système (prtconf)"
run_and_print "prtconf"
;;
esac

View File

@@ -1,73 +0,0 @@
# faire des commandes pour AIX et pour Linux
os_type=$(uname -s)
# Function to execute command and format output
execute_command() {
command="$1"
output="$(eval "$command" 2>&1)" # Capture both stdout and stderr using eval
# Print the command and its output in the specified format
echo "--- Commande ---"
echo "$command"
echo "--- Résultat ---"
echo "$output"
echo "--- Fin Bloc ---"
}
execute_command "ps -ef | grep pmon | grep -v grep"
execute_command "ps -ef | grep tnslsnr | grep -v grep"
# Listener status
ps -ef | grep tnslsnr | egrep -i " LISTENER |${ORACLE_SID}" | grep -v grep | while read l
do
binary_path=$(echo $l | perl -lne 'print $1 if /(\S*tnslsnr\S*)/' | sed 's#/bin/tnslsnr##')
listener_name=$(echo $l | perl -lne 'print $1 if /\btnslsnr\s+(\S+)/' | sed 's/tnslsnr //')
lsnrctl_command="$binary_path/bin/lsnrctl status $listener_name"
export TNS_ADMIN=$binary_path/network/admin
execute_command "$lsnrctl_command"
done
execute_command "uptime"
case "$os_type" in
AIX)
execute_command "lsfs"
;;
Linux)
execute_command "cat /etc/fstab | egrep -v '^#|^$'"
;;
esac
execute_command "crontab -l"
execute_command "ulimit -a | sort"
case "$os_type" in
AIX)
execute_command "df -g"
;;
Linux)
execute_command "df -h"
;;
esac
case "$os_type" in
Linux)
execute_command "lsblk"
execute_command "free -m"
execute_command "lscpu"
if sudo -l &> /dev/null ; then
execute_command "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50"
else
echo "--- Commande ---"
echo "sudo cat /var/log/messages | egrep -i 'error|failed' | tail -50"
echo "--- Résultat ---"
echo "L'utilisateur n'a les droits pour lire les fichiers log."
echo "--- Fin Bloc ---"
fi
;;
esac
case "$os_type" in
AIX)
execute_command "prtconf"
;;
esac

View File

@@ -1,25 +1,40 @@
# /etc/oratab
echo "<h2>Contenu du fichier /etc/oratab :</h2>"
echo "<pre>"
cat /etc/oratab | egrep -v "^$|^#"
echo "</pre>"
#!/bin/bash
# inventory.xml
echo "<h2>Contenu du fichier Inventory.xml :</h2>"
echo "<pre>"
ORA_INVENTORY=$(cat /etc/oraInst.loc | grep inventory_loc | cut -d= -f2)
cat $ORA_INVENTORY/ContentsXML/inventory.xml | grep "<HOME NAME=" | awk '{print $2 " " $3}'
echo "</pre>"
# Importe les fonctions utilitaires
source "$(dirname "$0")/utils.sh"
# opatch
echo "<h2>Niveau de patch des ORACLE_HOME (opatch lspatches) :</h2>"
cat /etc/oratab | egrep -v "^$|^#" | cut -d: -f2 | sort -u | while read oh
do
echo "<pre>"
echo "ORACLE_HOME="$oh
echo ""
export ORACLE_HOME=$oh
$oh/OPatch/opatch lspatches
echo "</pre><br>"
done
# --- Script principal ---
print_h2 "Contenu du fichier /etc/oratab"
run_and_print "cat /etc/oratab | egrep -v '^$|^#'"
print_h2 "Contenu du fichier Inventory.xml"
# On s'assure que le fichier oraInst.loc existe et est lisible
if [ -r /etc/oraInst.loc ]; then
ORA_INVENTORY=$(grep inventory_loc /etc/oraInst.loc | cut -d= -f2)
if [ -n "${ORA_INVENTORY}" ] && [ -r "${ORA_INVENTORY}/ContentsXML/inventory.xml" ]; then
run_and_print "grep '<HOME NAME=' ${ORA_INVENTORY}/ContentsXML/inventory.xml | awk '{print \$2 \" \" \$3}'"
else
echo "<pre>Impossible de lire le fichier inventory.xml ou chemin non trouvé.</pre>"
fi
else
echo "<pre>Fichier /etc/oraInst.loc non trouvé.</pre>"
fi
print_h2 "Niveau de patch des ORACLE_HOME (opatch lspatches)"
if [ -r "${ORA_INVENTORY}/ContentsXML/inventory.xml" ]; then
# Utilise un `while read` pour plus de robustesse que `cat ... | while`
while read -r line; do
# Ignore les lignes vides ou commentées
[[ "$line" =~ ^# ]] || [ -z "$line" ] && continue
oh=$(echo "$line" | cut -d: -f2 | sort -u)
if [ -d "$oh" ]; then
export ORACLE_HOME=$oh
run_and_print "\"$oh/OPatch/opatch\" lspatches"
fi
done < <(grep -oP 'LOC="\K[^"]+' ${ORA_INVENTORY}/ContentsXML/inventory.xml)
else
echo "<pre>Fichier ${ORA_INVENTORY}/ContentsXML/inventory.xml non trouvé.</pre>"
fi

View File

@@ -1,18 +1,22 @@
#!/bin/bash
# Importe les fonctions utilitaires
source "$(dirname "$0")/utils.sh"
# --- Script principal ---
# script à exécuter si seulement dbvctl existe et une instance avec le nom de service dbv existe aussi
count=$(ps -ef | grep dbvctl | grep -v grep | grep ${ORACLE_SID} | wc -l)
count=$(ps -ef | grep dbvctl | grep -v grep | grep "${ORACLE_SID}" | wc -l)
if [ $count -gt 0 ]; then
if [ "$count" -gt 0 ]; then
echo "<h1>Configuration DBVisit</h1>"
# les process dbvisit en cours
echo "<h2>Process DBVisit en cours d'exécution</h2>"
echo "<pre>"
ps -ef | grep dbvctl | grep -v grep
echo "</pre>"
print_h2 "Process DBVisit en cours d'exécution"
run_and_print "ps -ef | grep dbvctl | grep -v grep"
# on récupère le chemin de l'executable dbvctl
export DBV_HOME=$(dirname $(ps -ef | grep dbvctl | grep -v grep | awk '{print $8}' | sort -u))
export DBV_HOME=$(dirname "$(ps -ef | grep dbvctl | grep -v grep | awk '{print $8}' | sort -u)")
# si les exacutables sont lancé avec ./dbvctl, le résultat retourné est .
# dans ce cas on remplace par la valeur par défaut : /usr/dbvisit/standby
if [ "$DBV_HOME" = "." ]; then
@@ -20,18 +24,13 @@ if [ $count -gt 0 ]; then
export DBV_HOME="/usr/dbvisit/standby"
fi
# statut de la base de données
echo "<h2>Statut de la base : ${ORACLE_SID} sur le serveur $(hostname)</h2>"
echo "<pre>"
${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status
echo "</pre>"
print_h2 "Statut de la base : ${ORACLE_SID} sur le serveur $(hostname)"
run_and_print "${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status"
# on récupère le statut de la base pour exécuter la commande sur la base primaire
db_prim=$(${DBV_HOME}/dbvctl -d ${ORACLE_SID} -o status | grep -i "read write" | wc -l)
if [ ${db_prim} -gt 0 ]; then
echo "<h2>Rapport de GAP DBVisit pour la base ${ORACLE_SID}</h2>"
echo "<pre>"
${DBV_HOME}/dbvctl -d ${ORACLE_SID} -i
echo "</pre>"
db_prim=$("${DBV_HOME}/dbvctl" -d "${ORACLE_SID}" -o status | grep -i "read write" | wc -l)
if [ "${db_prim}" -gt 0 ]; then
print_h2 "Rapport de GAP DBVisit pour la base ${ORACLE_SID}"
run_and_print "${DBV_HOME}/dbvctl -d ${ORACLE_SID} -i"
fi
fi

View File

@@ -1,16 +1,22 @@
#!/bin/bash
# Importe les fonctions utilitaires
source "$(dirname "$0")/utils.sh"
# --- Script principal ---
# script à exécuter si couche grid/crs
count=$(ps -ef | grep ohasd | grep -v grep | wc -l)
if [ $count -gt 0 ]; then
if [ "$count" -gt 0 ]; then
echo "<h2>Services CRS</h2>"
# les process dbvisit en cours
print_h2 "Services CRS"
# BIN_DIR=$(dirname $(ps -ef | grep ohasd.bin | grep -v grep | egrep -o '/.*ohasd\.bin'))
# la commande egrep -o ne fonctionne pas sous AIX
# on utilise donc la commande suivante avec awk
BIN_DIR=$(dirname $(ps -ef | grep ohasd.bin | grep -v grep | awk '{ match($0, /\/.*ohasd\.bin/); print substr($0, RSTART, RLENGTH) }'))
BIN_DIR=$(dirname "$(ps -ef | grep ohasd.bin | grep -v grep | awk '{ match($0, /\/.*ohasd\.bin/); print substr($0, RSTART, RLENGTH) }')")
# explication de la commande awk :
# - match($0, /\/.*ohasd\.bin/): Cette partie de la commande awk recherche la première occurrence
# de la séquence "/.*ohasd.bin" dans la ligne.
@@ -18,7 +24,10 @@ if [ $count -gt 0 ]; then
# la position RSTART (où la correspondance commence) jusqu'à la longueur RLENGTH de la correspondance.
# - Le résultat sera la portion de la chaîne entre le premier / et le mot "ohasd.bin".
# - la commande dirname retourne le répertoire qui sera utilisé dans BIN_DIR
echo "<pre>"
${BIN_DIR}/crsctl status res -t
echo "</pre>"
if [ -n "$BIN_DIR" ] && [ -x "$BIN_DIR/crsctl" ]; then
run_and_print "${BIN_DIR}/crsctl status res -t"
else
echo "<pre>Impossible de trouver le répertoire d'installation CRS ou crsctl n'est pas exécutable.</pre>"
fi
fi

View File

@@ -1,35 +1,47 @@
#!/bin/bash
# script pour vérifier les logs des fichiers datapump et voir si des erreurs sont présentes
# Importe les fonctions utilitaires
source "$(dirname "$0")/../utils.sh"
# --- Script principal ---
# EXPDP_DIR="/u04/backup" : la variable d'environnement est chargée depuis le fichier .env
CURRENT_DATE=$(date +%Y_%m) # date au format 2025_04
echo "<h2>Vérification des logs des exports Datapump</h2>"
print_h2 "Vérification des logs des exports Datapump"
# vérifier si une erreur ORA- est pésente dans les fichiers logs
echo "<h3>Vérification de la présence d'erreurs dans les logs :</h3>"
RESULT=$(find "${EXPDP_DIR}" -iname "export_*.log" -exec grep -H "ORA-" "{}" \;)
if [ -z "$RESULT" ]; then
echo "<pre>Aucune erreur ORA- détectée dans les fichiers logs du mois ${CURRENT_DATE}.</pre>"
if [ -z "${EXPDP_DIR}" ]; then
echo "<pre>La variable EXPDP_DIR n'est pas définie. Impossible de vérifier les logs Datapump.</pre>"
elif [ ! -d "${EXPDP_DIR}" ]; then
echo "<pre>Le répertoire EXPDP_DIR ('${EXPDP_DIR}') n'existe pas ou n'est pas accessible.</pre>"
else
echo "<pre>$RESULT</pre>"
fi
RESULT=$(find "${EXPDP_DIR}" -iname "export_*.log" -exec grep -H "ORA-" "{}" \;)
if [ -z "$RESULT" ]; then
echo "<pre>Aucune erreur ORA- détectée dans les fichiers logs du mois ${CURRENT_DATE}.</pre>"
else
echo "<pre>$RESULT</pre>"
fi
# afficher les dernières lignes des fichiers log pour voir les les exports se sont bien déroulés
echo "<h3>Affichage des 10 premières et 10 dernières lignes des fichiers logs :</h3>"
# préparation de la commande find : définition de la fonction d'affichage plus lisible
show_log_excerpt() {
local file="$1"
echo "<br><b>--- ${file} ---</b> " # affiche le nom du fichier en gras
echo "<pre>"
head -10 "$file" # affiche les 10 première lignes dans le bloc PRE
echo "</pre><pre>"
tail -10 "$file" # affiche les 10 dernières lignes dans le bloc PRE
echo "</pre>"
}
# export pour rendre la fonction accessible à bash -c
export -f show_log_excerpt
# afficher les dernières lignes des fichiers log pour voir les les exports se sont bien déroulés
echo "<h3>Affichage des 10 premières et 10 dernières lignes des fichiers logs :</h3>"
# préparation de la commande find : définition de la fonction d'affichage plus lisible
show_log_excerpt() {
local file="$1"
echo "<br><b>--- ${file} ---</b> " # affiche le nom du fichier en gras
echo "<pre>"
head -10 "$file" # affiche les 10 première lignes dans le bloc PRE
echo "</pre><pre>"
tail -10 "$file" # affiche les 10 dernières lignes dans le bloc PRE
echo "</pre>"
}
# export pour rendre la fonction accessible à bash -c
export -f show_log_excerpt
# find appelle la fonction en lui passant $0 comme paramètre
find "${EXPDP_DIR}" -iname "export_*.log" -exec bash -c 'show_log_excerpt "$0"' {} \;
# find appelle la fonction en lui passant $0 comme paramètre
find "${EXPDP_DIR}" -iname "export_*.log" -exec bash -c 'show_log_excerpt "$0"' {} \;
fi

44
sh/utils.sh Normal file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
# Fichier de fonctions utilitaires pour les scripts de rapport
# Fonction: log_info
# Description: Affiche un message d'information dans les logs avec un timestamp.
# Paramètres:
# $1 - Le message à afficher.
log_info() {
echo "[INFO] $(date +'%Y-%m-%d %H:%M:%S') - ${1}"
}
# Affiche un titre H2
print_h2() {
echo "<h2>$1</h2>"
}
# Exécute une commande et affiche sa sortie dans une balise <pre>
# Si la commande échoue, elle affiche un message d'erreur mis en évidence.
run_and_print() {
local cmd="$1"
local cmd_html
# Échapper les caractères HTML pour un affichage sûr
cmd_html=$(echo "${cmd}" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
echo "<br><pre>"
# Affiche la commande échappée en rouge et gras
echo "<b style=\"color:red;\">${cmd_html}</b>"
# Ajoute une ligne vide pour la séparation
echo ""
# Exécute la commande originale, redirige stderr vers stdout pour tout capturer
if output=$(eval "${cmd}" 2>&1); then
echo "$output"
else
echo "<div class=\"error-block\">"
echo "ERREUR: La commande a échoué avec le message suivant :"
echo "$output"
echo "</div>"
fi
echo "</pre>"
}

View File

@@ -1,6 +1,6 @@
prompt <h2>System Information</h2>
WITH /* 1a.1 */
rac AS (SELECT /*+ MATERIALIZE NO_MERGE */ COUNT(*) instances, CASE COUNT(*) WHEN 1 THEN 'Single-instance' ELSE COUNT(*)||'-node RAC cluster' END db_type FROM gv$instance),
rac AS (select /* db-html-report */ /*+ MATERIALIZE NO_MERGE */ COUNT(*) instances, CASE COUNT(*) WHEN 1 THEN 'Single-instance' ELSE COUNT(*)||'-node RAC cluster' END db_type FROM gv$instance),
hrac AS (SELECT /*+ MATERIALIZE NO_MERGE */ CASE 1 WHEN 1 THEN ' (historically Single-instance in AWR)' ELSE ' (historicly 1-node RAC cluster in AWR)' END db_type
FROM rac WHERE TO_CHAR(RAC.instances)<>1),
mem AS (SELECT /*+ MATERIALIZE NO_MERGE */ SUM(value) target FROM gv$system_parameter2 WHERE name = 'memory_target'),

View File

@@ -2,7 +2,7 @@ prompt <h2>Taille de la base de données :</h2>
WITH
sizes AS (
SELECT /*+ MATERIALIZE NO_MERGE */ /* 1f.60 */
select /* db-html-report */ /*+ MATERIALIZE NO_MERGE */ /* 1f.60 */
'Data' file_type,
SUM(bytes) bytes
FROM v$datafile

View File

@@ -1,7 +1,7 @@
prompt <h2>Database/Instance Status</h2>
alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
SELECT 'DATABASE_NAME' AS property, name AS value FROM gv$database
select /* db-html-report */ 'DATABASE_NAME' AS property, name AS value FROM gv$database
UNION ALL
SELECT 'DATABASE_ROLE' AS property, DATABASE_ROLE AS value FROM gv$database
UNION ALL

View File

@@ -1,6 +1,6 @@
prompt <h2>Database/Version</h2>
SELECT
select /* db-html-report */
*
FROM
V$VERSION;

View File

@@ -1,6 +1,6 @@
prompt <h2>Paramèters de la base de données : </h2>
SELECT
select /* db-html-report */
NAME,
DISPLAY_VALUE,
DESCRIPTION,

View File

@@ -1,4 +1,3 @@
prompt <h2>Paramètres NLS au niveau de la base de données :</h2>
-- SELECT * FROM NLS_DATABASE_PARAMETERS ORDER BY PARAMETER;
select * from gv$nls_parameters order by PARAMETER ;
select /* db-html-report */ * from gv$nls_parameters order by PARAMETER ;

View File

@@ -1,6 +1,6 @@
prompt <h2>Database supplemental logging :</h2>
select 'force_logging' as property, force_logging as value from v$database
select /* db-html-report */ 'force_logging' as property, force_logging as value from v$database
union all
select 'supplemental_log_data_min' as property, supplemental_log_data_min as value from v$database
union all

View File

@@ -1,6 +1,6 @@
prompt <h2>Fonctionnalités installées dans la base de données (DBA_REGISTRY) :</h2>
SELECT
select /* db-html-report */
*
FROM
DBA_REGISTRY

View File

@@ -1,6 +1,6 @@
prompt <h2>Resource Limit (GV$RESOURCE_LIMIT)</h2>
SELECT
select /* db-html-report */
*
FROM
GV$RESOURCE_LIMIT

View File

@@ -1,7 +1,7 @@
prompt <h2>Memory Information</h2>
WITH
system_parameter AS (
SELECT inst_id,
select /* db-html-report */ inst_id,
name,
value
FROM gv$system_parameter2

View File

@@ -2,7 +2,7 @@ prompt <h2>Les 50 dernières opérations de Resize de la mémoire :</h2>
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT
select /* db-html-report */
*
FROM
GV$MEMORY_RESIZE_OPS

View File

@@ -1,6 +1,6 @@
prompt <h2>SGA Target Advice</h2>
SELECT
select /* db-html-report */
*
FROM
GV$SGA_TARGET_ADVICE;

View File

@@ -12,7 +12,7 @@ COL free FORMAT 99999999.00 HEAD "Free MB"
COL max FORMAT 99999999.00 HEAD "MaxSize MB"
COL Pct_Used FORMAT 999.00 HEAD "% Used"
select
select /* db-html-report */
a.tablespace_name,
t.bigfile,
a.bytes_alloc/1024/1024 alloc,

View File

@@ -1,49 +0,0 @@
prompt <h2>Détail des datafiles : </h2>
COL file_id HEAD "File ID"
COL file_name HEAD "Datafile"
COL tablespace_name FORMAT A20 HEAD "Tablespace"
COL file_size_mb FORMAT 999999999.00 HEAD "File Size MB"
COL space_used_mb FORMAT 999999999.00 HEAD "Space Used MB"
COL space_free_mb FORMAT 999999999.00 HEAD "Space Free MB"
COL maxsize_mb FORMAT 999999999.00 HEAD "Max Size MB"
COL percent_used FORMAT 999.00 HEAD "% Used"
COL autoextensible FORMAT A15 HEAD "Auto Extensible"
COL status head "Status"
COL online_status format a15 head "Online Status"
select
d.file_id,
d.file_name,
d.tablespace_name,
a.bytes_alloc/1024/1024 file_size_mb,
(a.bytes_alloc - nvl(b.bytes_free, 0))/1024/1024 space_used_mb,
nvl(b.bytes_free, 0)/1024/1024 space_free_mb,
a.maxbytes/1024/1024 maxsize_mb,
round((a.bytes_alloc - nvl(b.bytes_free, 0)) / a.maxbytes * 100,2) percent_used,
d.autoextensible,
d.status,
d.online_status
from
(
select
f.file_id,
sum(f.bytes) bytes_alloc,
sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes
from dba_data_files f group by file_id
) a,
(
select
f.file_id,
sum(f.bytes) bytes_free
from dba_free_space f group by file_id
) b,
dba_data_files d
where
a.file_id = b.file_id (+) and d.file_id=a.file_id
order by
d.file_name
;

View File

@@ -20,7 +20,7 @@ WITH
-- Sous-requête pour les fichiers de données dans une CDB
cdb_files AS (
-- cdb_files.sql
SELECT
select /* db-html-report */
p.con_id AS pdb_id,
p.pdb_name AS pdb_name,
d.file_id,

View File

@@ -20,7 +20,7 @@ WITH
-- Sous-requête pour les fichiers de données dans une CDB
cdb_files AS (
-- cdb_files.sql
SELECT
select /* db-html-report */
p.con_id AS pdb_id,
p.pdb_name AS pdb_name,
d.file_id,

View File

@@ -1,6 +1,6 @@
prompt <h3>Détail du tablespace UNDO : </h3>
SELECT
select /* db-html-report */
a.tablespace_name,
a.file_id,
a.bytes / 1024 / 1024 AS size_mb,

View File

@@ -1,6 +1,6 @@
prompt <h2>Existance de blocks corrompus :</h2>
SELECT
select /* db-html-report */
*
FROM
V$DATABASE_BLOCK_CORRUPTION;

View File

@@ -2,7 +2,7 @@ prompt <h2>Fichiers de journalisation (Redolog) :</h2>
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT
select /* db-html-report */
*
FROM
V$LOG

View File

@@ -3,7 +3,7 @@ alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
COL MEMBER FORMAT A90 WRAPPED
BREAK ON GROUP# SKIP 1 ON THREAD# ON SEQUENCE# ON TAILLE_MIB ON "STATUS(ARCHIVED)"
SELECT
select /* db-html-report */
'OnlineLog' t,
g.group#,
g.thread#,

View File

@@ -31,7 +31,7 @@ col 23 for 999
col 24 for 999
select to_char(first_time, 'YYYY/MM/dd') "Date",
select /* db-html-report */ to_char(first_time, 'YYYY/MM/dd') "Date",
count(1) "Total",
sum(decode(to_char(first_time, 'hh24'),'00',1,0)) "00",
sum(decode(to_char(first_time, 'hh24'),'01',1,0)) "01",

View File

@@ -1,6 +1,6 @@
prompt <h2>Taille des redolog par jour :</h2>
SELECT
select /* db-html-report */
TO_CHAR(FIRST_TIME, 'YYYY/MM/dd') "Jour",
COUNT(*) "Nbr de fichiers",
ROUND(SUM(BLOCKS*BLOCK_SIZE)/1024/1024, 0) "Taille_Mo"

View File

@@ -1,6 +1,6 @@
prompt <h2>Fast Recovery Area Usage</h2>
SELECT
select /* db-html-report */
'Taille FRA MiB' AS PROPERTY,
P.VALUE / 1024 / 1024 AS VALUE
FROM

View File

@@ -1,2 +1,2 @@
prompt <h2>Fast Recovery Area Usage</h2>
SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;
select /* db-html-report */ * FROM V$FLASH_RECOVERY_AREA_USAGE;

View File

@@ -1,6 +1,6 @@
prompt <h2>Les dernières erreurs de la base de données (Les 30 derniers jours et les 50 dernières lignes)</h2>
SELECT
select /* db-html-report */
TO_CHAR(ORIGINATING_TIMESTAMP, 'DD-MM-YYYY HH24:MM:SS') "Date",
MESSAGE_TEXT "Message"
FROM

View File

@@ -1,6 +1,6 @@
prompt <h2>Configuration RMAN: pramètres modifiés :</h2>
SELECT
select /* db-html-report */
*
FROM
V$RMAN_CONFIGURATION;

View File

@@ -2,7 +2,7 @@ prompt <h2>Les dernières sauvegardes RMAN (30 derniers jours/50 dernières lign
ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS';
SELECT
select /* db-html-report */
B.SESSION_KEY "Session Key",
B.INPUT_TYPE "Type",
TO_CHAR(B.START_TIME, 'DD-MM-YYYY HH24:MI') "Start Time",

View File

@@ -1,6 +1,6 @@
prompt <h2>SYSAUX Occupants</h2>
SELECT /*+ NO_MERGE */
select /* db-html-report */ /*+ NO_MERGE */
V.*,
ROUND(V.SPACE_USAGE_KBYTES / POWER(10, 6), 3) SPACE_USAGE_GBS
FROM

View File

@@ -2,7 +2,7 @@ prompt <h2>DBA Users </h2>
ALTER SESSION SET NLS_DATE_FORMAT ='YYYY/MM/DD HH24:MI';
SELECT
select /* db-html-report */
X.USERNAME,
X.USER_ID,
X.ACCOUNT_STATUS,

View File

@@ -1,6 +1,6 @@
prompt <h2>DBA_Profiles </h2>
SELECT
select /* db-html-report */
*
FROM
DBA_PROFILES

View File

@@ -1,6 +1,6 @@
prompt <h2>Taille des objets par schéma (Mo):</h2>
SELECT
select /* db-html-report */
DS.OWNER "Owner",
ROUND(SUM(DS.BYTES) / 1024 / 1024) "Schema Size MB",
DU.DEFAULT_TABLESPACE "Default Tablespace"

View File

@@ -2,7 +2,7 @@
prompt <h2>Sessions Aggregate per User and Type</h2>
WITH X AS (
SELECT
select /* db-html-report */
COUNT(*),
--con_id,
USERNAME,

View File

@@ -1,7 +1,7 @@
prompt <h2>Sessions Aggregate per Module and Action</h2>
WITH X AS (
SELECT
select /* db-html-report */
COUNT(*),
--con_id,
MODULE,

View File

@@ -10,7 +10,7 @@ col OSUSER for a10
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT
select /* db-html-report */
OSUSER,
MACHINE,
PROGRAM,

View File

@@ -1,6 +1,6 @@
prompt <h2>Invalid objects</h2>
SELECT
select /* db-html-report */
OWNER,
COUNT(*) "invalid objects"
FROM

View File

@@ -1,6 +1,6 @@
prompt <h2>Les objets par utilisateur</h2>
SELECT
select /* db-html-report */
*
FROM
(

View File

@@ -1,6 +1,6 @@
prompt <h2>Statut des jobs autotask </h2>
SELECT
select /* db-html-report */
CLIENT_NAME,
STATUS,
ATTRIBUTES,

View File

@@ -1,7 +1,7 @@
-- SCRIPT - to Set the 'SESSION_CACHED_CURSORS' and 'OPEN_CURSORS' Parameters Based on Usage (Doc ID 208857.1)
prompt <h2>Sessions and Cursors usage </h2>
SELECT
select /* db-html-report */
'session_cached_cursors' PARAMETER,
LPAD(VALUE, 5) VALUE,
DECODE(VALUE, 0, ' n/a', TO_CHAR(100 * USED / VALUE, '990')

View File

@@ -1,6 +1,6 @@
prompt <h2>Curseurs par Session (sans les users SYS, SYSTEM, SYSMAN)</h2>
select c.sid, s.username, count(*) open_cursors
select /* db-html-report */ c.sid, s.username, count(*) open_cursors
from gv$open_cursor c, gv$session s
where s.sid = c.sid
and s.username is not null and s.username not like 'SYS%'

View File

@@ -1,6 +1,6 @@
prompt <h2>Failed scheduled jobs </h2>
SELECT
select /* db-html-report */
OWNER,
JOB_NAME,
JOB_TYPE,

View File

@@ -3,7 +3,7 @@ prompt <h2>Table Statistics Summary</h2>
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
WITH X AS (
SELECT /*+ NO_MERGE */
select /* db-html-report */ /*+ NO_MERGE */
--con_id,
OWNER,
OBJECT_TYPE,

View File

@@ -1,6 +1,6 @@
prompt <h2>Dictionary Stats / Fixed Objects Stats</h2>
SELECT
select /* db-html-report */
TO_CHAR(MAX(END_TIME), 'dd/mm/yyyy hh24:mi') LATEST,
OPERATION
FROM

View File

@@ -2,7 +2,7 @@ prompt <h2>Les options utilisée (à partir de DBA_FEATURE_USAGE_STATISTICS): </
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT
select /* db-html-report */
NAME,
LAST_USAGE_DATE,
DETECTED_USAGES,

View File

@@ -1,8 +1,12 @@
prompt <h2>Liste des jobs dans : dba_jobs </h2>
prompt <h2>Liste des derniers jobs dans : CDB_SCHEDULER_JOB_LOG </h2>
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';
SELECT
*
FROM
DBA_JOBS;
select /* db-html-report */
* from
(
select log_date, owner, job_name, status
from CDB_SCHEDULER_JOB_LOG
order by log_date desc
) where rownum <= 20
;

23
sql/41_sql_stat.sql Normal file
View File

@@ -0,0 +1,23 @@
prompt <h2>Top SQL</h2>
alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';
select /* db-html-report */
* from (
select
a.inst_id,
a.sql_id,
a.elapsed_time / 1000000 as elapsed,
substrb(replace(a.sql_text,'',' '),1,55) as sql_text,
a.cpu_time / 1000000 as cpu_time,
a.buffer_gets, -- Lecture en memoire
a.disk_reads, -- Lecture sur disque
a.physical_read_bytes,
a.executions,
a.rows_processed,
a.last_active_time, -- Last time the statistics of a contributing cursor were updated
b.module
from gv$sqlstats a, gv$sql b
where a.sql_id=b.sql_id
order by a.elapsed_time desc
) where rownum <= 25;

View File

@@ -4,7 +4,7 @@ col application_root for a25
col application_pdb for a25
col application_seed for a25
SELECT
select /* db-html-report */
p.con_id,
p.dbid,
p.name,

View File

@@ -3,91 +3,82 @@
# Ce script exécute des sql pour fournir une vue global de certains aspect de la base
# tous les datafiles, toutes les sauvegardes, toutes les erreur dans alertlog, ...
#------------------------------------------------------------------------------
export LANG=en_US
DATETIME=`date +%Y%m%d%H%M`
HNAME=$(hostname)
OUTPUT_DIR=output/$(date +%Y%m%d)
mkdir -p ${OUTPUT_DIR}
# Importe les fonctions utilitaires
# Le chemin est relatif au script appelant (rapport_bdd.sh)
source "$(dirname "$0")/sh/utils.sh"
# Les variables DATETIME, HNAME, OUTPUT_DIR, et l'environnement .env sont déjà gérés par rapport_bdd.sh
# On s'assure que OUTPUT_DIR est défini
: "${OUTPUT_DIR:?OUTPUT_DIR not set by calling script}"
: "${DATETIME:?DATETIME not set by calling script}"
: "${HNAME:?HNAME not set by calling script}"
log_info "Début de l'exécution des scripts de synthèse."
#------------------------------------------------------------------------------
# inititalisation des variables d'environnement
#------------------------------------------------------------------------------
export SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
# Nom du fichier .env
ENV_FILE=${SCRIPTS_DIR}"/.env"
# Vérifier si le fichier .env existe
if [ ! -f "$ENV_FILE" ]; then
echo "Erreur : Le fichier $ENV_FILE n'existe pas."
echo "Erreur : Impossible de charger les variables d'environnement."
exit 1
fi
# Charger les variables d'environnement depuis le fichier .env
source "$ENV_FILE"
#------------------------------------------------------------------------------
# Execution des scripts sql
# Execution des scripts sql de synthèse
#------------------------------------------------------------------------------
for sqlfile in summary/*.sql
do
# on prepare le fichier output
FILENAME=$(basename "$sqlfile" | cut -d_ -f2)
BASENAME="${FILENAME%.*}"
HTML_FILE=${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html
HTML_FILE="${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html"
log_info "Génération du rapport de synthèse SQL pour ${FILENAME} dans ${HTML_FILE}"
# insertion du header HTML
cat html/00_html_header.html >> ${HTML_FILE}
cat html/00_html_header.html > "${HTML_FILE}"
for sid in $(ps -eaf | grep pmon | egrep -v 'grep|ASM|APX1' | cut -d '_' -f3)
do
export ORAENV_ASK=NO
export ORACLE_SID=$sid
export ORACLE_SID="$sid"
# shellcheck source=/dev/null
. oraenv -s > /dev/null
# ajout du nom de la base
echo '<h3>Base de données : '$sid'</h3>' >> ${HTML_FILE}
echo "<h3>Base de données : ${sid}</h3>" >> "${HTML_FILE}"
# ajouter le resultat du script sql dans la page html
cat summary/01_sql_header.txt $sqlfile | sqlplus -s / as sysdba >> ${HTML_FILE}
# Utilise le sql_header.txt standard
cat sql/sql_header.txt "$sqlfile" | sqlplus -s / as sysdba >> "${HTML_FILE}"
done
# insertion du footer HTML
cat html/99_html_footer.html >> ${HTML_FILE}
echo Rapport synthèse pour ${FILENAME} dans : ${HTML_FILE}
done
#------------------------------------------------------------------------------
# exécution des scripts dans sh/local si présents
# Chemin du dossier local
#------------------------------------------------------------------------------
LOCAL_DIR="sh/local"
for shfile in ${LOCAL_DIR}/*.sh
do
# on prépare le fichier output
FILENAME=$(basename "$shfile")
BASENAME="${FILENAME%.*}"
HTML_FILE=${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html
# insertion du header HTML
cat html/00_html_header.html >> ${HTML_FILE}
cat html/99_html_footer.html >> "${HTML_FILE}"
log_info "Rapport synthèse pour ${FILENAME} généré."
echo "<p><a href=\"#top\">Retour en haut de page</a></p>" >> "${HTML_FILE}"
done
#------------------------------------------------------------------------------
# exécution des scripts dans sh/local si présents
#------------------------------------------------------------------------------
LOCAL_DIR="sh/local"
if [ -d "$LOCAL_DIR" ]; then
echo "[INFO] Détection du dossier local : $LOCAL_DIR"
for f in "$LOCAL_DIR"/*.sh; do
[ -f "$f" ] || continue
echo "[INFO] Exécution du script local : $f"
bash "$f" >> ${HTML_FILE}
log_info "Détection du dossier local : ${LOCAL_DIR}"
for shfile in "${LOCAL_DIR}"/*.sh
do
[ -f "$shfile" ] || continue
# on prépare le fichier output
FILENAME=$(basename "$shfile")
BASENAME="${FILENAME%.*}"
HTML_FILE="${OUTPUT_DIR}/Summary_${BASENAME}_${HNAME}_${DATETIME}.html"
log_info "Génération du rapport de synthèse Shell pour ${FILENAME} dans ${HTML_FILE}"
# insertion du header HTML
cat html/00_html_header.html > "${HTML_FILE}"
# Exécution du script local en utilisant run_and_print
print_h2 "Résultat du script : ${FILENAME}" >> "${HTML_FILE}"
# Le script shfile lui-même doit être exécuté, et il contient déjà ses propres print_h2/run_and_print
# Donc, on l'exécute directement.
bash "$shfile" >> "${HTML_FILE}"
# insertion du footer HTML
cat html/99_html_footer.html >> "${HTML_FILE}"
log_info "Rapport synthèse pour ${FILENAME} généré."
echo "<p><a href=\"#top\">Retour en haut de page</a></p>" >> "${HTML_FILE}"
done
else
echo "[INFO] Aucun script local détecté dans ${LOCAL_DIR}."
log_info "Aucun script local détecté dans ${LOCAL_DIR}."
fi
# insertion du footer HTML
cat html/99_html_footer.html >> ${HTML_FILE}
echo Rapport synthèse pour ${FILENAME} dans : ${HTML_FILE}
done
log_info "Fin de l'exécution des scripts de synthèse."

View File

@@ -1 +0,0 @@
SET PAGES 999 FEEDBACK OFF MARKUP HTML ON SPOOL ON PREFORMAT OFF ENTMAP OFF