Oracle データベースの運用で表領域の容量不足は最も多い障害原因の 1 つです。容量が枯渇すると ORA-01653(表を拡張できません)やORA-01654(索引を拡張できません)が発生し、INSERT や UPDATE が停止します。
本記事では、表領域の使用状況を確認するSQL を目的別に完全網羅します。基本の使用率確認、AUTOEXTEND を考慮した実質使用率、TEMP / UNDO 表領域の確認、閾値超過アラート SQL、増加傾向の分析まで、コピーしてすぐ使える実用的な SQL を提供します。
この記事でわかること
・表領域の使用率を確認する基本 SQL
・AUTOEXTEND(自動拡張)を考慮した実質使用率の計算
・DBA_TABLESPACE_USAGE_METRICS による簡易確認
・データファイル別の使用率確認
・TEMP 表領域 / UNDO 表領域の使用状況確認
・使用率 80% 超の表領域を検出する閾値アラート SQL
・DBA_HIST_TBSPC_SPACE_USAGE による増加傾向の分析
・PL/SQL による自動監視スクリプト
・表領域の使用率を確認する基本 SQL
・AUTOEXTEND(自動拡張)を考慮した実質使用率の計算
・DBA_TABLESPACE_USAGE_METRICS による簡易確認
・データファイル別の使用率確認
・TEMP 表領域 / UNDO 表領域の使用状況確認
・使用率 80% 超の表領域を検出する閾値アラート SQL
・DBA_HIST_TBSPC_SPACE_USAGE による増加傾向の分析
・PL/SQL による自動監視スクリプト
表領域の使用率を確認する(基本)
SQL(使用率の基本クエリ)
-- 表領域ごとの合計サイズ / 使用サイズ / 空きサイズ / 使用率
SELECT
df.tablespace_name,
ROUND(df.total_mb, 1) AS total_mb,
ROUND(df.total_mb - NVL(fs.free_mb, 0), 1) AS used_mb,
ROUND(NVL(fs.free_mb, 0), 1) AS free_mb,
ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 1) AS used_pct
FROM
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY used_pct DESC;
出力例:
| TABLESPACE_NAME | TOTAL_MB | USED_MB | FREE_MB | USED_PCT |
|---|---|---|---|---|
| USERS | 1024.0 | 921.6 | 102.4 | 90.0 |
| SYSTEM | 800.0 | 640.0 | 160.0 | 80.0 |
| SYSAUX | 500.0 | 350.0 | 150.0 | 70.0 |
このクエリは「現在のファイルサイズ」ベースの使用率
AUTOEXTEND が ON のデータファイルは、まだ拡張の余地があります。「使用率 90% だが AUTOEXTEND で 32GB まで拡張可能」なら、実質的な危険度は低いです。次のセクションの AUTOEXTEND 考慮版を使う方が実践的です。
AUTOEXTEND が ON のデータファイルは、まだ拡張の余地があります。「使用率 90% だが AUTOEXTEND で 32GB まで拡張可能」なら、実質的な危険度は低いです。次のセクションの AUTOEXTEND 考慮版を使う方が実践的です。
AUTOEXTEND を考慮した実質使用率
SQL(AUTOEXTEND 考慮版: 最大拡張可能サイズベース)
-- AUTOEXTEND ON のファイルは maxbytes を上限として使用率を計算
SELECT
df.tablespace_name,
ROUND(df.current_mb, 1) AS current_mb,
ROUND(df.max_mb, 1) AS max_mb,
ROUND(df.current_mb - NVL(fs.free_mb, 0), 1) AS used_mb,
ROUND((df.current_mb - NVL(fs.free_mb, 0)) / df.max_mb * 100, 1)
AS used_pct_of_max
FROM
(SELECT tablespace_name,
SUM(bytes)/1024/1024 AS current_mb,
SUM(CASE WHEN autoextensible = 'YES'
THEN GREATEST(maxbytes, bytes)
ELSE bytes END)/1024/1024 AS max_mb
FROM dba_data_files
GROUP BY tablespace_name) df
LEFT JOIN
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space
GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY used_pct_of_max DESC;
AUTOEXTEND 考慮版が本番監視の定番
・
・
・
この値が 80% を超えたら対処を検討すべきです。
・
current_mb: 現在のファイルサイズ(AUTOEXTEND 前)・
max_mb: AUTOEXTEND で拡張可能な最大サイズ・
used_pct_of_max: 最大サイズに対する使用率この値が 80% を超えたら対処を検討すべきです。
DBA_TABLESPACE_USAGE_METRICS(簡易版)
Oracle 11g 以降では DBA_TABLESPACE_USAGE_METRICS ビューでAUTOEXTEND を考慮した使用率を1 行のクエリで取得できます。
SQL(簡易版: 1 行クエリ)
-- Oracle が AUTOEXTEND を考慮して計算してくれる
SELECT tablespace_name,
ROUND(used_space * 8192 / 1024 / 1024, 1) AS used_mb,
ROUND(tablespace_size * 8192 / 1024 / 1024, 1) AS max_mb,
ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
ORDER BY used_percent DESC;
-- used_space / tablespace_size はブロック単位
-- 8192 = デフォルトのブロックサイズ(8KB)
-- ブロックサイズが異なる場合は DB_BLOCK_SIZE を確認
ブロックサイズの確認
DBA_TABLESPACE_USAGE_METRICS の値はブロック単位です。MB に変換するにはブロックサイズ(通常 8192 バイト)を掛けます。
DBA_TABLESPACE_USAGE_METRICS の値はブロック単位です。MB に変換するにはブロックサイズ(通常 8192 バイト)を掛けます。
SHOW PARAMETER db_block_size でブロックサイズを確認してください。データファイル別の使用率
SQL(データファイル単位の詳細)
SELECT
df.tablespace_name,
df.file_name,
ROUND(df.bytes/1024/1024, 1) AS file_mb,
ROUND((df.bytes - NVL(fs.free_bytes, 0))/1024/1024, 1) AS used_mb,
ROUND(NVL(fs.free_bytes, 0)/1024/1024, 1) AS free_mb,
df.autoextensible AS autoext,
ROUND(df.maxbytes/1024/1024, 1) AS max_mb
FROM dba_data_files df
LEFT JOIN (
SELECT file_id, SUM(bytes) AS free_bytes
FROM dba_free_space
GROUP BY file_id
) fs ON df.file_id = fs.file_id
ORDER BY df.tablespace_name, df.file_name;
データファイルレベルの確認が必要な場面
・1 つの表領域に複数のデータファイルがある場合(どのファイルが満杯か特定)
・AUTOEXTEND の ON/OFF がファイルごとに異なる場合
・特定のディスクの空き容量と突き合わせる場合
・1 つの表領域に複数のデータファイルがある場合(どのファイルが満杯か特定)
・AUTOEXTEND の ON/OFF がファイルごとに異なる場合
・特定のディスクの空き容量と突き合わせる場合
TEMP 表領域の使用状況
SQL(TEMP 表領域の使用状況)
-- TEMP 表領域の使用率
SELECT
tablespace_name,
ROUND(tablespace_size/1024/1024, 1) AS total_mb,
ROUND(allocated_space/1024/1024, 1) AS alloc_mb,
ROUND(free_space/1024/1024, 1) AS free_mb,
ROUND(allocated_space/tablespace_size * 100, 1) AS used_pct
FROM dba_temp_free_space;
-- TEMP を使用しているセッション別の内訳
SELECT
s.sid, s.serial#, s.username,
ROUND(t.blocks * 8192/1024/1024, 1) AS temp_mb,
s.sql_id,
SUBSTR(q.sql_text, 1, 80) AS sql_text
FROM v$sort_usage t
JOIN v$session s ON t.session_addr = s.saddr
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
ORDER BY t.blocks DESC;
TEMP 表領域の肥大化対策は「TEMP 表領域の肥大化を防ぐ方法」を参照してください。
UNDO 表領域の使用状況
SQL(UNDO 表領域の使用状況)
-- UNDO 表領域の使用率(ステータス別)
SELECT
tablespace_name,
status,
ROUND(SUM(bytes)/1024/1024, 1) AS mb
FROM dba_undo_extents
GROUP BY tablespace_name, status
ORDER BY tablespace_name, status;
-- status: ACTIVE(使用中)/ UNEXPIRED(保持中)/ EXPIRED(再利用可能)
-- UNDO の残り保持時間
SHOW PARAMETER undo_retention;
-- undo_retention = 900(秒)→ 15 分間の UNDO を保持
| UNDO status | 意味 | 再利用 |
|---|---|---|
| ACTIVE | アクティブなトランザクションが使用中 | 不可 |
| UNEXPIRED | undo_retention 期間内(フラッシュバッククエリ用に保持) | 緊急時は再利用される |
| EXPIRED | 保持期間を超えた(不要) | 再利用可能 |
閾値超過アラート SQL
使用率が閾値(80% / 90% 等)を超えた表領域だけを検出する SQL です。日次バッチやジョブスケジューラで定期実行すれば、容量不足を事前に検知できます。
SQL(使用率 80% 超の表領域を検出)
-- 実質使用率(AUTOEXTEND 考慮)が 80% を超える表領域
SELECT tablespace_name,
ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE used_percent >= 80
ORDER BY used_percent DESC;
SQL(空き容量が 1GB 未満の表領域を検出)
-- 残り容量ベースでの閾値チェック
SELECT
df.tablespace_name,
ROUND(NVL(fs.free_mb, 0), 1) AS free_mb,
ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 1) AS used_pct
FROM
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
WHERE NVL(fs.free_mb, 0) < 1024 -- 1GB 未満
ORDER BY free_mb;
増加傾向の分析(DBA_HIST_TBSPC_SPACE_USAGE)
SQL(表領域サイズの時系列推移: AWR)
-- 過去 7 日間の表領域使用量の推移(AWR スナップショット)
SELECT
TO_CHAR(sn.begin_interval_time, 'YYYY-MM-DD') AS day,
ts.tablespace_id,
(SELECT tablespace_name FROM v$tablespace WHERE ts# = ts.tablespace_id) AS ts_name,
ROUND(MAX(ts.tablespace_usedsize * 8192)/1024/1024, 1) AS used_mb
FROM dba_hist_tbspc_space_usage ts
JOIN dba_hist_snapshot sn ON ts.snap_id = sn.snap_id
WHERE sn.begin_interval_time >= SYSDATE - 7
GROUP BY TO_CHAR(sn.begin_interval_time, 'YYYY-MM-DD'), ts.tablespace_id
ORDER BY ts_name, day;
増加傾向の分析で「いつ枯渇するか」を予測する
日次の使用量推移を見れば、1 日あたりの増加量がわかります。残り容量 / 1 日あたりの増加量 = 枯渇までの推定日数として計算できます。80% に達する前にデータファイルの追加や AUTOEXTEND の上限変更を検討してください。
日次の使用量推移を見れば、1 日あたりの増加量がわかります。残り容量 / 1 日あたりの増加量 = 枯渇までの推定日数として計算できます。80% に達する前にデータファイルの追加や AUTOEXTEND の上限変更を検討してください。
DBA_HIST_* は Enterprise Edition + Diagnostics Pack のライセンスが必要
Standard Edition では DBA_HIST 系ビューは使えません。代わりに日次バッチで使用量をログテーブルに記録し、独自に推移を追跡してください。
Standard Edition では DBA_HIST 系ビューは使えません。代わりに日次バッチで使用量をログテーブルに記録し、独自に推移を追跡してください。
PL/SQL による自動監視スクリプト
SQL(閾値超過時にアラートテーブルに記録)
-- 閾値超過の表領域をアラートテーブルに記録するプロシージャ
CREATE OR REPLACE PROCEDURE check_tablespace_usage IS
v_threshold NUMBER := 80; -- 閾値: 80%
BEGIN
FOR rec IN (
SELECT tablespace_name,
ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE used_percent >= v_threshold
) LOOP
INSERT INTO tablespace_alerts
(tablespace_name, used_pct, check_date)
VALUES
(rec.tablespace_name, rec.used_pct, SYSDATE);
END LOOP;
COMMIT;
END;
/
-- DBMS_SCHEDULER で日次実行
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'JOB_CHECK_TABLESPACE',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN check_tablespace_usage; END;',
start_date => TRUNC(SYSDATE) + 1 + 8/24, -- 明日 8:00
repeat_interval => 'FREQ=DAILY; BYHOUR=8',
enabled => TRUE
);
END;
/
容量不足を検知した場合の対処
| 状況 | 対処法 | SQL / コマンド |
|---|---|---|
| 使用率 80% 超 | データファイルの追加を計画 | ALTER TABLESPACE ts ADD DATAFILE ‘/path/file.dbf’ SIZE 1G AUTOEXTEND ON |
| AUTOEXTEND が OFF | AUTOEXTEND を ON にする | ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND ON MAXSIZE 32G |
| AUTOEXTEND の上限に近い | MAXSIZE を拡大、またはファイル追加 | ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND ON MAXSIZE 64G |
| 不要データが大量にある | 不要テーブルの TRUNCATE / DROP | TRUNCATE TABLE old_logs; / DROP TABLE temp_data PURGE; |
| 断片化で空きが使えない | 表領域の COALESCE またはテーブル MOVE | ALTER TABLESPACE ts COALESCE; / ALTER TABLE t MOVE; |
容量不足の緊急対応手順は「容量不足の緊急対応完全ガイド」、表領域の管理全般は「表領域(Tablespace)完全ガイド」を参照してください。
コピーして使える SQL 一覧
| 確認内容 | ビュー / クエリ |
|---|---|
| 表領域の使用率(基本) | DBA_DATA_FILES + DBA_FREE_SPACE |
| AUTOEXTEND 考慮の使用率 | DBA_DATA_FILES(maxbytes 使用)+ DBA_FREE_SPACE |
| 使用率(簡易 1 行) | DBA_TABLESPACE_USAGE_METRICS |
| データファイル別 | DBA_DATA_FILES + DBA_FREE_SPACE(file_id 結合) |
| TEMP 表領域 | DBA_TEMP_FREE_SPACE / V$SORT_USAGE |
| UNDO 表領域 | DBA_UNDO_EXTENTS(status 別集計) |
| 増加傾向(AWR) | DBA_HIST_TBSPC_SPACE_USAGE(EE + Diagnostics Pack) |
| 閾値超過検出 | DBA_TABLESPACE_USAGE_METRICS WHERE used_percent >= 80 |
よくある質問
QDBA_FREE_SPACE に表領域が表示されません
A
DBA_FREE_SPACE は永続表領域の空き領域のみを表示します。TEMP 表領域は DBA_TEMP_FREE_SPACE、UNDO 表領域は DBA_UNDO_EXTENTS で確認してください。また、表領域が完全に使い切られている(空き 0)場合も表示されません。Q使用率 90% でもまだ大丈夫ですか?
AAUTOEXTEND が ON で maxbytes に余裕があれば、Oracle が自動的にデータファイルを拡張するため即座に問題にはなりません。ただし、ディスク空き容量が不足していると拡張に失敗して ORA-01653 が発生します。AUTOEXTEND 考慮版の使用率と、OS のディスク空き容量の両方を確認してください。
QDBA_TABLESPACE_USAGE_METRICS のブロックサイズは?
A
used_space と tablespace_size はブロック単位です。MB に変換するには * DB_BLOCK_SIZE / 1024 / 1024 を掛けます。デフォルトの DB_BLOCK_SIZE は 8192 バイト(8KB)です。SHOW PARAMETER db_block_size で確認してください。QStandard Edition で増加傾向を分析するには?
ADBA_HIST 系ビュー(AWR)は Enterprise Edition + Diagnostics Pack が必要です。Standard Edition では、日次バッチで使用量を独自のログテーブルに記録し、推移を自前で追跡するのが一般的です。本記事の PL/SQL 自動監視スクリプトを参考にしてください。
QUNDO 表領域の UNEXPIRED が多いのは問題ですか?
A
UNEXPIRED は UNDO_RETENTION 期間内の UNDO データです。フラッシュバッククエリ(過去のデータの参照)に使われます。容量が不足すると Oracle が UNEXPIRED を自動的に再利用するため、通常は問題ありません。ただし UNDO_RETENTION が長すぎると不要な UNDO が溜まるので、業務要件に合った値に設定してください。Q表領域の空きがあるのに ORA-01653 が出ます
A断片化が原因の可能性があります。空き容量は合計では十分でも、連続した空き領域(エクステント)が不足しているとテーブルを拡張できません。
ALTER TABLESPACE ts COALESCE で連続領域を統合するか、ALTER TABLE t MOVE でテーブルを再配置してください。まとめ
表領域の使用状況確認の要点をまとめます。
| やりたいこと | 推奨 SQL / ビュー |
|---|---|
| 使用率を簡単に確認 | SELECT tablespace_name, used_percent FROM DBA_TABLESPACE_USAGE_METRICS |
| AUTOEXTEND 考慮の使用率 | DBA_DATA_FILES(maxbytes)+ DBA_FREE_SPACE |
| データファイル別の詳細 | DBA_DATA_FILES + DBA_FREE_SPACE(file_id 結合) |
| TEMP 表領域の使用状況 | DBA_TEMP_FREE_SPACE / V$SORT_USAGE |
| UNDO 表領域の使用状況 | DBA_UNDO_EXTENTS(status 別集計) |
| 閾値超過を検出 | DBA_TABLESPACE_USAGE_METRICS WHERE used_percent >= 80 |
| 増加傾向を分析 | DBA_HIST_TBSPC_SPACE_USAGE(EE + Diagnostics Pack) |
| 自動監視 | PL/SQL プロシージャ + DBMS_SCHEDULER |

