2011-10-06 6 views
33

Ứng dụng của chúng tôi đã thất bại một vài lần vì hạn ngạch dung lượng 'ORA-01536: vượt quá không gian bảng' và chúng tôi muốn có thể ngăn chặn điều này bằng cách kiểm tra thường xuyên dung lượng trống trên vùng bảng và nâng cao cảnh báo khi nó giảm xuống dưới mức nhất định.Tìm ra không gian trống trên không gian bảng

Có cách nào để tìm hiểu còn bao nhiêu dung lượng trống trong không gian bảng?

Sau khi một số nghiên cứu (Tôi không phải là một DBA), tôi thử như sau:

select max_bytes-bytes from user_ts_quotas; 

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

nhưng những truy vấn trả về kết quả hoàn toàn khác nhau.

Trả lời

68

tôi sử dụng truy vấn này

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

Nice - điều này mang lại cùng một số là người quản lý doanh nghiệp; tuyệt vời! Tôi tin tưởng điều này ngay bây giờ =) –

+0

Tôi đã thử nó và có vẻ như danh sách sẽ không bao gồm một vùng bảng đầy đủ vì không có mục nhập cho nó trong dba_free_space. (Tôi đang ở trên 10g) – xtsoler

23

Một chính xác hơn nhiều SQL BÁO CÁO

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

cái này có vùng bảng TEMP, không được hiển thị khi sử dụng truy vấn từ câu trả lời – Dennis

+0

Cá nhân tôi kiểm tra xem điều này có khá nhanh không. 6 giây và 188 giây có truy vấn tương tự mà chúng tôi đã sử dụng từ một thời gian trước đây, trên cơ sở dữ liệu Oracle 12. – Zardoz89

+0

Tôi xin lỗi, Nhưng đơn vị kích thước chúng ta đang nói ở đây là gì? –

9

Đây là một trong những câu hỏi đơn giản nhất cho cùng mà tôi đi qua và chúng tôi sử dụng nó để theo dõi cũng :

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

Bài viết đầy đủ về Oracle Tablespace: Tablespace

8

Có rất nhiều cách để kiểm tra kích thước, nhưng như một nhà phát triển, chúng tôi không có nhiều truy cập để truy vấn bảng meta, tôi thấy giải pháp này rất dễ dàng (Lưu ý: 'Các lỗi ORA-01.653 được gây ra bởi vì bạn cần phải thêm không gian để một tablespace' nếu bạn đang nhận được thông báo lỗi ORA-01653 )

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

Cảm ơn

0

Trừ khi tôi bị nhầm lẫn, mã trên không chiếm không gian chưa được phân bổ, vì vậy nếu bạn thực sự muốn biết khi nào bạn sẽ đạt đến giới hạn cứng, bạn nên sử dụng maxbyte.

Tôi nghĩ rằng mã bên dưới thực hiện điều đó. Nó tính toán không gian trống là "không gian tự do" + không gian chưa phân bổ.

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

Tại sao câu lệnh sql này tốt hơn các câu hỏi khác? – rene

+2

Chào mừng bạn đến với Stack Overflow! Câu trả lời chỉ có mã không phải là rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn để giải thích lý do mã của bạn giải quyết được vấn đề ban đầu. –