テーブルスペースのサイズを確認したところ、昨日テーブルスペースがいっぱいになった後、管理者がテーブルスペースを大きくしたと言っていたので、本当に奇妙なことがわかりました。
誰かがこの状況に光を当てることができることを願っています。これが私がしたことです:
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を返すと思います。
表領域のサイズを取得する方法が正しくありません。
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);
まず、すでに述べたように、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
;