Oracle 表領域ビュー完全ガイド:DBA_*/V$*で使用率を正しく確認する

Oracle Master Silver

Oracle で表領域の「使用率」「サイズ」を正しく確認し、必要に応じて容量を拡張するためのディクショナリビュー(DBA_*)と動的ビュー(V$*)の使い分け・実用SQLをまとめます。はじめに「表領域 とは」何かを整理し、日常運用で迷わない最短手順を提示します(対象:Linux/19c 非CDB)。

表領域に関してはコチラ。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


結論・最短手順(スニペット用)

  1. 全体像を確認
    DBA_TABLESPACES(状態/種別/BIGFILE)で対象を把握。
  2. ファイル単位のサイズ確認
    常用:DBA_DATA_FILES、TEMP:DBA_TEMP_FILES
  3. 表領域の使用率を確認
    常用:DBA_TABLESPACE_USAGE_METRICS または DBA_FREE_SPACE 集計。
    TEMP:V$TEMP_SPACE_HEADER を集計。
  4. リアルタイムの状態確認
    V$TABLESPACEV$DATAFILE(ONLINE/OFFLINE、読取専用など)。
  5. 足りないときの拡張
    ALTER TABLESPACE ... ADD DATAFILEAUTOEXTEND ONRESIZE を選ぶ。
  6. 運用の基本
    変更前に参照系で確認 → 変更 → 結果確認/アラートログ確認

表領域とは?(背景と基礎)

  • 表領域とは:表や索引などのセグメントを格納する論理コンテナ。実体は 1 本以上のデータファイル(.dbf)です。
  • PERMANENT/TEMPORARY:通常データ用(PERMANENT)とソート・一時領域(TEMPORARY)。
  • BIGFILE/SMALLFILE:ファイル本数と上限の考え方が異なります(BIGFILE は 1 ファイル大容量)。
  • 使用率の基本
    • PERMANENT:データファイル合計サイズ − 空き(DBA_FREE_SPACE
    • TEMP:現在使用中の一時領域(V$TEMP_SPACE_HEADER

一口メモ:DBA_TABLESPACE_USAGE_METRICS は PERMANENT の概要を一度に把握でき、日次レポートに便利です。TEMP は別クエリで見ます。


前提・検証用の作成(再現性のための最小セット)

  • OS:Oracle Linux(例)
  • DB:Oracle Database 19c(非CDB)
  • 権限SYSDBA(DBA_* 参照のため)
  • パス:本記事は /u01/app/oracle/oradata/ORCL を使用

目的:以降のクエリで使用率サイズの変化を可視化できるよう、検証用の表領域とユーザー、テーブルを作成します。

-- 小さな検証用表領域(サイズ 50MB、必要に応じて自動拡張)
CREATE TABLESPACE TBS_APP
  DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf' SIZE 50M
  AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

解説CREATE TABLESPACE は新しい表領域作成します。SIZE は初期サイズAUTOEXTEND ON は満杯時に自動拡張する設定、MAXSIZE は自動拡張の上限です。

-- アプリ用ユーザー作成(デフォルト表領域を TBS_APP に)
CREATE USER APPUSER IDENTIFIED BY "Passw0rd1"
  DEFAULT TABLESPACE TBS_APP
  TEMPORARY TABLESPACE TEMP
  QUOTA UNLIMITED ON TBS_APP;

GRANT CREATE SESSION, CREATE TABLE TO APPUSER;

解説CREATE USER でアプリユーザーを作成し、デフォルト表領域TBS_APP に設定します。GRANT はログインと表作成に必要な最低限の権限を付与します。

-- 検証用テーブル作成+データ投入(使用率の変化を確認しやすく)
CONN APPUSER/"Passw0rd1"
CREATE TABLE T1 (id NUMBER, pad CHAR(1000));
INSERT INTO T1 SELECT LEVEL, RPAD('x',1000,'x') FROM dual CONNECT BY LEVEL <= 5000;
COMMIT;

解説CREATE TABLE で検証用表を作り、INSERT ... CONNECT BY で 5,000 行を一括投入して表領域の使用率を意図的に上げています。COMMIT で変更を確定します。


手順・実装

1) 俯瞰:どの表領域が対象か確認

-- 表領域の状態・種別・ブロックサイズ・BIGFILE かを一覧
SELECT tablespace_name, status, contents, bigfile, block_size
FROM   dba_tablespaces
ORDER  BY tablespace_name;

解説:全表領域の基本属性を一覧化します。status(ONLINE/OFFLINE)、contents(PERMANENT/TEMPORARY)、bigfile の有無、block_size を見て監視対象の性質を確認します。

コマンド実行例

SQL> SELECT tablespace_name, status, contents, bigfile, block_size
2 FROM dba_tablespaces
3 ORDER BY tablespace_name;

TABLESPACE_NAME STATUS CONTENTS BIG BLOCK_SIZE
------------------------------ --------- --------------------- --- ----------
SYSAUX ONLINE PERMANENT NO 8192
SYSTEM ONLINE PERMANENT NO 8192
TBS_APP ONLINE PERMANENT NO 8192
TEMP ONLINE TEMPORARY NO 8192
UNDOTBS1 ONLINE UNDO NO 8192
USERS ONLINE PERMANENT NO 8192

2) ファイル単位のサイズ/自動拡張設定を確認

