Lorsque l’on installe le Grid Infrastructure avec du stockage ASM, nous demandons à nos administrateurs SAN et Stockage préférés quelques LUNs sur une baie qui sont présentées au serveur, voire les serveurs en cas de RAC. Puis nous ajoutons, éventuellement, des alias multipath avant de créer nos disques ASM avec la commande:
oracleasm createdisk REDOA1 /dev/mapper/ASM_REDOA1
Mais une fois que ces disques ASM sont créés, comment faire pour retrouver le disk réel (LUN de SAN) qui lui est associé? Si l’on en croit la documentation, il faut utiliser l’option querydisk:
oracleasm querydisk REDOA1 Disk "REDOA1" is a valid ASM disk
Super on est plutôt avancé là… mais heureusement, il y a des options « non-documentées »
En cherchant, je suis d’abord tombé sur un post d’Alejandro Vargas qui fournissait exactement ce que je cherchais, mais qui utilisait, visiblement, une ancienne version d’oracleasm, puis un post de Satish Chikkathammaiah, plus récent mentionne l’option -d devant le disque ASM, donc essayons:
oracleasm querydisk -d REDOA1 Disk "REDOA1" is a valid ASM disk on device [253, 10]
Et là on peut avancer, car ces 2 chiffres entre crochets, sont les valeurs majeures et mineures du disque, ici en multipath et l’on peut trouver la correspondance avec le disque à 2 endroits:
- /dev:
ls -l /dev/ | grep 253| grep 10 brw-rw---- 1 root root 253, 10 fév 16 15:59 dm-10
- /proc/partitions:
cat /proc/partitions | grep 253| grep 10 253 5 10485760 dm-5 253 12 104857600 dm-12 253 23 104857600 dm-23 253 10 20971520 dm-10 253 18 104857600 dm-18 ...
Donc notre disque REDOA1 est donc basé sur le disque multipath dm-10. Pour connaitre les chemins physiques, on utilise la commande multipath:
multipath -l | grep -A 9 dm-10 ASM_REDOA1 (360a98000646f6171435a6734524d7261) dm-10 NETAPP,LUN [size=20G][features=1 queue_if_no_path][hwhandler=0][rw] _ round-robin 0 [prio=0][enabled] _ 0:0:2:4 sdac 65:192 [active][undef] _ round-robin 0 [prio=0][active] _ 0:0:3:4 sdaw 67:0 [active][undef] _ round-robin 0 [prio=0][enabled] _ 1:0:2:4 sdco 69:192 [active][undef] _ round-robin 0 [prio=0][enabled] _ 1:0:3:4 sddi 71:0 [active][undef]
Ici on est en stockage NETAPP, donc nous utiliserons la commande sanlun lun show pour trouver le nom de la LUN concernée. Voici le script que j’ai adapté des experts cités plus haut:
#!/bin/ksh export ORACLE_HOME=`grep ASM /etc/oratab | cut -d: -f2` export PATH=$PATH:~$user/dba/scripts/bin:$ORACLE_HOME/bin export SID=`grep ASM /etc/oratab | cut -d: -f1` printf "n%-15s %-12s %-11s %-8s %-8s %-35sn" "ASM disk" "based on" "Major,Minor" "Size(Gb)" "SAN bay" "SAN device name" printf "%-15s %-12s %-11s %-8s %-8s %-35sn" "===============" "===========" "===========" "========" "=======" "==================================" for i in `/etc/init.d/oracleasm listdisks` do v_asmdisk=`/etc/init.d/oracleasm querydisk -d $i | awk '{print $2}'| sed 's/"//g'` v_minor=`/etc/init.d/oracleasm querydisk -d $i | awk -F[ '{print $2}'| awk -F] '{print $1}' | awk '{print $1}'` v_major=`/etc/init.d/oracleasm querydisk -d $i | awk -F[ '{print $2}'| awk -F] '{print $1}' | awk '{print $2}'` v_device=`ls -la /dev | awk -v v_minor=$v_minor -v v_major=$v_major '{if ( $5==v_minor ) { if ( $6==v_major ) { print $10}}}'` v_real_dev=`multipath -ll | grep -A 4 $v_device | grep ready | awk '{print $3}'` sanlun lun show | grep $v_real_dev | awk '{print $1,$2,$3}' > tmp1.lst cat tmp1.lst | while read line do v_san_bay=`echo $line | awk '{print $1}'` v_san_str=`echo $line | awk '{print $2}' | awk -F "/" '{print $5}'` v_san_dev=`echo $line | awk '{print $3}'` if [ "$v_san_dev" == "/dev/$v_real_dev" ]; then v_san_name=$v_san_str fi done rm -f tmp1.lst v_size=`${ORACLE_HOME}/bin/kfod asm_diskstring='ORCL:*' disks=all | grep ${v_asmdisk} | awk '{print $2}'` v_size=`expr $v_size / 1024` Total_size=`expr $Total_size + $v_size` Formated_size=`echo $v_size | sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta'` printf "%-15s %-12s %-11s %-8s %-8s %-35sn" $v_asmdisk "/dev/$v_device" "[$v_minor $v_major]" $Formated_size $v_san_bay $v_san_name done #####################################################
Qui produit un résultat du style:
ASM disk based on Major,Minor Size(Gb) SAN bay SAN device name =============== =========== =========== ======== ======= ================================== DATAFINPPK1 /dev/dm-14 [253, 14] 20 sank52B: L_RACPPRK01_9_DATAFINPPK1 DATAHUBPPK1 /dev/dm-25 [253, 25] 50 sank52B: L_RACPPRK01_21_DATAHUBPPK1 DATATSTDGRK1 /dev/dm-24 [253, 24] 50 sank52B: L_RACPPRK01_20_DATATSTDGRK1 FRA1 /dev/dm-12 [253, 12] 100 sank52B: L_RACPPRK01_7_ARCH CLUSTER1 /dev/dm-26 [253, 26] 2 sank52B: L_RACPPRK01_1_CLUSTER1 CLUSTER2 /dev/dm-27 [253, 27] 2 sank52B: L_RACPPRK01_2_CLUSTER2 CLUSTER3 /dev/dm-8 [253, 8] 2 sank52B: L_RACPPRK01_3_CLUSTER3 CTRLA1 /dev/dm-21 [253, 21] 2 sank52B: L_RACPPRK01_17_CTRLA1 CTRLB1 /dev/dm-22 [253, 22] 2 sank52B: L_RACPPRK01_18_CTRLB1 REDOA1 /dev/dm-10 [253, 10] 20 sank52B: L_RACPPRK01_5_REDOA1 REDOB1 /dev/dm-11 [253, 11] 20 sank52B: L_RACPPRK01_6_REDOB1 TEMP1 /dev/dm-23 [253, 23] 100 sank52B: L_RACPPRK01_19_TEMP1
ATTENTION: Si vous êtes en RAC, exécutez ce script sur tous les nœuds, car le nom multipath est propre à chaque serveur!