Sauter au contenu

Automatiser Statspack

27 janvier 2011

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 Commentaires laisser un →
  1. arkzoyd permalien
    2 février 2011 06:02

    Pourquoi ne pas utiliser spauto.sql et dbms_job.remove ?

    • harperlewis permalien
      4 février 2011 11:21

      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)

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 385 followers