jeudi 13 septembre 2012

SCAN: ORA-00119, ORA-00132 Incorrect Value for REMOTE_LISTENER

Vous voulez utiliser le SCAN (Single Client Access Naming) dans le paramètre REMOTE_LISTENER.

Mais vous rencontrez les messages d'erreur:


SQL> alter system set remote_listener='cluster-scan:1521' scope=both sid='*';
alter system set remote_listener='cluster-scan:1521' scope=both sid='*'
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00119: invalid specification for system parameter REMOTE_LISTENER
ORA-00132: syntax error or unresolved network name 'cluster-scan:1521'

Cependant vous êtes sûr que le SCAN n'est pas en cause:


[oracle@svrhost1 ~]$ nslookup cluster-scan
Server:         192.41.50.104
Address:        192.41.50.104#53

Name:   cluster-scan.domaine.com
Address: 192.51.242.106
Name:   cluster-scan.domaine.com
Address: 192.51.242.108
Name:   cluster-scan.domaine.com
Address: 192.51.242.107

[oracle@srvhost1 ~]$


Le problème est tout simplement dû au fait que l'on utilise une chaine de connexion EZCONNECT.

Solution:
Dans le fichier sqlnet.ora local, ajouter EZCONNECT à la ligne NAMES.DIRECTORY_PATH=(TNSNAMES)

La ligne devient:

NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT).

Hope it helps.


mercredi 11 juillet 2012

Comment renommer un diskgroup avec ASM 11gR2

Le but de cet article est de présenter la commande "renamedg".
Le diskgroup à renommer ne contient ni ocr ni voting disk.

La commande "renamedg" située dans $GRID_HOME/bin permet de renommer un diskgroup dans ASM 11gR2 sans avoir à le supprimer et le recréer.

Pour voir la syntaxe:
$GRID_HOME/bin/renamedg -help

Exemple:
Nous avons un diskgroup appelé DATADG que nous souhaitons renommer en DATADG_NEW

Se connecter au serveur avec l'utilisateur ayant installé le grid infrastructure et positionner les paramètres d'environnement comme il se doit, puis:

Voir la liste des diskgroups actuels:


