Lorsqu’on utilise un OS classique avec un filesystem bien fait trouver la surface des bases de données est assez aisé. Cependant déterminer la Taille des BDD dans ASM est un peu moins évident.
Par exemple :
Mon ami le N2 m’a appelé en panique : Oulalalalaaaaaa, y’a pu d’place sur +DATA, quoi qu’on fait ?
C’est à peu près à ce moment là, si ce n’était déjà fait, que l’on regrette d’utiliser ASM.
Ce que je souhaitais était la sortie de la commande :
for i in $( asmcmd ls data | grep '/$' ); do echo $i : $( asmcmd du data/$i | grep -v Used | awk '{printf ("%6.2f Go", $1/1024) ;}'); done
Après quelques lignes et quelques dizaines de minutes d’exécution sur mon RAC qui héberge un bonne centaine de base, j’ai abandonné. Et me suis tourné vers SQL :
set pages 0 emb on select dbname , gname , sum(bytes2)/1024/1024/1024 SZG from ( select x.gnum , x.filnum , x.full_alias_path , f.ftype , x.gname , x.dbname , f.bytes , f.bytes2 from ( SELECT gnum , filnum , concat('+'||gname, sys_connect_by_path(aname, '/')) full_alias_path , gname , connect_by_root aname dbname FROM ( SELECT g.name gname , a.parent_index pindex , a.name aname , a.reference_index rindex , a.group_number gnum , a.file_number filnum FROM v$asm_alias a , v$asm_diskgroup g WHERE a.group_number = g.group_number ) START WITH (mod(pindex, power(2, 24))) = 0 CONNECT BY PRIOR rindex = pindex ) x, ( select group_number gnum , file_number filnum , type ftype , bytes , block_size * blocks bytes2 from v$asm_file order by group_number,file_number) f where x.filnum != 4294967295 and x.gnum=f.gnum and x.filnum=f.filnum ) where gname='DATA' group by dbname, gname order by 3 desc /Et donc ?
Database Size Database Name GNAME In GigaBytes ------------------------------ ---------- --------------- ... ... ... ****************************** --------------- sum 7,836.62 82 rows selected. Elapsed: 00:00:00.82ASMCMD … Oubliez ! Pour déterminer la taille des BDD dans ASM, C’est avec SQL !