Taille des BDD dans ASM, asmcmd ou SQL ?

choose

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.82

ASMCMD … Oubliez ! Pour déterminer la taille des BDD dans ASM, C’est avec SQL !