-- PERMANENT のデータファイル(現在サイズ・自動拡張の有無・上限)
SELECT tablespace_name, file_name,
       bytes/1024/1024 AS size_mb,
       autoextensible,
       maxbytes/1024/1024 AS max_mb
FROM   dba_data_files
ORDER  BY tablespace_name, file_name;

解説:PERMANENT 用のデータファイルごとに現在サイズ(MB)、AUTOEXTENSIBLE、上限 MAXBYTES を把握し、拡張余地を見積もります。

コマンド実行例

SQL> col tablespace_name for a20
SQL> col file_name for a50
SQL> SELECT tablespace_name, file_name,
2 bytes/1024/1024 AS size_mb,
3 autoextensible,
4 maxbytes/1024/1024 AS max_mb
5 FROM dba_data_files
6 ORDER BY tablespace_name, file_name;

TABLESPACE_NAME FILE_NAME SIZE_MB AUT MAX_MB
-------------------- -------------------------------------------------- ---------- --- ----------
SYSAUX /u01/app/oracle/oradata/ORCL/sysaux01.dbf 510 YES 32767.9844
SYSTEM /u01/app/oracle/oradata/ORCL/system01.dbf 900 YES 32767.9844
TBS_APP /u01/app/oracle/oradata/ORCL/tbs_app01.dbf 50 YES 500
UNDOTBS1 /u01/app/oracle/oradata/ORCL/undotbs01.dbf 345 YES 32767.9844
USERS /u01/app/oracle/oradata/ORCL/users01.dbf 5 YES 32767.9844
-- TEMP のファイル(TEMPFILE)
SELECT tablespace_name, file_name,
       bytes/1024/1024 AS size_mb,
       autoextensible,
       maxbytes/1024/1024 AS max_mb
FROM   dba_temp_files
ORDER  BY tablespace_name, file_name;

解説:TEMPFILE の現在サイズと自動拡張設定を確認します。ソートやハッシュ結合が増えると TEMP の消費が増えるため、上限も併せて監視します。

補足:AUTOEXTENSIBLE=YES でも「今すぐ使える容量」は現在サイズまで。上限(MAXSIZE)も併記して判断します。

コマンド実行例

SQL> SELECT tablespace_name, file_name,
2 bytes/1024/1024 AS size_mb,
3 autoextensible,
4 maxbytes/1024/1024 AS max_mb
5 FROM dba_temp_files
6 ORDER BY tablespace_name, file_name;

TABLESPACE_NAME FILE_NAME SIZE_MB AUT MAX_MB
-------------------- -------------------------------------------------- ---------- --- ----------
TEMP /u01/app/oracle/oradata/ORCL/temp01.dbf 32 YES 32767.9844

3) PERMANENT の使用率を簡潔に確認(推奨)

-- 使用率を一括表示(PERMANENT)。block_size を考慮して MB に換算
SELECT m.tablespace_name,
       t.block_size,
       ROUND(m.tablespace_size * t.block_size / 1024/1024) AS size_mb,
       ROUND(m.used_space      * t.block_size / 1024/1024) AS used_mb,
       ROUND( (m.used_space/m.tablespace_size) * 100, 1 )  AS used_pct