[oracle@svrhost1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576   1179801   107210                0          107210              0             N  FRADG/
MOUNTED  EXTERN  N         512   4096  1048576    409626   409521                0          409521              0             N  DATADG/
[oracle@svrhost1 ~]$

 Démonter le diskgroup DATADG (le faire sur tous les noeuds en environnement RAC):


[oracle@svrhost1 ~]$ asmcmd umount DATADG

 Revoir la liste des diskgroups:


[oracle@svrhost1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576   1179801   107210                0          107210              0             N  FRADG/
[oracle@svrhost1 ~]$

Renommer le diskgroup:



[oracle@svrhost1 ~]$ renamedg dgname=DATADG newdgname=DATADG_NEW verbose=true

Parsing parameters..

Parameters in effect:

         Old DG name       : DATADG
         New DG name          : DATADG_NEW
         Phases               :
                 Phase 1
                 Phase 2
         Discovery str        : (null)
         Clean              : TRUE
         Raw only           : TRUE
renamedg operation: dgname=DATADG newdgname=DATADG_NEW verbose=true
Executing phase 1
Discovering the group
Performing discovery with string:
Identified disk ASM:/opt/oracle/extapi/64/asm/orcl/1/libasm.so:ORCL:DISK_AD3 with disk number:0 and timestamp (32969770 -442787840)
Checking for hearbeat...
Re-discovering the group
Performing discovery with string:
Identified disk ASM:/opt/oracle/extapi/64/asm/orcl/1/libasm.so:ORCL:DISK_AD3 with disk number:0 and timestamp (32969770 -442787840)
Checking if the diskgroup is mounted or used by CSS
Checking disk number:0
Generating configuration file..
Completed phase 1
Executing phase 2
Looking for ORCL:DISK_AD3
Modifying the header
Completed phase 2
Terminating kgfd context 0x7fa8e82920a0
[oracle@svrhost1 ~]$


Vérifier encore les diskgroups:


[oracle@svrhost1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576   1179801   107210                0          107210              0             N  FRADG/
[oracle@svrhost1 ~]$

Monter le diskgroup renommé (le faire sur tous les noeuds en environnement RAC):


[oracle@svrhost1 ~]$ asmcmd mount DATADG_NEW

Vérifier les diskgroups:


[oracle@svrhost1 ~]$ asmcmd lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576    409626   409521                0          409521              0             N  DATADG_NEW/
MOUNTED  EXTERN  N         512   4096  1048576   1179801   107210                0          107210              0             N  FRADG/
[oracle@svrhost1 ~]$


Notes importantes:
1- Après avoir renommé le diskgroup, prendre le soin de renommer les fichiers qui étaient dans ce diskgroup, car le nom du diskgroup est inclus dans les noms des fichiers.
2- Lorsqu'on veut renommer un diskgroup qui contient l'ocr et les voting disks, la procédure est différente. Nous y reviendrons dans un autre article. Mais d'ores et déjà, il faut savoir qu'il faut créer un diskgroup temporaire dans lequel il faut déplacer l'ocr, le voting disk et le spfile file d'asm avant de renommer le diskgroup. Une fois la procédure terminée, retourner les fichiers dans le diskgroup renommé.

Hope it helps...

jeudi 5 juillet 2012

Comment identifier le process id d'une session oracle

Vous avez une session oracle qui vous cause des troubles.

Vous avez identifié la session à problème et avez essayé de la tuer au niveau sql sans succès avec:

ALTER SYSTEM KILL SESSION 'sid , serial#';

Vous souhaitez donc tuer la session à l'aide de son process ID au niveau de l'OS.
Mais comment identifier le process ID?
Utiliser la requête suivante:
 
col username format a20
col osuser format a20
col machine format a25
col terminal format a15
col program format a50

SELECT s.sid, s.serial#, s.username, s.osuser, p.spid, s.machine, p.terminal, s.program 
FROM v$session s, v$process p 
WHERE s.paddr = p.addr;

Identifier le SPID de votre session à problème.
Puis au niveau du système d'exploitation:

Unix/Linux:
kill -9 <SPID>

Windows:
$ORACLE_HOME/bin/orakill $ORACLE_SID <SPID>

Hope it helps...

mardi 3 juillet 2012

Comment vérifier que le driver ACFS est installé ou pas?

ASM Cluster File System (ACFS) inclus dans le grid infrastructure 11gR2 n'est pas encore supporté sur certaines plate-formes. Même sur la plate-forme Oracle Linux, il y a certaines versions pour lesquelles elle n'est pas supportée.

Comment vérifier donc que notre installation du Grid Infrastructure 11gR2 a bien installé et configuré ACFS?

Pour cela, se connecter au serveur en tant qu'utilisateur ayant installé le grid infrastructure 11gR2, se positionner dans le GRID_HOME/bin et utiliser la commande "acfsdriverstate".

Ci-dessous un exemple dans un environnement où ACFS n'est pas supporté:


[oracle@srvhost1 bin]$ acfsdriverstate -h
ACFS-9206: usage: acfsdriverstate [-orahome <oracle_home>] <installed | loaded | version | supported> [-s]
[oracle@srvhost1 bin]$ acfsdriverstate installed
ACFS-9204: false
[oracle@srvhost1 bin]$ acfsdriverstate loaded
ACFS-9204: false
[oracle@srvhost1 bin]$ acfsdriverstate version
ACFS-9129: ADVM/ACFS not installed
[oracle@srvhost1 bin]$ acfsdriverstate supported
ACFS-9459: ADVM/ACFS is not supported on this OS version: '2.6.32-300.11.1.el5uek'
ACFS-9201: Not Supported
[oracle@srvhost1 bin]$

Hope it helps...

jeudi 21 juin 2012

Informations sur les ressources du clusterware, les dernières sauvegardes de l'OCR/OLR et les statuts des voting disks

Je vous partage un script que j'ai écrit chez un client, qui permet d'afficher les ressources du clusterware, les dernières sauvegardes de l'OCR et OLR et le statut des voting disks.

Lorsqu'aucune ressource n'est passée en paramètre, le script affiche les informations sus-mentionnées.
Par contre, si on passe une ressource en paramètre, le script affiche juste le statut de cette dernière.


# 29-03-2012 - Creation initiale - Par Herve Etche
# 15-06-2012 - Ajout de la section des voting disks - Herve Etche

# Ce script affiche le statut general des ressources du cluster et les derniers backups de l'OCR et de l'OLR si on ne lui passe aucun parametre
#Il affiche aussi les informations concernant les voting disks.
# S'il y a une ressource passee en parametre, alors il affiche les details concernant la ressource en question
# Exemple de parametre: resource_script ora.asm -t (affiche seulement le statut de la ressource ora.asm) -- En supposant que resource_script est le nom donne au script

#!/usr/bin/ksh
HOST_NAME=`hostname -s`
GRID_HOME=$(cat /etc/oratab | awk -F: '/^\+ASM/{print $2}') #Recuperer le GRID_HOME a partir du fichier /etc/oratab
CRSD_PID=`ps -ef|grep crsd.bin|grep -v grep|awk '{print $2}'` #Le PID du process crsd
if [ $CRSD_PID ]; then #si le pid du process crsd existe, cela signifie que le clusterware est demarre
   STATUS_CRS=`$GRID_HOME/bin/crsctl stat res ora.asm -t|head -1|cut -d ':' -f1`
   if [ $STATUS_CRS != "CRS-4535" ]; then #Sinon impossible de communiquer avec le Cluster Ready Services (crs en cours de demarrage)
      if [[ $# -eq 0 ]]; then #Aucune ressource n'est passee en parametre
         #Afficher le status general des ressources sous forme tabulaire
         $GRID_HOME/bin/crsctl stat res -t

         #Afficher le dernier backup de l'OCR (Oracle Cluster Registry)
         printf '\033[31m' #couleur rouge
         echo -e "\nLes backups de l'OCR sont effectues sur le MASTER du cluster."
         printf '\033[0m' #Annuler couleur rouge
         A_OCR_MAXDATE=`$GRID_HOME/bin/ocrconfig -showbackup auto|awk '{print($2,$3)}'|sort -r|head -1` #Date et heure du dernier backup auto
         M_OCR_MAXDATE=`$GRID_HOME/bin/ocrconfig -showbackup manual|awk '{print($2,$3)}'|sort -r|head -1` #Date et heure du dernier backup manuel
         A_MNODE=`$GRID_HOME/bin/ocrconfig -showbackup auto|grep -m 1 "$A_OCR_MAXDATE"|cut -d ' ' -f1` #Master lors du dernier backup auto
         A_ERROR=`echo $A_MNODE|cut -c1-4`
         M_MNODE=`$GRID_HOME/bin/ocrconfig -showbackup manual|grep -m 1 "$M_OCR_MAXDATE"|cut -d ' ' -f1` #Master lors du dernier backup manuel
         M_ERROR=`echo $M_MNODE|cut -c1-4`
         printf '\033[4m' #Souligner phrase
         echo "Backup Automatique (chaque 4h):"
         printf '\033[0m' #Annuler souligner phrase
         if [ $A_ERROR = "PROT" ]; then #S'il n'existe pas de backup auto
            printf '\033[0;32m' #Couleur verte
            echo "Il n'existe aucun backup automatique de l'OCR"
            printf '\033[0m' #Annuler couleur verte
         else
            echo "Le master au moment du dernier backup automatique etait: "$A_MNODE
            echo -e "Le dernier backup automatique de l'OCR, effectue sur \""$A_MNODE\" "est:"
            printf '\033[0;32m' #Couleur verte
            $GRID_HOME/bin/ocrconfig -showbackup auto|grep -m 1 "$A_OCR_MAXDATE" #Affichage du dernier backup auto
            printf '\033[0m' #Annuler couleur verte
         fi
         printf '\033[4m' #Souligner phrase
         echo "Backup Manuel:"
         printf '\033[0m' #Annuler souligner phrase
         if [ $M_ERROR = "PROT" ]; then #S'il n'existe pas de backup manuel
            printf '\033[0;32m' #Couleur verte
            echo "Il n'existe aucun backup manuel de l'OCR"
            printf '\033[0m' #Annuler couleur verte
         else
            echo "Le master au moment du dernier backup manuel etait: "$M_MNODE
            echo -e "Le dernier backup manuel de l'OCR, effectue sur \""$M_MNODE\" "est:"
            printf '\033[0;32m' #Couleur verte
            $GRID_HOME/bin/ocrconfig -showbackup manual|grep -m 1 "$M_OCR_MAXDATE" #Affichage du dernier backup manuel
            printf '\033[0m' #Annuler couleur verte
         fi
         echo -e "\n"
         #Afficher le dernier backup de l'OLR (Oracle Local Registry) du noeud a partir duquel le script est lance
         printf '\033[31m' #couleur rouge
         echo "Les backups de l'OLR sont effectues localement sur chaque noeud du cluster."
         printf '\033[0m' #Annuler couleur rouge
         OLR_MAXDATE=`$GRID_HOME/bin/ocrconfig -local -showbackup|awk '{print($2,$3)}'|sort -r|head -1` #Date et heure du dernier backup de l'olr
         LNODE=`$GRID_HOME/bin/ocrconfig -local -showbackup|awk '{print $1}'|sort -r|head -1` #Utiliser LNODE et non "hostname" pour s'assurer de l'existence ou pas d'un backup
         L_ERROR=`echo $LNODE|cut -c1-4`
         if [ $L_ERROR = "PROT" ]; then #S'il n'existe pas de backup de l'OLR
            printf '\033[0;32m' #Couleur verte
            echo -e "Il n'existe aucun backup de l'OLR sur le noeud local \"`hostname -s`\"\n" #Utiliser "hostname" car LNODE ici contient une erreur
            printf '\033[0m' #Annuler couleur verte
         else
            echo -e "Le dernier backup de l'OLR, effectue sur le noeud local \""$LNODE\" "est:"
            printf '\033[0;32m' #Couleur verte
            $GRID_HOME/bin/ocrconfig -local -showbackup|grep -m 1 "$OLR_MAXDATE" #Affichage du dernier backup de l'OLR
            printf '\033[0m' #Annuler couleur verte
            echo -e "\n"
         fi

         #Information sur les voting disks
         nb_voting=`$GRID_HOME/bin/crsctl query css votedisk|tail -1|awk '{print $2}'` #nombre de voting disks
         printf '\033[31m' #couleur rouge
         echo "Les donnees des voting disks sont automatiquement sauvegardees dans l'OCR a chaque changement de configuration."
         printf '\033[0m' #Annuler couleur rouge
         echo -e "Il existe \033[0;32m$nb_voting\033[0m voting disk(s)"
         nb=1
         while [ $nb -le $nb_voting ]
         do
            statut=`$GRID_HOME/bin/crsctl query css votedisk|sed 's/^ //g'|grep ^[0-9]|grep -m 1 $nb.|awk '{print $2}'`
            diskgrp=`$GRID_HOME/bin/crsctl query css votedisk|sed 's/^ //g'|grep ^[0-9]|grep -m 1 $nb.|cut -d '[' -f2|cut -d ']' -f1`
            disk=`$GRID_HOME/bin/crsctl query css votedisk|sed 's/^ //g'|grep ^[0-9]|grep -m 1 $nb.|cut -d '(' -f2|cut -d ':' -f2|cut -d ')' -f1`
            if [ $diskgrp ]; then
               echo -e "Le voting disk numero \033[0;32m$nb\033[0m, situe dans le diskgroup \033[0;32m$diskgrp\033[0m, disque \033[0;32m$disk\033[0m, a un statut \033[0;32m$statut\033[0m."
            else
               echo -e "Le voting disk numero \033[0;32m$nb\033[0m, situe dans le disque \033[0;32m$disk\033[0m, a un statut \033[0;32m$statut\033[0m."
            fi
            nb=$(( $nb + 1 ))
         done
         echo -e "\n"
      else #Une ressource est passee en parametre
         #Afficher seulement le status de cette derniere
         $GRID_HOME/bin/crsctl stat res "$@"
      fi
   else #Clusterware en cours de demarrage donc impossible de communiquer avec le crs malgre que le process crsd.bin existe
      echo -e "\n*******************************************************************"
      printf '\033[4m' #Souligner phrase
      echo "Statut des ressources du cluster:"
      printf '\033[0m' #Annuler souligner phrase
      echo "Le clusterware est en cours de demarrage sur le noeud local!"
      echo "Veuillez patienter ou lancer la commande a partir d'un autre noeud."
      echo -e "*******************************************************************\n"
   fi
else #Pas de process crsd, donc le clusterware n'est pas demarre
   echo -e "\n*************************************************"
   echo " Le clusterware n'est pas demarre sur ce noeud !"
   echo -e "*************************************************\n"
fi
find $GRID_HOME/log/$HOST_NAME/client/ocrconfig* -user $USER -type f -mtime +15 -exec rm {} \; #Efface les fichiers log generes par la commande ocrconfig datant de plus de 15 jours

Exemple de résultat attendu sans paramètre:

[oracle@srvhost1 ~]$ ./resource_script.sh
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       srvhost1
               ONLINE  ONLINE       srvhost2
ora.FRA.dg
               ONLINE  ONLINE       srvhost1
               ONLINE  ONLINE       srvhost2
Les backups de l'OCR sont effectues sur le MASTER du cluster.
Backup Automatique (chaque 4h):
Le master au moment du dernier backup automatique etait: srvhost1
Le dernier backup automatique de l'OCR, effectue sur "srvhost1" est:
srvhost1     2012/06/21 13:55:11     /ora01/app/grid/grid_11g/cdata/crs11gr2/backup00.ocr
Backup Manuel:
Le master au moment du dernier backup manuel etait: srvhost2
Le dernier backup manuel de l'OCR, effectue sur " srvhost2" est:
srvhost2     2012/05/10 15:12:30     /ora01/app/grid/grid_11g/cdata/crs11gr2/backup_20120510_151230.ocr

Les backups de l'OLR sont effectues localement sur chaque noeud du cluster.
Le dernier backup de l'OLR, effectue sur le noeud local "srvhost1" est:
srvhost1     2012/04/30 12:07:40     /ora01/app/grid/grid_11g/cdata/srvhost1/backup_20120430_120740.olr

Les donnees des voting disks sont automatiquement sauvegardees dans l'OCR a chaque changement de configuration.
Il existe 1 voting disk(s)
Le voting disk numero 1, situe dans le diskgroup OCRDG, disque DISK_D01, a un statut ONLINE.
[oracle@srvhost1 ~]$

Avec des paramètres:
--Exemple: Rechercher toutes les ressources contenant le mot "inst" c'est à dire les instances enregistrées dans le clusterware.

[oracle@ srvhost1 ~]$ ./resource_script -w "NAME co inst" -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.db1.db11.inst
      1        ONLINE  ONLINE       srvhost1
ora. db1. db12.inst
      1        ONLINE  ONLINE       srvhost2
ora.db2.db21.inst
      1        ONLINE  ONLINE       srvhost1
ora.db2.db22.inst
      1        ONLINE  ONLINE       srvhost2
ora.db3.db31.inst
      1        ONLINE  ONLINE       srvhost1
ora.db3.db32.inst
      1        ONLINE  ONLINE       srvhost2
 [oracle@ srvhost1 ~]$

Hope it helps...