lundi 29 juillet 2013

Exemple d'utilisation de l'utilitaire ASM "kfod"

Un petit script qui permet de lister les diskgroups et les disks ASM associés.
Bien sûr l'on peut retrouver les mêmes informations à partir des vues dynamiques, mais l'objectif de cet article c'est de montrer l'utilisation que l'on peut faire de l'utilitaire asm "kfod".

L'utilitaire se trouve dans le répertoire $GRID_HOME/bin en environnement cluster comme en environnement standalone.

Le script a été écrit sur un serveur Linux, donc avec la présence d'asmlib. Il tient compte du fait que sur certains serveurs les disques s'appellent /dev/oracleasm/disks/* (les alias sont créés par asmlib, mais asmlib n'est pas utilisé au moment de monter les diskgroups, cela est le résultat d'un problème que nous avons rencontré à cause de la version des contrôleurs du SAN. Voir l'article http://www.herve-etche.com/2012/12/ora-15085-asm-disk-has-inconsistent.html pour plus de détails) et sur d'autres serveurs c'est ORCL:* (ici asmlib est utilisé).




# 10-avril-2013 - Creation initiale - Par Herve Etche
# Ce script permet d'afficher les diskgroups asm et leurs tailles. Il affiche aussi les disques de chaque diskgroup et leurs tailles

#!/usr/bin/ksh
GRID_HOME=$(cat /etc/oratab | awk -F: '/^\+ASM/{print $2}') #Recuperer le GRID_HOME a partir du fichier /etc/oratab
ASM_PID=`ps -ef|grep asm_pmon|grep -v grep|awk '{print $2}'` #Le PID du process pmon d'asm
if [ $ASM_PID ]; then # Le process pmon d'asm existe, l'instance est donc demarree

   v_profile=`asmcmd dsget|cut -d ':' -f2|uniq`
   DG=`$GRID_HOME/bin/kfod asm_diskstring='/dev/oracleasm/disks/*' dscvgroup=TRUE disks=all|grep DISK|awk '{print $5}'|grep -v \#|sort|uniq` #Liste des diskgroups

   if test -n "$DG"; then
      for x in $DG
      do
         echo
         printf '\033[32m' #couleur verte
         printf '\033[4m' #Souligner phrase
         echo -e "Diskgroup: $x"'\033[0m';
         printf '\033[0m' #Annuler couleur verte et le souligner
         echo
         echo
         echo "  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util "
         echo "======================================================================"

         $GRID_HOME/bin/asmcmd lsdg $x | \
         awk -v sq="'" 'BEGIN { getline } {
         printf"  %s  \t %11"sq"d \t %9"sq"d \t %8"sq"d \t %3d%% \n",$13,$7/1024,($7-$8)/1024,$8/1024,100-100*($8/$7)
         }'
         echo
         if [[ $v_profile == /dev*  ]]; then
            echo "  Disque(s)                              Taille (MB)      Taille (GB) "
            echo "======================================================================"

            /usr/bin/diff <($GRID_HOME/bin/kfod asm_diskstring='/dev/oracleasm/disks/*' group=$x) <($GRID_HOME/bin/kfod asm_diskstring='/dev/oracleasm/disks/*' group=#) | \
            awk -v sq="'" 'BEGIN { getline } {
            printf"  %s  \t %10"sq"d \t %11"sq"d \n",$5,$3,$3/1024
            }' | grep DISK
         else
            echo
            echo "  Disque(s)              Taille (MB)      Taille (GB) "
            echo "======================================================"
            echo
            /usr/bin/diff <($GRID_HOME/bin/kfod asm_diskstring='ORCL*' group=$x) <(kfod asm_diskstring='ORCL*' group=#) | \
            awk -v sq="'" 'BEGIN { getline } {
            printf"  %s  \t %10"sq"d \t %11"sq"d \n",$5,$3,$3/1024
            }' | grep DISK
         fi
         echo
      done
   fi
      printf '\033[32m' #couleur verte
      printf '\033[4m' #Souligner phrase
      echo -e "Disque(s) n'appartenant a aucun diskgroup:"'\033[0m';
      printf '\033[0m' #Annuler couleur verte

      nb=`$GRID_HOME/bin/kfod asm_diskstring='/dev/oracleasm/disks/*' group=# | grep DISK |wc -l` #nombre de disques n'appartenent a aucun diskgroup

      if [ "$nb" -ge 1 ]; then

         echo
         echo "  Disque(s)                              Taille (MB)      Taille (GB) "
         echo "======================================================================"

         $GRID_HOME/bin/kfod asm_diskstring='/dev/oracleasm/disks/*' group=# | \
         awk -v sq="'" 'BEGIN { getline } {
         printf"  %s  \t %10"sq"d \t %11"sq"d \n",$4,$2,$2/1024
         }' | grep DISK
         echo
      else
         echo
         echo "Il n'existe aucun disque libre dans cet environnement"
         echo
      fi
else # Il n'y a pas de process pmon pour asm, l'instance asm n'est donc pas demarree.
   printf '\033[31m' #couleur rouge
   echo "********************************************************************"
   echo "***** Desole, l'instance ASM n'est pas demarree sur ce noeud ! *****"
   echo "********************************************************************"
   printf '\033[0m' #Annuler couleur rouge
fi


Exemple de résultat obtenu:



[oracle@svr_host ]$ ./asm_kfod.ksh

Diskgroup: DATA


  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util
======================================================================
  DATA/                      400                 86                  313         21%

  Disque(s)                              Taille (MB)                            Taille (GB)
======================================================================
  /dev/oracleasm/disks/DISK_AL9             409,626              400


Diskgroup: DATA11G


  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util
======================================================================
  DATA11G/               2,800              481               2,318         17%

  Disque(s)                              Taille (MB)                             Taille (GB)
======================================================================
  /dev/oracleasm/disks/DISK_AL1             409,626              400
  /dev/oracleasm/disks/DISK_AL2             409,626              400
  /dev/oracleasm/disks/DISK_AL3             409,626              400
  /dev/oracleasm/disks/DISK_AL4             409,626              400
  /dev/oracleasm/disks/DISK_AL5             409,626              400
  /dev/oracleasm/disks/DISK_AL6             409,626              400
  /dev/oracleasm/disks/DISK_AL7             409,626              400


Diskgroup: FRA


  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util
======================================================================
  FRA/                       400                  41                 358            10%

  Disque(s)                              Taille (MB)                            Taille (GB)
======================================================================
  /dev/oracleasm/disks/DISK_AL10            409,626              400


Diskgroup: FRA11G


  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util
======================================================================
  FRA11G/                400               17                     382              4%

  Disque(s)                              Taille (MB)                         Taille (GB)
======================================================================
  /dev/oracleasm/disks/DISK_AL8             409,626              400


Diskgroup: OCR_VOTE


  Diskgroup        Total (GB)     Util (GB)     Libre (GB)      %Util
======================================================================
  OCR_VOTE/               20             0                 19                   1%

  Disque(s)                                                 Taille (MB)       Taille (GB)
======================================================================
  /dev/oracleasm/disks/DISK_AL11             10,240               10
  /dev/oracleasm/disks/DISK_AL12             10,240               10

Disque(s) n'appartenant a aucun diskgroup:

Il n'existe aucun disque libre dans cet environnement


Hope it helps...

jeudi 25 juillet 2013

OEM 12c - Archivage excessif après migration de la version 12cR1 vers 12cR2

J'ai rencontré récemment un problème avec la base de données du référentiel d'oem 12c.
Après avoir migré de la version OEM 12cR1 (12.1.0.1.0) vers OEM 12cR2 (12.1.0.2.0) la base de données du référentiel s'est mise à générer un nombre excessif d'archives.
Ce qui avait pour effet de remplir très rapidement l'espace alloué à cet effet et de faire planter la base de données. J'ai appliqué le PSU 14840279 pour obtenir la version 12.1.0.2.1, mais le problème n'a pas été réglé. Après quelques recherches je me suis rendu compte qu'il s'agissait d'un bug connu.

Pour corriger le problème il faut appliquer le Patch 14833587 au home de l'OMS.
Ce patch est aussi inclus dans le PSU 14840279, donc dans mon cas je n'avais pas besoin de l'appliquer.

D'ailleurs, appliquer le patch ne règle pas systématiquement le problème puisque le mal est déjà fait. En effet, dans mon cas la table em_job_metrics contenait déjà des millions d'enregistrements et c'est le travail de nettoyage qui générait les archives.
Après avoir appliqué le patch ou le PSU, il faut vider la table EM_JOB_METRICS.
Il est important de faire le "truncate" une seule fois.

SQL> truncate table em_job_metrics;

Pour plus de détails, voir le document:




Hope it helps...