FROM   dba_tablespace_usage_metrics m
JOIN   dba_tablespaces t
  ON   m.tablespace_name = t.tablespace_name
ORDER  BY used_pct DESC;

解説DBA_TABLESPACE_USAGE_METRICS のブロック数を DBA_TABLESPACES.BLOCK_SIZE で換算し、表領域別の総量・使用量・使用率(used_pct) を一括で確認します。

コマンド実行例

SQL> SELECT m.tablespace_name,
2 t.block_size,
3 ROUND(m.tablespace_size * t.block_size / 1024/1024) AS size_mb,
4 ROUND(m.used_space * t.block_size / 1024/1024) AS used_mb,
5 ROUND( (m.used_space/m.tablespace_size) * 100, 1 ) AS used_pct
6 FROM dba_tablespace_usage_metrics m
7 JOIN dba_tablespaces t
8 ON m.tablespace_name = t.tablespace_name
9 ORDER BY used_pct DESC;

TABLESPACE_NAME BLOCK_SIZE SIZE_MB USED_MB USED_PCT
-------------------- ---------- ---------- ---------- ----------
SYSTEM 8192 32768 892 2.7
SYSAUX 8192 32768 507 1.5
TBS_APP 8192 500 7 1.4
USERS 8192 32417 3 0
TEMP 8192 32461 0 0
-- 代替:FREE_SPACE 集計で使用率を算出(USING では修飾子を外す)
WITH df AS (
  SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
  FROM   dba_data_files GROUP BY tablespace_name
), fs AS (
  SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
  FROM   dba_free_space GROUP BY tablespace_name
)
SELECT tablespace_name,                     -- ★USING を使うため未修飾で出力
       df.total_mb,
       NVL(fs.free_mb,0) AS free_mb,
       (df.total_mb - NVL(fs.free_mb,0)) AS used_mb,
       ROUND( (df.total_mb - NVL(fs.free_mb,0)) / NULLIF(df.total_mb,0) * 100, 1 ) AS used_pct
FROM   df
LEFT   JOIN fs USING (tablespace_name)
ORDER  BY used_pct DESC;

解説DBA_DATA_FILES の総量から DBA_FREE_SPACE の空きを差し引いて使用率を算出する方法です。USING 句を使うため、SELECT では tablespace_name未修飾で参照します。

コマンド実行例

SQL> WITH df AS (
2 SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
3 FROM dba_data_files GROUP BY tablespace_name
4 ), fs AS (
5 SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
6 FROM dba_free_space GROUP BY tablespace_name
7 )
8 SELECT tablespace_name,
9 df.total_mb,
10 NVL(fs.free_mb,0) AS free_mb,
11 (df.total_mb - NVL(fs.free_mb,0)) AS used_mb,
12 ROUND( (df.total_mb - NVL(fs.free_mb,0)) / NULLIF(df.total_mb,0) * 100, 1 ) AS used_pct
13 FROM df
14 LEFT JOIN fs USING (tablespace_name)
15 ORDER BY used_pct DESC;

TABLESPACE_NAME TOTAL_MB FREE_MB USED_MB USED_PCT
-------------------- ---------- ---------- ---------- ----------
UNDOTBS1 345 2 343 99.4
SYSTEM 900 8.375 891.625 99.1
SYSAUX 540 29.5625 510.4375 94.5
USERS 5 2.3125 2.6875 53.8
TBS_APP 50 43 7 14

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

4) TEMP の使用率をリアルタイムに確認

SELECT tablespace_name,
       ROUND(SUM(bytes_used)/1024/1024) AS used_mb,
       ROUND(SUM(bytes_free)/1024/1024) AS free_mb,
       ROUND(SUM(bytes_used)/NULLIF(SUM(bytes_used)+SUM(bytes_free),0) * 100, 1) AS used_pct
FROM   v$temp_space_header
GROUP  BY tablespace_name
ORDER  BY used_pct DESC;

解説V$TEMP_SPACE_HEADER を集計して TEMP の現在使用率を即時に把握します。セッション単位の内訳を追う場合は V$TEMPSEG_USAGE を参照します。

コマンド実行例

