48

「ORA-01536:表領域の領域クォータを超えました」が原因でアプリケーションが数回失敗しました。表領域の空き領域を定期的にチェックし、特定のレベルを下回ったときにアラートを発行することで、これを防止できるようにしたいと考えています。 。

表領域に残っている空き領域を確認する方法はありますか?

いくつかの調査(私はDBAではありません)の後、私は次のことを試みました:

select max_bytes-bytes from user_ts_quotas;

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

しかし、これらのクエリは完全に異なる結果を返します。

4

12 に答える 12

103

このクエリを使用します

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;
于 2011-10-06T09:00:42.780 に答える
33

より正確な 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;
于 2012-03-22T05:04:30.870 に答える
15

サイズを確認する方法はたくさんありますが、開発者としてクエリ メタ テーブルにあまりアクセスできないため、この解決策は非常に簡単だと思います (注: エラー メッセージ 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);

ありがとう

于 2014-12-04T06:32:21.410 に答える
12

これは、私が遭遇した最も単純なクエリの 1 つであり、監視にも使用します。

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

Oracle 表領域に関する完全な記事: 表領域

于 2013-02-25T12:09:08.437 に答える
2

次のクエリは、表領域の空き領域を MB 単位で調べるのに役立ちます。

select tablespace_name , sum(bytes)/1024/1024 from dba_free_space group by tablespacE_name order by 1;
于 2020-08-19T17:53:22.530 に答える
1

私が間違っていない限り、上記のコードは未割り当て領域を考慮していません。そのため、いつハード リミットに達するかを本当に知りたい場合は、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;
于 2016-04-25T07:42:35.303 に答える
0

ディスク上のファイルのサイズを調べることで、テーブル スペースの使用量を大まかに把握することもできます。

私の DB は最大エクステントで作成されており、各 dbf ファイルは 32 ギガまでしか拡大できません。そのため、最後のファイルが 32 ギガに達すると、容量が足りなくなり、別の容量を追加する必要があることがわかります。

于 2019-02-09T07:54:16.943 に答える
-2

次の便利なバンドル内で tablespaces.sh というスクリプトを使用できます: http://dba-tips.blogspot.com/2014/02/oracle-database-administration-scripts.html

于 2014-03-10T10:44:25.733 に答える