2011-10-06 31 views
33

Bir 'ORA-01536: alan kotası, tablo alanı için aşıldı' olduğundan, uygulamanız birkaç kez başarısız oldu ve bu nedenle, masaüstündeki boş alanı düzenli olarak denetleyerek bunu önleyebilmekteyiz. belirli seviyenin altına düştüğünde bir uyarıyı yükseltmek.Masaüstündeki boş alan hakkında bilgi edinin

Bir tablo alanında ne kadar boş alan kaldığını bulmak için herhangi bir yolu var mı?

select max_bytes-bytes from user_ts_quotas; 

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

ancak bu sorgular tamamen farklı sonuçlar döndürebilir:

bazı araştırma (Ben DBA değilim) sonra aşağıdaki çalıştı.

cevap

68

ben çok daha doğru bu sorgu

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; 
+1

Güzel - Bu Kuruluş yöneticisi olarak aynı sayıda verir; müthiş! Buna şimdi güveniyorum =) –

+0

Denedim ve liste tamamen dolduruyor çünkü dba_free_space'da bunun için bir giriş yok. (10g üzerindeyim) – xtsoler

23

bir SQL TABLOSU kullanmak

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

bu sorunun cevabı – Dennis

+0

'dan kullanıldığında görüntülenmeyen bir TEMP tablo alanına sahip. Ben şahsen bunun oldukça hızlı olduğunu kontrol ediyorum. Bir Oracle 12 veritabanında, bir süre önce kullanmış olduğumuz benzer bir sorguya sahip olan 18 saniye vs 6 saniye. – Zardoz89

+0

Üzgünüm, Ama burada konuştuğumuz ölçü birimi nedir? –

9

Bu karşısına çıkan aynı için en basit sorgunun biridir ve biz de izlenmesi için kullanabilirsiniz : Oracle Tablespace hakkında

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

tam bir madde: Tablespace

8

Orada boyutunu kontrol etmenin birçok yolu vardır, ancak bir geliştirici olarak biz bulmak meta tablolar sorgulamak için çok erişiminiz yok bu çözüm çok kolay (Not: 'Eğer bir tablo alanına boşluk eklemek gerekir, çünkü ORA-01653 hatası neden olur' hata mesajını ORA-01653 alıyorsanız eğer)

--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); 

Teşekkür

0

Hatalı olmadıkça, yukarıdaki kod ayrılmamış alanı dikkate almaz. Bu nedenle, bir sınırı ne zaman zorlayacağınızı bilmek istiyorsanız, maxbytes kullanmalısınız.

Aşağıdaki kodun bunu yaptığını düşünüyorum. Boş alanı "boş alan" + ayrılmamış alan olarak hesaplar.

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; 
1
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

Neden bu sql deyimi diğerleri daha iyi? – rene

+2

Yığın Taşmasına Hoş Geldiniz! Kod sadece cevaplar çok yardımcı olmuyor. Lütfen kodunuzun orijinal sorunu neden çözdüğünü açıklamak için cevabınızı düzenleyin. –

İlgili konular