Découvrez l'espace libre sur tablespace

notre application a échoué à plusieurs reprises à cause d'un "ORA-01536: quota d'espace dépassé pour tablespace", et nous aimerions pouvoir empêcher cela en vérifiant régulièrement l'espace libre sur la tablespace et en élevant une alerte quand il descend en dessous d'un certain niveau.

Est-il un moyen de savoir combien d'espace libre est laissé dans un tablespace?

après quelques recherches (Je ne suis pas un DBA), j'ai essayé ce qui suit:

select max_bytes-bytes from user_ts_quotas;

select sum(nvl(bytes,0)) from user_free_space;

mais ces requêtes renvoient des résultats complètement différents.

35
demandé sur Avs 2011-10-06 12:56:49

7 réponses

j'utilise cette requête

column "Tablespace" format a13
column "Used MB"    format 99,999,999
column "Free MB"    format 99,999,999
column "Total MB"   format 99,999,999
select
   fs.tablespace_name                          "Tablespace",
   (df.totalspace - fs.freespace)              "Used MB",
   fs.freespace                                "Free MB",
   df.totalspace                               "Total MB",
   round(100 * (fs.freespace / df.totalspace)) "Pct. Free"
from
   (select
      tablespace_name,
      round(sum(bytes) / 1048576) TotalSpace
   from
      dba_data_files
   group by
      tablespace_name
   ) df,
   (select
      tablespace_name,
      round(sum(bytes) / 1048576) FreeSpace
   from
      dba_free_space
   group by
      tablespace_name
   ) fs
where
   df.tablespace_name = fs.tablespace_name;
77
répondu yanjost 2011-10-06 09:00:42

une déclaration SQL beaucoup plus précise

SELECT  a.tablespace_name,
    ROUND (((c.BYTES - NVL (b.BYTES, 0)) / c.BYTES) * 100,2) percentage_used,
    c.BYTES / 1024 / 1024 space_allocated,
    ROUND (c.BYTES / 1024 / 1024 - NVL (b.BYTES, 0) / 1024 / 1024,2) space_used,
    ROUND (NVL (b.BYTES, 0) / 1024 / 1024, 2) space_free, 
    c.DATAFILES
  FROM dba_tablespaces a,
       (    SELECT   tablespace_name, 
                  SUM (BYTES) BYTES
           FROM   dba_free_space
       GROUP BY   tablespace_name
       ) b,
      (    SELECT   COUNT (1) DATAFILES, 
                  SUM (BYTES) BYTES, 
                  tablespace_name
           FROM   dba_data_files
       GROUP BY   tablespace_name
    ) c
  WHERE b.tablespace_name(+) = a.tablespace_name 
    AND c.tablespace_name(+) = a.tablespace_name
ORDER BY NVL (((c.BYTES - NVL (b.BYTES, 0)) / c.BYTES), 0) DESC;
25
répondu better sql statement 2012-03-22 05:04:30

C'est l'un des plus simple requête de la même que j'ai rencontré, et nous l'utilisons pour la surveillance ainsi:

SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024/1024 "FREE SPACE(GB)"
FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;

un article complet sur Oracle Tablespace: Tablespace

10
répondu Ankit Agrawal 2013-02-25 12:27:53

il y a plusieurs façons de vérifier la taille, mais en tant que développeur nous n'avons pas beaucoup d'accès aux méta-tables d'interrogation, je trouve cette solution très facile (Note: si vous recevez le message D'erreur ORA-01653 ‘L'erreur ORA-01653 est causée par le fait que vous devez ajouter de l'espace dans une tablespace.’ )

--Size of All Table Space

--1. Used Space
SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS "USED SPACE(IN GB)" FROM USER_SEGMENTS GROUP BY TABLESPACE_NAME
--2. Free Space
SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS "FREE SPACE(IN GB)" FROM   USER_FREE_SPACE GROUP BY TABLESPACE_NAME

--3. Both Free & Used
SELECT USED.TABLESPACE_NAME, USED.USED_BYTES AS "USED SPACE(IN GB)",  FREE.FREE_BYTES AS "FREE SPACE(IN GB)"
FROM
(SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS USED_BYTES FROM USER_SEGMENTS GROUP BY TABLESPACE_NAME) USED
INNER JOIN
(SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS FREE_BYTES FROM  USER_FREE_SPACE GROUP BY TABLESPACE_NAME) FREE
ON (USED.TABLESPACE_NAME = FREE.TABLESPACE_NAME);

Merci

9
répondu Gurupreet Singh Bhatia 2014-12-31 07:42:45
column pct_free format 999.99
select
     used.tablespace_name,
     (reserv.maxbytes - used.bytes)*100/reserv.maxbytes pct_free,
     used.bytes/1024/1024/1024 used_gb,
     reserv.maxbytes/1024/1024/1024 maxgb,
     reserv.bytes/1024/1024/1024 gb,
     (reserv.maxbytes - used.bytes)/1024/1024/1024 "max free bytes",
     reserv.datafiles
from
    (select tablespace_name, count(1) datafiles, sum(greatest(maxbytes,bytes)) maxbytes, sum(bytes) bytes from dba_data_files group by tablespace_name) reserv,
    (select tablespace_name, sum(bytes) bytes from dba_segments group by tablespace_name) used
where used.tablespace_name = reserv.tablespace_name
order by 2
/
1
répondu Joseph Amalraj 2017-01-13 21:19:05

sauf erreur de ma part, le code ci-dessus ne tient pas compte de l'espace non alloué, donc si vous voulez vraiment savoir quand vous atteindrez une limite dure, vous devriez utiliser maxbytes.

je pense que le code ci-dessous le fait. Il calcule l'espace libre comme "espace libre" + espace non alloué.

select 
     free.tablespace_name,
     free.bytes,
     reserv.maxbytes,
     reserv.bytes,
     reserv.maxbytes - reserv.bytes + free.bytes "max free bytes",
     reserv.datafiles
from
    (select tablespace_name, count(1) datafiles, sum(maxbytes) maxbytes, sum(bytes) bytes from dba_data_files group by tablespace_name) reserv,
    (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) free
where free.tablespace_name = reserv.tablespace_name;
0
répondu FORTRAN 2016-08-04 04:49:57

vous pouvez utiliser un script appelé tablespaces.sh à l'intérieur de ce faisceau utile: http://dba-tips.blogspot.com/2014/02/oracle-database-administration-scripts.html

-2
répondu user3401360 2014-03-10 10:44:25