Узнайте свободное место на табличном пространстве - PullRequest
38 голосов
/ 06 октября 2011

Наше приложение несколько раз выходило из строя из-за 'ORA-01536: квота пространства превышена для табличного пространства', и мы хотели бы предотвратить это, регулярно проверяя свободное пространство в табличном пространстве и вызывая предупреждение при его отбрасывании ниже определенного уровня.

Есть ли способ узнать, сколько свободного места осталось в табличном пространстве?

После некоторого исследования (я не администратор базы данных) я попробовал следующее:

select max_bytes-bytes from user_ts_quotas;

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

но эти запросы возвращают совершенно разные результаты.

Ответы [ 8 ]

85 голосов
/ 06 октября 2011

Я использую этот запрос

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;
29 голосов
/ 22 марта 2012

Намного более точное ЗАЯВЛЕНИЕ SQL

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;
11 голосов
/ 04 декабря 2014

Есть много способов проверить размер, но, как разработчик, у нас нет большого доступа к мета-таблицам запросов, я нахожу это решение очень простым (Примечание: если вы получаете сообщение об ошибке ORA-01653 'Ошибка 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);

Спасибо

10 голосов
/ 25 февраля 2013

Это один из самых простых запросов к тому же, с которым я сталкивался, и мы используем его также для мониторинга:

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

Полная статья об Oracle Tablespace: Tablespace

1 голос
/ 14 января 2017
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 голосов
/ 09 февраля 2019

Вы также можете получить приблизительное представление об использовании табличного пространства, посмотрев на размер файлов на вашем диске.

Моя БД создается с максимальными экстентами, и каждый файл dbf может увеличиваться только до 32 гигабайт -поэтому, когда последний достигнет 32 гигабайт, вы знаете, что вам не хватает места и вам нужно добавить еще один.

0 голосов
/ 25 апреля 2016

Если я не ошибаюсь, приведенный выше код не учитывает нераспределенное пространство, поэтому, если вы действительно хотите знать, когда вы достигнете жесткого предела, вы должны использовать maxbytes.

Я думаю, что код ниже делает это. Он вычисляет свободное пространство как «свободное пространство» + нераспределенное пространство.

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 голосов
/ 10 марта 2014

Вы можете использовать скрипт с именем tablespaces.sh внутри этого полезного комплекта: http://dba -tips.blogspot.com / 2014/02 / oracle-database-Administration-scripts.html

...