表領域の情報を取得するディクショナリビューと動的パフォーマンスビューを解説

Oracle Master Silver

Oracleデータベースの管理において、表領域(Tablespace)の状態や使用状況を把握することは不可欠です。本記事では、表領域に関する情報を取得するためのディクショナリビューと動的パフォーマンスビューを網羅的に解説します。基本的な使用方法から、トラブルシューティングやパフォーマンス監視の実践的な応用まで幅広く取り上げます。


1. 表領域の基礎知識

表領域は、Oracleデータベース内でデータを格納するための論理的な単位です。データファイルと密接に関連し、データベースの容量管理における中心的な役割を果たします。

1.1 表領域の種類と用途

表領域タイプ用途
SYSTEMデータベースの基本メタデータを格納。必須表領域。
SYSAUXSYSTEM表領域を補完する役割を持つ。追加ツールや統計情報が格納される。
UNDOトランザクションのロールバックや整合性維持のために使用。
TEMP一時的な作業データ(ソートや集計操作)を格納。
ユーザー定義表領域アプリケーションデータやユーザー生成オブジェクトを格納。

2. ディクショナリビューによる表領域情報の取得

ディクショナリビューは、データベース構造やメタデータに関する詳細情報を提供します。

2.1 DBA_TABLESPACES

表領域全体の基本情報を取得します。以下のような質問に答えるのに役立ちます:

  • 表領域の状態は?(ONLINE/OFFLINE/READ ONLY
  • 表領域タイプは?(PERMANENT/TEMPORARY/UNDO

使用例:表領域の基本情報を確認

SELECT TABLESPACE_NAME, STATUS, CONTENTS, BIGFILE
FROM DBA_TABLESPACES;
SQL> SELECT TABLESPACE_NAME, STATUS, CONTENTS, BIGFILE
2 FROM DBA_TABLESPACES;

TABLESPACE_NAME STATUS CONTENTS BIGFILE
-------------------- -------------------- -------------------- ---------
SYSTEM ONLINE PERMANENT NO
SYSAUX ONLINE PERMANENT NO
UNDOTBS1 ONLINE UNDO NO
TEMP ONLINE TEMPORARY NO
USERS ONLINE PERMANENT NO
TABLESPACE_NAMESTATUSCONTENTSBIGFILE
SYSTEMONLINEPERMANENTNO
SYSAUXONLINEPERMANENTNO

2.2 DBA_DATA_FILES

各表領域に関連付けられたデータファイルの情報を取得します。

使用例:表領域に割り当てられたデータファイルの情報

SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB, STATUS
FROM DBA_DATA_FILES;
SQL> SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB, STATUS
2 FROM DBA_DATA_FILES;

FILE_NAME TABLESPACE_NAME SIZE_MB STATUS
-------------------------------------------------- -------------------- ---------- --------------------
/u01/app/oracle/oradata/V19/users01.dbf USERS 5 AVAILABLE
/u01/app/oracle/oradata/V19/undotbs01.dbf UNDOTBS1 725 AVAILABLE
/u01/app/oracle/oradata/V19/system01.dbf SYSTEM 1170 AVAILABLE
/u01/app/oracle/oradata/V19/sysaux01.dbf SYSAUX 730 AVAILABLE

2.3 DBA_TEMP_FILES

TEMP表領域に割り当てられた一時ファイルの情報を取得します。

使用例:一時表領域のファイル情報

SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB
FROM DBA_TEMP_FILES;
SQL> SELECT FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 AS SIZE_MB
2 FROM DBA_TEMP_FILES;

FILE_NAME TABLESPACE_NAME SIZE_MB
-------------------------------------------------- -------------------- ----------
/u01/app/oracle/oradata/V19/temp01.dbf TEMP 158

2.4 DBA_FREE_SPACE

表領域の空き領域を確認します。空き容量が少ない場合、拡張や不要データの削除が必要です。

使用例:空き容量の確認

SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_SPACE_MB
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME;
SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_SPACE_MB
2 FROM DBA_FREE_SPACE
3 GROUP BY TABLESPACE_NAME;

TABLESPACE_NAME FREE_SPACE_MB
-------------------- -------------
SYSTEM 7.1875
SYSAUX 37.625
USERS 2.3125

3. 動的パフォーマンスビューでのリアルタイム監視

動的パフォーマンスビューは、現在のインスタンスの状態をモニタリングするためのビューです。

3.1 V$TABLESPACE

現在のインスタンスで管理される表領域の情報を提供します。

使用例:表領域の状態を確認

SELECT TS#, NAME, BIGFILE, INCLUDED_IN_DATABASE_BACKUP
FROM V$TABLESPACE;
SQL> SELECT TS#, NAME, BIGFILE, INCLUDED_IN_DATABASE_BACKUP
2 FROM V$TABLESPACE;

TS# NAME BIGFILE INCLUDED_
---------- -------------------- --------- ---------
1 SYSAUX NO YES
0 SYSTEM NO YES
2 UNDOTBS1 NO YES
4 USERS NO YES
3 TEMP NO NO

3.2 V$DATAFILE

各データファイルの現在の状態やサイズを確認します。

使用例:データファイルの監視

SELECT FILE#, NAME, STATUS, BYTES/1024/1024 AS SIZE_MB
FROM V$DATAFILE;
SQL> SELECT FILE#, NAME, STATUS, BYTES/1024/1024 AS SIZE_MB
2 FROM V$DATAFILE;

FILE# NAME STATUS SIZE_MB
---------- -------------------------------------------------- ---------- ----------
1 /u01/app/oracle/oradata/V19/system01.dbf SYSTEM 1170
3 /u01/app/oracle/oradata/V19/sysaux01.dbf ONLINE 730
4 /u01/app/oracle/oradata/V19/undotbs01.dbf ONLINE 725
7 /u01/app/oracle/oradata/V19/users01.dbf ONLINE 5

3.3 V$TEMP_SPACE_HEADER

TEMP表領域の使用率を確認する動的ビューです。

使用例:一時表領域の使用状況を確認

SELECT TABLESPACE_NAME, SUM(BYTES_USED)/1024/1024 AS USED_MB, SUM(BYTES_FREE)/1024/1024 AS FREE_MB
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME;
SQL> SELECT TABLESPACE_NAME, SUM(BYTES_USED)/1024/1024 AS USED_MB, SUM(BYTES_FREE)/1024/1024 AS FREE_MB
2 FROM V$TEMP_SPACE_HEADER
3 GROUP BY TABLESPACE_NAME;

TABLESPACE_NAME USED_MB FREE_MB
-------------------- ---------- ----------
TEMP 158 0

4. 実践例:表領域の使用状況を分析する

以下のクエリでは、表領域ごとの総容量、使用容量、空き容量を計算します。

クエリ例:表領域の使用状況を可視化

SELECT 
t.TABLESPACE_NAME,
ROUND(t.TOTAL_SPACE_MB, 2) AS TOTAL_SPACE_MB,
ROUND(NVL(f.FREE_SPACE_MB, 0), 2) AS FREE_SPACE_MB,
ROUND((t.TOTAL_SPACE_MB - NVL(f.FREE_SPACE_MB, 0)), 2) AS USED_SPACE_MB
FROM
(SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_SPACE_MB
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) t
LEFT JOIN
(SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_SPACE_MB
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) f
ON t.TABLESPACE_NAME = f.TABLESPACE_NAME;
SQL> SELECT
2 t.TABLESPACE_NAME,
3 ROUND(t.TOTAL_SPACE_MB, 2) AS TOTAL_SPACE_MB,
4 ROUND(NVL(f.FREE_SPACE_MB, 0), 2) AS FREE_SPACE_MB,
5 ROUND((t.TOTAL_SPACE_MB - NVL(f.FREE_SPACE_MB, 0)), 2) AS USED_SPACE_MB
6 FROM
7 (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_SPACE_MB
8 FROM DBA_DATA_FILES
9 GROUP BY TABLESPACE_NAME) t
10 LEFT JOIN
11 (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_SPACE_MB
12 FROM DBA_FREE_SPACE
13 GROUP BY TABLESPACE_NAME) f
14 ON t.TABLESPACE_NAME = f.TABLESPACE_NAME;

TABLESPACE_NAME TOTAL_SPACE_MB FREE_SPACE_MB USED_SPACE_MB
-------------------- -------------- ------------- -------------
SYSTEM 1170 7.19 1162.81
SYSAUX 730 37.63 692.38
USERS 5 2.31 2.69
UNDOTBS1 725 0 725

5. トラブルシューティングとベストプラクティス

5.1 表領域が満杯になった場合の対処法

  1. データファイルの自動拡張を確認
    SELECT FILE_NAME, AUTOEXTENSIBLE, MAXBYTES/1024/1024 AS MAX_SIZE_MB FROM DBA_DATA_FILES;
  2. 空き容量が不足している場合、データファイルを追加
    ALTER DATABASE DATAFILE '/path/to/datafile.dbf' RESIZE 1G;

5.2 TEMP表領域の不足

一時領域が不足すると、複雑なソートや集計が失敗します。

ALTER DATABASE TEMPFILE '/path/to/tempfile.dbf' RESIZE 1G;

6. ディクショナリビューと動的ビューの違い

項目ディクショナリビュー動的パフォーマンスビュー
情報源永続的なデータ(メタデータ)メモリ上のリアルタイム情報
更新タイミングDDL操作後に反映即時反映
用途設定や構造の確認現在の状況のモニタリングや問題診断

7. まとめ

本記事では、Oracleデータベースの表領域に関する情報を取得するためのディクショナリビューと動的パフォーマンスビューを解説しました。これらのビューを活用することで、表領域の管理やトラブルシューティングが効率化します。定期的なモニタリングを実施し、安定したデータベース運用を目指しましょう!

[参考]
Oracle Databaseデータベース管理者ガイド 19c

コメント

タイトルとURLをコピーしました