liguofeng29’s blog

個人勉強用ブログだっす。

Oracle - undo表領域サイズ取得

UNDO 表領域の使用率は、以下の通り計算します。

UNDO 表領域の使用率 =

([A] ACTIVE + UNEXPIRED のエクステントの合計サイズ)

/ *1

[A] ACTIVE + UNEXPIRED のエクステントの合計サイズ

ステータスが ACTVIE のエクステントは、何らかのトランザクションで使用中

の領域です。また、ステータスが UNEXPIRED のエクステントは、使用中の領

域ではありませんが、トランザクションの COMMIT 後に、UNDO_RETENTION や

TUNED_UNDORETENTION の時間が経過しておらず、リテンションが失効していな

い領域です。そのため、ORA-1555のエラーの発生を防止する観点から使用中の

領域であると考える必要があります。

このサイズは、以下の SQL 文で取得することができます。

SQL> select status, sum(bytes) from dba_undo_extents

where tablespace_name = ''

and (status = 'ACTIVE' or status = 'UNEXPIRED') group by status;

(実行例)

----------------------------------------------------------------------

SQL> select status, sum(bytes) from dba_undo_extents

2 where tablespace_name = 'UNDOTBS1'

3 and (status = 'ACTIVE' or status = 'UNEXPIRED') group by status;

STATUS SUM(BYTES)

--------- ----------

UNEXPIRED 2097152

ACTIVE 261160960

----------------------------------------------------------------------

[B] EXPIRED のエクステントの合計サイズ

ステータスが EXPIRED のエクステントは、その領域を使用したトランザクショ

ンの COMMIT 後、UNDO_RETENTION や TUNED_UNDORETENTION の時間が経過し、

リテンションが失効している領域です。再利用可能な領域であるため、空き領

域と考えることが可能です。

このサイズは、以下の SQL 文で取得することができます。

SQL> select status, sum(bytes) from dba_undo_extents

where tablespace_name = '' and status = 'EXPIRED'

group by status;

(実行例)

----------------------------------------------------------------------

SQL> select status, sum(bytes) from dba_undo_extents

2 where tablespace_name = 'UNDOTBS1' and status = 'EXPIRED'

3 group by status;

STATUS SUM(BYTES)

--------- ----------

EXPIRED 1519714304

----------------------------------------------------------------------

[C] 未割り当ての領域の合計サイズ

UNDO 表領域の空きエクステントです。UNDO 表領域としてはすでに確保されて

いる領域ですが、一度も領域が使用されていない、または、KROWN:64291 に記

載のある DROP や SHRINK の処理により開放されたことにより、エクステント

が未割り当てとなっている領域です。

このサイズは、以下の SQL 文で取得することができます。

SQL> select sum(BYTES) from dba_free_space

where tablespace_name = '';

(実行例)

----------------------------------------------------------------------

SQL> select sum(BYTES) from dba_free_space

2 where tablespace_name = 'UNDOTBS1';

SUM(BYTES)

----------

5767168

----------------------------------------------------------------------

[D] データファイルとして拡張可能なサイズ

データファイルの自動拡張が有効(autoextend on)な場合に、データファイル

として拡張する余地がある領域です。ただし、データファイルの設定として自

動拡張が可能であっても、ディスクスペースに空きがない場合は、データファ

イルの拡張を行うことができないため、ディスクスペースに空き領域が存在し

ているか合わせて確認してください。

このサイズは、以下の SQL 文で取得することができます。

SQL> col BYTES for 999999999999

SQL> select maxbytes - bytes as bytes from dba_data_files

where tablespace_name = '';

(実行例)

----------------------------------------------------------------------

SQL> col BYTES for 999999999999

SQL> select maxbytes - bytes as bytes from dba_data_files

2 where tablespace_name = 'UNDOTBS';

BYTES

-------------

32576094208

----------------------------------------------------------------------

*1:[A] ACTIVE + UNEXPIRED のエクステントの合計サイズ)

+ ([B] EXPIRED のエクステントの合計サイズ)

+ ([C] 未割り当ての領域の合計サイズ)

+ ([D] データファイルとして拡張可能なサイズ