SQL> SELECT tablespace_name,
2 ROUND(SUM(bytes_used)/1024/1024) AS used_mb,
3 ROUND(SUM(bytes_free)/1024/1024) AS free_mb,
4 ROUND(SUM(bytes_used)/NULLIF(SUM(bytes_used)+SUM(bytes_free),0) * 100, 1) AS used_pct
5 FROM v$temp_space_header
6 GROUP BY tablespace_name
7 ORDER BY used_pct DESC;

TABLESPACE_NAME USED_MB FREE_MB USED_PCT
-------------------- ---------- ---------- ----------
TEMP 32 0 100

5) リアルタイム状態(ONLINE/OFFLINE、読み取り専用)を確認

-- 表領域 ONLINE/OFFLINE など
SELECT tablespace_name, status, contents
FROM   dba_tablespaces
ORDER  BY tablespace_name;

解説:インスタンス視点での表領域状態(statuscontents)を即時に確認します。運用切替や障害時の一時確認に有効です。

コマンド実行例

SQL> SELECT tablespace_name, status, contents
2 FROM dba_tablespaces
3 ORDER BY tablespace_name;

TABLESPACE_NAME STATUS CONTENTS
-------------------- --------- ---------------------
SYSAUX ONLINE PERMANENT
SYSTEM ONLINE PERMANENT
TBS_APP ONLINE PERMANENT
TEMP ONLINE TEMPORARY
UNDOTBS1 ONLINE UNDO
USERS ONLINE PERMANENT

6 rows selected.
-- データファイルのオンライン状態(有効/無効など)を確認
SELECT file#, status, enabled
FROM   v$datafile
ORDER  BY file#;

解説V$DATAFILEstatusenabled を確認して、各データファイルが読み書き可能か/読み取り専用か/無効かを把握します。

コマンド実行例

SQL> SELECT file#, status, enabled
2 FROM v$datafile
3 ORDER BY file#;

FILE# STATUS ENABLED
---------- ------- ----------
1 SYSTEM READ WRITE
3 ONLINE READ WRITE
4 ONLINE READ WRITE
5 ONLINE READ WRITE
7 ONLINE READ WRITE

6) 容量が足りないときの拡張(安全手順)

変更系は必ず事前に確認→変更→結果確認。まずは「参照系クエリ」で根拠を押さえます。

-- 追加でファイルを作成して拡張(推奨。リスクが低い)
ALTER TABLESPACE TBS_APP ADD DATAFILE
  '/u01/app/oracle/oradata/ORCL/tbs_app02.dbf' SIZE 100M AUTOEXTEND ON NEXT 20M MAXSIZE 2G;

解説ADD DATAFILE は新規ファイルの追加で表領域を拡張します。既存ファイルを動かさず、断片化の影響も相対的に少ないため安全度が高い方法です。

-- 既存ファイルを RESIZE(OS 空きと連動。拡張できない場合あり)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf' RESIZE 100M;

解説:既存ファイルのサイズを直接変更します。OS 側の空きとセグメント配置の制約を受け、失敗(ORA-03206/03217)する可能性がある点に注意します。

-- 自動拡張を有効化/設定変更
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf'
  AUTOEXTEND ON NEXT 20M MAXSIZE 2G;

解説:データファイルに自動拡張を設定します。NEXT は拡張単位、MAXSIZE は上限で、無制限な増加を防ぎます。

戻し方:追加ファイルは 空であれば DROP DATAFILE 可能(制約あり)。安易に縮小しすぎると ORA-03206/03217(縮小不可)を招くため、縮小は慎重に。


テキスト図:運用フロー(alt: Oracle 表領域 使用率 確認→拡張 の流れ)

┌──────────────┐     ┌────────────────┐     ┌─────────────────────┐
│ 参照系で確認  │ →  │ 原因の特定     │ →  │ 拡張方式を選ぶ       │
│ ・使用率/サイズ│    │ ・TEMPか常用か │    │ ADD/RESIZE/AUTOEXTEND│
│ ・ONLINE状態   │    │ ・急増の要因   │    │ ロールバック方針     │
└─────┬────────┘     └───────┬─────────┘     └───────────┬─────────┘
      │(OK)                                   │(実施)
      ▼                                         ▼
  結果を再確認(クエリ/アラートログ/監視)

実行例(抜粋:PERMANENT 使用率の推移を目視)

