web-dev-qa-db-ja.com

そのテーブルスペース上のセグメントによって使用されるバイトと比較したテーブルスペースmax_sizeの大幅な偏差

テーブルスペースのサイズを確認したところ、昨日テーブルスペースがいっぱいになった後、管理者がテーブルスペースを大きくしたと言っていたので、本当に奇妙なことがわかりました。

誰かがこの状況に光を当てることができることを願っています。これが私がしたことです:

1)特定のテーブルスペースのサイズを照会しました。この目的のために、それを「XYZ」と呼びましょう。 XYZは、昨日いっぱいになり、サイズがアップグレードされたテーブルスペースです。

select (max_size / 1024 / 1024) as size_megabyte from user_tablespaces where tablespace_name = 'XYZ'

結果は2048MBです。

2)テーブルスペース「XYZ」を使用してセグメントを照会し、使用されたバイトを合計しました

select sum(bytes)/1024/1024 as size_megabyte from user_segments where tablespace_name = 'XYZ'

結果は36000MBです。

3)表領域「XYZ」に残っている空き領域を照会しました

select sum(bytes)/1024/1024 as size_megabyte from user_free_space where tablespace_name = 'XYZ'

結果は4000MBです

この時点で私の顎が落ち、ここで何が起こっているのか理解できません。誰か手がかりがありますか?クエリに問題がありますか?

2)と3)の結果から判断すると、クエリ1)は2048MBではなく40000MBを返すと思います。

1
daZza

表領域のサイズを取得する方法が正しくありません。

MAX_SIZE(NUMBER)は、セグメントのデフォルトの最大サイズ(Oracleブロック単位)を返します。

dba_data_filesおよびdba_free_spaceにクエリを実行して、結果を取得できます

以下は、私たちが使用している監視スクリプトの抜粋です。

SELECT * FROM (SELECT a.tablespace_name, SUM(a.tots)/1024/1024-SUM(a.sumb)/1024/1024 Tot_Used_MB, SUM(a.tots)/1024/1024 Tot_Size_MB,   
SUM(a.sumb)/1024/1024 Tot_Free_MB 
FROM (SELECT tablespace_name,0 tots,SUM(bytes) sumb
FROM dba_free_space a  GROUP BY tablespace_name
UNION  SELECT tablespace_name,SUM(bytes) tots,0 FROM  
dba_data_files GROUP BY tablespace_name) a GROUP BY a.tablespace_name);
2
JSapkota

まず、すでに述べたように、MAX_SIZEはブロック単位の最大セグメントサイズを意味します。

次に、*_FREE_SPACEビューは自動拡張可能なデータファイルの最大サイズを考慮していないため、通常、ビューを使用するユーザーは、誤った結果を返した理由や誤ったアラームを返す理由を尋ねることになります。

組み込みのビューDBA_TABLESPACE_USAGE_METRICSを使用できます。 MB単位のサイズが必要な場合は、テーブルスペースのブロックサイズにDBA_TABLESPACESを結合する必要があります。

select
  m.tablespace_name,
  m.used_space * t.block_size / 1024/ 1024 as used_mb,
  m.tablespace_size * t.block_size / 1024 /1024 as max_mb,
  m.used_percent
from
  dba_tablespace_usage_metrics m
  join dba_tablespaces t on m.tablespace_name = t.tablespace_name
;
1
Balazs Papp