Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
2 novembre 2008 7 02 /11 /novembre /2008 20:54
Bonsoir,

Nous voici donc au mois de novembre ! Et pour commencer (la faute à un apéro très sympa mais imprévu),il s'agira d'un petit article. Ce qui ne signifie pas qu'il n'est pas intéressant.
Il arrive souvent qu'un DBA soit amené à surveiller l'espace libre afin d'anticiper l'ajout de fichiers pour un tablespace (et au passage éviter une interruption de service)
Et la en général on trouve des scripts (bouquin, web, voir par soi même) qui donnent le tourni.
Si cela interesse quelqu'un je posterai celui exécuté par ORACLE lors de l'affichage de la vue des tablesapces dans le console Enterprise Manager.

Et pourtant depuis ORACLE 10 (release 2), il existe une vue qui donne le résultat voulu.
Pas très connu, mais grandement efficace. J'ai nommé DBA_TABLESPACE_USAGE_METRICS.

Connectons nous en system et interrogeons cette vue.


SQL> connect system/xxxxxx
SQL> SELECT * FROM DBA_TABLESPACE_USAGE_METRICS;


Quelles informations obtient-on ?
  • Le nom du tablespace
  • Espace utilisé (en nombre de blocs)
  • Taille du tablespace (toujours en nombre de blocs
  • Et enfin la colonne qui interesse le plus, le pourcentage de l'espace utilisé


 Pour information, cette liste exclue les tablespaces qui sont en lecture seule. Ce qui en soit parait logique puisqu'un tablespace en lecture seule a tout sauf vocation à s'aggrandir !

La petite morale de l'histoire est simple: Pourquoi faire compliqué, lorsqu'on peut faire simple.
Dans l'esprit de beaucoup le DBA est une bête étrange qui utilise des formules magiques.
Sans remettre en cause la complexité de certaines architectures ou problématiques, il existe bon nombres de cas, ou le bon sens et un minimum de connaissances suffisent.
C'est sur qu'un simple SELECT * FROM DBA_TABLESPACE_USAGE_METRICS, fait moins sexy qy'une requête de 60 lignes avec une demi douzaine d'UNION et de requêtes imbriquées. Mais au final le résultat sera le même.


Pour info, ci-dessous la requête fournie par TOAD pour avoir des infos sur les tablespaces.
Je vous accorde qu'elle nous donne un peu plus d'information... (datafile,infos sur le tablespace,...) mais avouez quand même que lorsque vous jetez ca à un novice, il vous prends pour un génie, alors qu'avec ma requete d'une ligne....


SELECT   t.tablespace_name "Tablespace", 'Datafile' "File Type",

         t.status "Tablespace Status", d.status "File Status",
         ROUND ((d.max_bytes - NVL (f.sum_bytes, 0)) / 1024 / 1024,
                2               ) "Used MB",
         ROUND (NVL (f.sum_bytes, 0) / 1024 / 1024, 2) "Free MB",
         t.initial_extent "Initial Extent", t.next_extent "Next Extent",
         t.min_extents "Min Extents", t.max_extents "Max Extents",
         t.pct_increase "Pct Increase",
         SUBSTR (d.file_name, 1, 80) "Datafile name"
    FROM (SELECT   tablespace_name, file_id, SUM (BYTES) sum_bytes
              FROM dba_free_space
          GROUP BY tablespace_name, file_id) f,
         (SELECT   tablespace_name, file_name, file_id, MAX (BYTES) max_bytes,
                   status
              FROM dba_data_files
          GROUP BY tablespace_name, file_name, file_id, status) d,
         dba_tablespaces t
   WHERE t.tablespace_name = d.tablespace_name
     AND f.tablespace_name(+) = d.tablespace_name  
  AND f.file_id(+) = d.file_id
GROUP BY t.tablespace_name,
         d.file_name,
         t.initial_extent,
         t.next_extent,
         t.min_extents,
         t.max_extents,
         t.pct_increase,
         t.status,
         d.max_bytes,
         f.sum_bytes,
         d.status
UNION ALL
SELECT   h.tablespace_name, 'Tempfile', ts.status, t.status,
         ROUND (SUM (NVL (p.bytes_used, 0)) / 1048576, 2),
         ROUND (  SUM ((h.bytes_free + h.bytes_used) - NVL (p.bytes_used, 0))
                / 1048576,
                2 ),
         -1,                                                 -- initial extent
            -1,                                              -- initial extent
               -1,                                              -- min extents
                  -1,                                           -- max extents
                     -1,                                       -- pct increase
                        t.file_name
    FROM SYS.v_$temp_space_header h,
         SYS.v_$temp_extent_pool p,
         SYS.dba_temp_files t,
         SYS.dba_tablespaces ts
   WHERE p.file_id(+) = h.file_id
     AND p.tablespace_name(+) = h.tablespace_name
     AND h.file_id = t.file_id
     AND h.tablespace_name = t.tablespace_name
     AND ts.tablespace_name = h.tablespace_name
GROUP BY h.tablespace_name, t.status, t.file_name, ts.status
ORDER BY 1, 5 DESC;


 LAO.
 
Partager cet article
Repost0

commentaires

J
<br /> Je ne suis pas tout à fait d'accord avec ça.<br /> <br /> <br /> Ta requête est valable uniquement si la taille des blocs est identique !!!!<br /> <br /> <br /> Si ce n'est pas le cas le résultat est complétement faux, tu compare des choux et des carottes.<br />
Répondre
L
<br /> <br /> Ca aurait été sympa de nous mettre la bonne requete , histoire de partage.<br /> <br /> <br /> Laurent.<br /> <br /> <br /> <br />
L
<br /> <br /> Je suis vraiement à genoux....tu es un grand chef  :-)<br /> <br /> <br /> <br />
Répondre
L
<br /> <br /> Rien que ca.... je vais rougir.<br /> <br /> <br /> En tout cas merci pour le compliment.<br /> <br /> <br /> <br />
A
Une chose,<br /> cette vue ne répond pas toujours<br /> actuellement je suis entrain d'effectuer un import (donc ecriture dans les tablespace), un select sur cette table me renvoit :<br /> no rows selected<br /> <br /> Cdt<br /> Abdelaziz
Répondre
A
si je peux me permettre :<br /> <br /> SELECT tus.TABLESPACE_NAME, (USED_SPACE*tbs.block_size)/1024/1024 as "volume utilise" , (TABLESPACE_SIZE*tbs.block_size)/1024/1024 as "volume alloue", USED_PERCENT<br /> FROM DBA_TABLESPACE_USAGE_METRICS tus, dba_tablespaces tbs<br /> where tus.TABLESPACE_NAME=tbs.TABLESPACE_NAME;
Répondre
J
Sauf que DBA_TABLESPACE_USAGE_METRICS n'existe qu'à partir de la version 10 alors que le requête de TOAD fonctionne avec les versions précédentes.<br /> <br /> Merci de l'avoir ajouté car elle m'a été utile aujourd'hui.
Répondre
L
<br /> On est d'accord ! Ca n'existe qu'a partir de la 10 (et même à partir de la release 2), et je l'avais d'ailleurs précisé. Et puis content d'avoir pu être utile ! C'est l'objet même de ce blog.<br /> Lao<br /> <br /> <br />