problème lors du démarrage de l'instance ASM suite à l'arrêt d'un nœud d'un RAC

Suite au redémarrage d’un des nœuds de cluster, il arrive de constater que l’instance ASM ne démarre pas. Le symptôme est le suivant :

  ORA-00600: internal error code, arguments: [kfmdPrijoinPriv07] dans le fichier alert.log

il s’agit d’un bug référencé en 11.2.0.3 :
Bug 12533318: 11203_ASM_X64:ORA-600 [KFMDPRIJOINPRIV07] WHEN ASM START AND TRY TO MOUNT ALL DG
En fait , le paramètre d’initialisation asm_diskgroups contient plus de 63 valeurs, maximum autorisée. Cette limite est vraie quelque soit la version du clusterware.

Cela s’explique par le fait que les diskgroups supprimés ne sont pas retirés de la valeur du paramètre asm_diskgroups stockée dans le spfile.
Pour corriger le problème, connectez vous sur un nœud encore actif et , avec asmcmd, retrouvez tous les disques définis. le problème c’est que l’on ne retrouvera de cette manière que les disques qui sont montés sur l’ensemble des noeuds du cluster.  Si des disksgroups ne sont montés que sur le serveur qui pose problème, on ne les retrouvera pas de cette manière. On pourra alors utiliser la commande oracleasm listdisks pour retrouver les disques physiques associés au serveurs.
A l’aide de cette liste et à partir d’un nœud encore actif, modifiez le paramètre asm_diskgroups pour l’instance asm du serveur qui pose problème.
Sous le user grid, une fois l’environnement de l’instance ASM positionné, connectez vous par sqlplus en tant que sysasm et passez la commande suivante :

  alter system set asm_diskgroups='+disk1','+disk2','+disk3' sid='+ASMx' scope=spfile;

Placez vous sur le serveur à problème et, soit vous le rebootez, soit sous le user root et une fois que vous aurez positionné l’environnement de l’instance ASM, lancez les commandes suivantes :

  crsctl stop crs -f
  crsctl start crs

Normalement, le clusterware doit redémarrer ainsi que la base ASM et, par la même, les bases de données installées sur le noeud du cluster.
Si des bases manquent, c’est que des diskgroups ont certainement été oubliés. Pour savoir lesquels, pour chaque base qui n’est pas démarrée lancez la commande suivante :

 srvctl config database -d DBNAME

On retrouve les diskgroups affectés à la base de données à la ligne Disk Groups :
Ajoutez les diskgroups manquants à la valeur du paramètre asm_diskgroups et redémarrez le crs.
Si vous ne disposez pas d’un nœud actif, vous devez démarrer l’instance ASM  à l’aide d’un fichier pfile après avoir modifié le paramètre asm_diskgroups.
La liste des disques ASM disponible peut être retrouvée à l’aide de la commande oracleasm listdisks lancée sous root.
Attention , dans ce cas on ne récupère pas les diskgroups ASM mais les volumes physiques , d’où l’importance de trouver une règle de nommage qui permet d’associer les disques ASM au diskgroup.
Une fois l’instance ASM démarrée, recréer le spfile à partir du pfile, puis redémarrez le crs à l’aide de la commande de votre choix.
Une fois cela fait , n’oubliez pas de modifier la valeur du paramètre asm_diskgroups pour les autres instances ASM du cluster afin d’éviter que le problème ne se reproduise lors du prochain reboot du cluster.

4 réflexions sur “problème lors du démarrage de l'instance ASM suite à l'arrêt d'un nœud d'un RAC”

  1. Ce qui me fait peur avec l asm c est de gérer deux instances alors qu’on connaît ce que s’est qu un problème d instance avec oracle…

  2. Herve Etche

    Merci pour l’info concernant le bug.
    Mais concernant l’article lui meme, je trouve qu’il y a trop de confusions.
    1- Le paramètre asm_diskgroups est géré de façon dynamique. Donc lorsque vous dites que le problème arrive lorsqu’on supprime des diskgroups et que le paramètre n’est pas mis à jour dans le spfile, l’info n’est pas correcte:
    Voir:
    http://docs.oracle.com/cd/E11882_01/server.112/e18951/asminst.htm#OSTMG10141
    2- Lorsqu’on est connecté à un noeud actif, que les diskgroups soient montés ou pas sur les autres noeuds, il est possible de voir la liste dans les vues dynamiques.
    3- On ne peut pas utiliser la commande oracleasm listdisks pour retrouver des diskgroups, puisque comme vous le dites, cette commande donne les noms des disques.
    4- Aussi oracleasm est utilise en environnement linux, on ne peut pas le mentionner comme solution dans un article où on ne précise pas d’OS en particulier.
    Merci

    1. en réponse à tes différentes remarques :
      point 1- en effet la mise a jour du fichier spile est dynamique sauf que lorsque tu utilises asmca, seul le paramètre lié a l’instance ASM sur laquelle tu es connecté au moment de la suppression est mis a jour. Tu peux vérifier , un paramètre lié a l’instance ASM est ajouté dans le spfile.
      Point 2 – la encore c’est juste , sauf que dans le cas présent , suite au reboot des serveurs, tes instances ASM ne sont pas redémarrées vue que l’on a plus de 64 diskgroups de définit.
      point 3 – Toujours juste , sauf que je precise que ce n’est utile que si il y a un rapport étroit entre le nom des disques ASM et le nom des disques groupes.
      Point 4 – rien a dire.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *