Automatiser Statspack
Si les rapports AWR sont très utiles, il ne faut pas oublier que leur utilisation est soumise à licence (Enterprise Manager Diagnostic Pack) et réservée à la version Enterprise Edition.
Dans les autres cas (Standard Edition ou pas de licence Diagnostic Pack), il faut aller voir du coté de Statspack …
Statspack ?
Statpack permet de générer un rapport identique à AWR mais demande un peu plus de travail, à savoir:
- création d’un utilisateur dédié à statspack, idéalement avec un tablespace associé
- prise de snapshots à déclencher de façon manuelle, via un appel au script snap.sql ou en utilisant la procedure statspack.snap
- génération d’un rapport, via un appel au script spreport.sql
- purge des snapshots, via un appel au script sppurge.sql ou en utilisant la procedure statspack.purge
Tous les scripts se trouvent dans le répertoire $ORACLE_HOME/rdbms/admin
Automatiser l’utilisation
Lors de campagnes de stress tests, la durée des tests peut varier et il peut être intéressant d’automatiser la prise de snapshots à intervales réguliers. C’est ce que le script suivant se propose de faire.
Le script accepte 3 paramètres, le premier étant la durée totale du tir, en minutes et le deuxième l’intervalle de prise de snapshots statspack, en minutes également, le troisième paramètres correspond à une entrée du fichier tnsnames.ora.
Afin de pouvoir mettre en corrélation les rapports statspack et l’activité du système, le script lance également la commande vmstat et produit un fichier associé à chaque snapshot. Le script crée un nouveau répertoire pour chaque “run” et un rapport global est spoolé dans le fichier CR.txt.
#! /usr/bin/ksh
Usage () {
echo usage : $0 Duree-du-Tir Frequence-des-Snaps tnsentry
echo tnsentry: entree tnsnames.ora de la base a surveiller
exit 1
}
# GetSnap DATABASE
GetSnap() {
sqlplus -s perfstat/perfstat@${1} <<EOF
set heading off
set feedback off
select trim(max(snap_id)) from stats\$snapshot;
EOF
}
# Vérification des paramètres
NPAR=3
[ $# -eq $NPAR ] || Usage
case $1 in
[0-9]*) : ;;
*) echo Parametre 1 invalide ; Usage
esac
case $2 in
[0-9]*) : ;;
*) echo Parametre 2 invalide ; Usage
esac
DUREE=$1
SNAPFREQ=$2
export DATABASE=$3
VMFREQ=30
typeset -i VMITER SNAPWAIT RUNNUMBER LOOP
[ ${SNAPFREQ} -gt ${DUREE} ] && {
echo La durée du tir doit être supérieure a la fréquence des mesures
exit 1
}
DIV=${DUREE}%${SNAPFREQ}
[ $DIV -eq 0 ] || {
echo La durée du tir doit être un multiple de la fréquence des mesures
exit 1
}
tnsping ${DATABASE} || {
echo La base ${DATABASE} n\'existe pas ou est inaccessible
exit 1
}
# Lancement de la surveillance
VMITER=2*${SNAPFREQ}
SNAPWAIT=60*${SNAPFREQ}
echo Declenchement d\'un snap statspack toutes les ${SNAPWAIT} secondes avec ${VMITER} lignes de vmstat, 1 ligne toutes les ${VMFREQ} secondes
RUNNUMBER=`ls Resultats|wc -l`
let RUNNUMBER=RUNNUMBER+1
echo Collecte des statistiques dans le repertoire Resultats/${RUNNUMBER}
RDIR=${HOME}/Resultats/${RUNNUMBER}
LOOP=${DUREE}/${SNAPFREQ}
mkdir ${RDIR}
let numloop=0
echo "Collecte des statistiques sur la base ${DATABASE} toutes les ${SNAPWAIT} secondes avec ${VMITER} lignes de vmstat, 1 ligne toutes les ${VMFREQ} secondes " > ${RDIR}/CR.txt
tnsping ${DATABASE} >> ${RDIR}/CR.txt
echo Debut des mesures a `date "+%Y/%m/%d %H:%M:%S"` >> ${RDIR}/CR.txt
while [ ${numloop} -lt ${LOOP} ]
do
let numloop=numloop+1
sqlplus -s perfstat/perfstat@${DATABASE} @${HOME}/SQL/snap
echo Prise de mesure ${numloop} a `date "+%Y/%m/%d %H:%M:%S"` >> ${RDIR}/CR.txt
X=`GetSnap ${DATABASE}|awk 'NR == 2 { print $1; }'`
vmstat ${VMFREQ} ${VMITER} > ${RDIR}/vmstat.${numloop}.snap.${X} &
sleep ${SNAPWAIT}
done
let numloop=numloop+1
sqlplus -s perfstat/perfstat@${DATABASE} @${HOME}/SQL/snap
echo Prise de mesure Finale a `date "+%Y/%m/%d %H:%M:%S"` >> ${RDIR}/CR.txt
X=`GetSnap ${DATABASE}|awk 'NR == 2 { print $1; }'`
echo Snap Final : $X >> ${RDIR}/CR.txt
echo Fin des mesures a `date "+%Y/%m/%d %H:%M:%S"` >> ${RDIR}/CR.txt



Pourquoi ne pas utiliser spauto.sql et dbms_job.remove ?
spauto.sql n’est pas très flexible, la prise de snapshots est faite toutes le heures.
Le script est prévu pour une résolution inférieure à une heure, et une corrélation entre les snapshots et la trace système (vmstat)