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.