Find out free space on tablespace

后端 未结 10 1649
北荒
北荒 2020-12-12 12:21

Our application has failed a few times because an \'ORA-01536: space quota exceeded for tablespace\', and we would like to be able to prevent this by checking regularly the

相关标签:
10条回答
  • 2020-12-12 12:32
    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
    /
    
    0 讨论(0)
  • 2020-12-12 12:32

    You can use a script called tablespaces.sh inside this helpful bundle: http://dba-tips.blogspot.com/2014/02/oracle-database-administration-scripts.html

    0 讨论(0)
  • 2020-12-12 12:34

    Unless I'm mistaken, the above code does not take unallocated space into account, so if you really want to know when you'll hit a hard limit, you should use maxbytes.

    I think the code below does that. It calculates free space as "freespace" + unallocated space.

    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 讨论(0)
  • 2020-12-12 12:35

    A much more accurate SQL STATEMENT

    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;
    
    0 讨论(0)
  • 2020-12-12 12:42

    You can also get a rough idea of table space usage by looking at the size of the files on your disk.

    My DB is created with max extents, and each dbf file can only grow to 32gigs - so when the last one reaches 32gigs, you know you're about to run out of room and need to add another.

    0 讨论(0)
  • 2020-12-12 12:42

    Here is a query used by Oracle SQL Developer in its Tablespaces view

    select a.tablespace_name as "Tablespace Name",
           round(a.bytes_alloc / 1024 / 1024) "Allocated (MB)",
           round(nvl(b.bytes_free, 0) / 1024 / 1024) "Free (MB)",
           round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024) "Used (MB)",
           round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) "% Free",
           100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) "% Used",
           round(maxbytes/1024 / 1024) "Max. Bytes (MB)"
    from  ( select  f.tablespace_name,
                   sum(f.bytes) bytes_alloc,
                   sum(decode(f.autoextensible, 'YES',f.maxbytes,'NO', f.bytes)) maxbytes
            from dba_data_files f
            group by tablespace_name) a,
          ( select  f.tablespace_name,
                   sum(f.bytes)  bytes_free
            from dba_free_space f
            group by tablespace_name) b
    where a.tablespace_name = b.tablespace_name (+)
    union all
    select 
           h.tablespace_name as tablespace_name,
           round(sum(h.bytes_free + h.bytes_used) / 1048576) megs_alloc,
           round(sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / 1048576) megs_free,
           round(sum(nvl(p.bytes_used, 0))/ 1048576) megs_used,
           round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) * 100) Pct_Free,
           100 - round((sum((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) * 100) pct_used,
           round(sum(f.maxbytes) / 1048576) max
    from   sys.v_$TEMP_SPACE_HEADER h, sys.v_$Temp_extent_pool p, dba_temp_files f
    where  p.file_id(+) = h.file_id
    and    p.tablespace_name(+) = h.tablespace_name
    and    f.file_id = h.file_id
    and    f.tablespace_name = h.tablespace_name
    group by h.tablespace_name
    ORDER BY 2;
    
    0 讨论(0)
提交回复
热议问题