Dimanche 2 novembre 2008 7 02 /11 /Nov /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.
 
Par LAO - Publié dans : Administration - Communauté : ORACLE
Ecrire un commentaire - Voir les 9 commentaires
Retour à l'accueil

Commentaires

T'es un génie !! :)
Commentaire n°1 posté par Franck le 03/11/2008 à 09h13
Faut pas trop le dire !!! Y en a qui risque de le croire !

LAO.
Réponse de LAO le 03/11/2008 à 09h15
Si, si, t'es un génie, tu sais optimiser aussi bien ton (et le notre) temps que les requêtes. Résultat : t'as gagné deux bonnes heures d'apéro là où les autres DBA en seraient toujours à gongler le nuage qui déboucle de leur usine à gaz...
Commentaire n°2 posté par Gigot le 03/11/2008 à 10h35

Moi des qu'il s'agit de manger (et / ou) boire, je suis toujours présent, j'en arrive à paralleliser la degustation de petit four et d'alcools divers.

LAO.

Réponse de LAO le 03/11/2008 à 10h41
Petits rectificatifs : "gongler" = "gonfler" "déboucle" = "débouche"
Commentaire n°3 posté par Gigot le 03/11/2008 à 10h37

Efftes secondaires de l'apéro ?

LAO.

Réponse de LAO le 03/11/2008 à 10h41
Grâce à toi, nous pouvons tous être (ou plutôt paraître) des génies !
Commentaire n°4 posté par Virginie le 03/11/2008 à 11h08
Je ne pensais qu'un simple mot (génie) pouvait engendrer autant de commentaires....
Je vais le mettre plus souvent.

@plus;

LAO.
Réponse de LAO le 03/11/2008 à 11h13
Et comme promise la requête d'ORACLE (via la console du client) pour afficher la liste des tablespaces et l'espace restant. SELECT A.tablespace_name, ((1 - B.freeb/A.abytes)*100) usage_pct, autoextensible FROM ( SELECT t.tablespace_name, SUM(bytes) AS abytes, autoextensible FROM dba_data_files f, dba_tablespaces t WHERE t.tablespace_name NOT IN ( SELECT DISTINCT tablespace_name FROM dba_undo_extents ) AND t.status 'READ ONLY' AND t.tablespace_name=f.tablespace_name GROUP BY t.tablespace_name, autoextensible ) A, ( SELECT tablespace_name, SUM(bytes) AS freeb FROM dba_free_space GROUP BY tablespace_name ) B WHERE A.tablespace_name = B.tablespace_name UNION SELECT A.tablespace_name, A.bytes/B.bytes*100 AS usage_pct, B.autoextensible FROM ( SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_undo_extents WHERE status = 'UNEXPIRED' GROUP BY tablespace_name ) A, ( SELECT tablespace_name, autoextensible, SUM(bytes) AS bytes FROM dba_data_files GROUP BY tablespace_name, autoextensible ) B WHERE A.tablespace_name = B.tablespace_name ORDER BY tablespace_name; C'est pas beau !
Commentaire n°5 posté par LAO le 03/11/2008 à 21h41
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. Merci de l'avoir ajouté car elle m'a été utile aujourd'hui.
Commentaire n°6 posté par jxemo le 10/12/2008 à 17h13
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.
Lao
Réponse de LAO le 10/12/2008 à 17h21
si je peux me permettre :

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
FROM DBA_TABLESPACE_USAGE_METRICS tus, dba_tablespaces tbs
where tus.TABLESPACE_NAME=tbs.TABLESPACE_NAME;
Commentaire n°7 posté par abdelaziz le 27/08/2009 à 12h52
Une chose,
cette vue ne répond pas toujours
actuellement je suis entrain d'effectuer un import (donc ecriture dans les tablespace), un select sur cette table me renvoit :
no rows selected

Cdt
Abdelaziz
Commentaire n°8 posté par abdelaziz le 10/09/2009 à 12h29

Je suis vraiement à genoux....tu es un grand chef  :-)

Commentaire n°9 posté par LBO72 le 24/06/2010 à 16h22

Rien que ca.... je vais rougir.

En tout cas merci pour le compliment.

Réponse de LAO le 24/06/2010 à 16h25

Catégories

Recherche

Calendrier

Février 2012
L M M J V S D
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        
<< < > >>

Profil

  • LAO
  • My Oracle blog
  • Homme
  • 06/05/1972
  • IDF
  • DBA
Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés