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

2 réflexions sur “Automatiser Statspack”

    1. harperlewis

      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)

Les commentaires sont fermés.