-- 拡張前
SELECT tablespace_name, used_pct
FROM (
  SELECT m.tablespace_name,
         ROUND((m.used_space/m.tablespace_size)*100,1) AS used_pct
  FROM   dba_tablespace_usage_metrics m
) WHERE tablespace_name = 'TBS_APP';

解説:対象表領域TBS_APP)の使用率だけを抽出し、拡張前の状況をスナップショットとして記録します。

-- データ増加 → 再確認
INSERT INTO APPUSER.T1 SELECT LEVEL+5000, RPAD('y',1000,'y')
FROM dual CONNECT BY LEVEL <= 5000;
COMMIT;

解説:テーブルにさらに 5,000 行を投入して使用率を意図的に上げ、拡張前後の差分を観測できるようにします。COMMIT で確定します。

-- 拡張後に再確認
ALTER TABLESPACE TBS_APP ADD DATAFILE
  '/u01/app/oracle/oradata/ORCL/tbs_app03.dbf' SIZE 100M;

解説ADD DATAFILE拡張を行い、前段の確認クエリを再実行して使用率が低下した(余裕が増えた)ことを確認します。

意図:同じクエリで前後比較できる形にしておくと、影響範囲と効果が明確です。


トラブルシューティング(代表エラーの見方)

症状/エラー主な原因まずやる確認(参照系)対処の優先順(参照→変更)
ORA-01653(拡張不可)表領域の空き不足PERMANENT の使用率・最大サイズAUTOEXTENSIBLE1) 不要セグメント削除→2) ADD DATAFILE→3) AUTOEXTEND ON
ORA-01652(TEMP不足)TEMP の一時領域不足V$TEMP_SPACE_HEADER使用率1) SQL見直し/PGA_AGGREGATE_TARGET 検討→2) TEMPFILE 追加
ORA-01659(表作成失敗)作成先の空きが断片化DBA_FREE_SPACE の最大エクステント1) 断片化確認→2) ファイル追加 or RESIZE で連続領域確保
ORA-03206/03217(縮小不可)セグメント配置により縮小できずDBA_EXTENTS の末尾使用状況縮小は最後の手段。MOVE/SHRINK 等で再配置後に再試行

まずは参照系で確認→根拠を持って最小限の拡張から。


運用・監視・セキュリティの注意

  • 監視DBA_TABLESPACE_USAGE_METRICS(PERMANENT)と V$TEMP_SPACE_HEADER(TEMP)を定期確認。しきい値で通知。
  • 容量設計AUTOEXTEND は便利だが、上限(MAXSIZE)とファイルシステム空きに要注意。
  • 変更管理:拡張は低リスク(ADD DATAFILE が基本)。縮小は原則避け、実施時は十分な検証を。
  • 権限:参照系は最小権限で。変更系は運用手順と二重承認を。
  • ログ:アラートログで事後確認(拡張・障害の記録を追える体制に)。

FAQ

Q1. DBA_TABLESPACE_USAGE_METRICS の数値単位は?
A1. ブロック数です。表領域ごとに DBA_TABLESPACES.BLOCK_SIZE を参照して MB/GB に換算します。

Q2. TEMP の使用率はどこで見ますか?
A2. V$TEMP_SPACE_HEADER を合算します。セッション別は V$TEMPSEG_USAGE

Q3. まず何を確認すれば良いですか?
A3. 1) 表領域の種別/状態 2) ファイルの現在サイズ/上限 3) 使用率(PERMANENT/TEMP それぞれ)です。

Q4. どの拡張方法を選べば良い?
A4. 原則は ADD DATAFILE。やむを得ず RESIZEAUTOEXTEND を併用します。縮小は慎重に。

Q5. BIGFILE 表領域の注意点は?
A5. 1 ファイル大容量ゆえにバックアップ/復旧時の影響が大きくなりがち。ブロックサイズや上限設計を事前に詰めましょう。


まとめ(要点)

  • 表領域とは:セグメント格納の論理コンテナ。実体はデータファイル。
  • 使用率の確認:PERMANENT は DBA_TABLESPACE_USAGE_METRICS、TEMP は V$TEMP_SPACE_HEADER
  • サイズ設計AUTOEXTEND の上限とファイルシステム空きの二重管理。
  • 拡張の原則:低リスクな ADD DATAFILE を優先。縮小は最終手段。
  • 運用:参照系で根拠→変更→結果の確認をルーチン化。

本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。


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

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

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