Oracle で突然 INSERT や UPDATE が止まり「ORA-01653」や「ORA-01652」が発生した場合、原因の表領域種別を正確に特定し、正しい順序で対処することが最優先です。本記事ではエラーコード別の診断から、データ表領域・TEMP 表領域・UNDO 表領域・アーカイブログ(FRA)の種別ごとの緊急対応手順を一本で解説します。
- エラーコードから「どの表領域が不足しているか」を即座に判断する方法
- データ表領域の容量不足(ORA-01653)への緊急対処とデータファイル追加手順
- TEMP 表領域不足(ORA-01652)の応急処置と TempFile 追加手順
- UNDO 表領域不足(ORA-30036 / ORA-01555)の診断と対処
- アーカイブログ領域(FRA)が満杯になった場合の対処
- 再発防止のための監視 SQL と AUTOEXTEND 設定
エラーコードで種別を素早く判断する
容量不足エラーは発生箇所によってエラーコードが異なります。まずエラーコードで「どこの容量が不足しているか」を特定してください。
| エラーコード | 不足している領域 | 緊急度 | ジャンプ先 |
|---|---|---|---|
ORA-01653 |
データ表領域(テーブルを拡張できない) | 高 | → ↓ データ表領域の対処 |
ORA-01654 |
データ表領域(インデックスを拡張できない) | 高 | → ↓ データ表領域の対処 |
ORA-01650 |
UNDO 表領域(ロールバックセグメントを拡張できない) | 高 | → ↓ UNDO 表領域の対処 |
ORA-01652 |
TEMP 表領域(一時セグメントを拡張できない) | 中 | → ↓ TEMP 表領域の対処 |
ORA-30036 |
UNDO 表領域(UNDO セグメントを拡張できない) | 高 | ↓ UNDO 表領域の対処 |
ORA-01555 |
UNDO データの上書き(スナップショット古すぎ) | 中 | → ↓ UNDO 表領域の対処 |
ORA-19809 / ORA-16014 |
アーカイブログ領域(FRA) | 最高 | → ↓ アーカイブログの対処 |
データ表領域の容量不足(ORA-01653 / ORA-01654)
Step 1:どの表領域が不足しているか特定する
-- 表領域の使用率・空き容量を一覧表示 SELECT df.tablespace_name, ROUND(df.total_mb, 0) AS total_mb, ROUND(df.total_mb - NVL(fs.free_mb, 0), 0) AS used_mb, ROUND(NVL(fs.free_mb, 0), 0) AS free_mb, ROUND((1 - 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 NULLS LAST;
ORA-01653: unable to extend table HR.EMPLOYEES by 128 in tablespace USERSエラーメッセージ末尾の
tablespace USERS が不足している表領域名です。上記 SQL での確認と合わせて使ってください。
Step 2:AUTOEXTEND の状態を確認する
-- データファイルの自動拡張設定を確認 SELECT file_name, ROUND(bytes / 1024 / 1024, 0) AS current_mb, ROUND(maxbytes / 1024 / 1024, 0) AS max_mb, autoextensible, ROUND(increment_by * 8 / 1024, 0) AS increment_mb -- 8KB ブロック想定 FROM dba_data_files WHERE tablespace_name = 'USERS' ORDER BY file_name;
Step 3:応急処置(3択)
選択肢 A:既存データファイルを手動で拡張(最速・推奨)
-- 既存データファイルのサイズを拡張(例: 5GB → 10GB) ALTER DATABASE DATAFILE '/oradata/ORCL/users01.dbf' RESIZE 10240M;
選択肢 B:新しいデータファイルを追加
-- データファイルを追加(ディスク容量が許す限りサイズを指定) ALTER TABLESPACE USERS ADD DATAFILE '/oradata/ORCL/users02.dbf' SIZE 2048M;
選択肢 C:AUTOEXTEND を有効化(恒久設定としても有効)
-- AUTOEXTEND を有効化(MAXSIZE は必ず設定する) ALTER DATABASE DATAFILE '/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 256M MAXSIZE 20480M;
MAXSIZE を省略すると OS のディスク上限までデータファイルが際限なく拡張されます。必ず
MAXSIZE を指定し、ディスクの空き容量と相談した上限を設定してください。
TEMP 表領域の容量不足(ORA-01652)
ORA-01652 は大規模な ORDER BY / GROUP BY / HASH JOIN / CREATE INDEX など、ソート処理が TEMP 表領域を使い切ったときに発生します。セッションが終了すれば一時的に解放されるため、まず原因セッションを特定します。
Step 1:TEMP 使用状況を確認する
-- TEMP 表領域の使用率 SELECT tf.tablespace_name, ROUND(tf.total_mb, 0) AS total_mb, ROUND(NVL(tu.used_mb, 0), 0) AS used_mb, ROUND(tf.total_mb - NVL(tu.used_mb, 0), 0) AS free_mb, ROUND(NVL(tu.used_mb, 0) / tf.total_mb * 100, 1) AS used_pct FROM (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS total_mb FROM dba_temp_files GROUP BY tablespace_name) tf LEFT JOIN (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 AS used_mb FROM v$temp_space_header GROUP BY tablespace_name) tu ON tf.tablespace_name = tu.tablespace_name; -- TEMP を多く使っているセッションを特定 SELECT s.sid, s.serial#, s.username, s.sql_id, ROUND(t.blocks * 8 / 1024, 0) AS temp_mb, s.status, s.program FROM v$sort_usage t JOIN v$session s ON t.session_addr = s.saddr ORDER BY t.blocks DESC;
Step 2:応急処置
-- 大量に TEMP を消費しているセッションを強制終了(影響を確認してから実行) ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE; -- TempFile を追加して容量を増やす ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/ORCL/temp02.dbf' SIZE 1024M; -- TempFile に AUTOEXTEND を設定する ALTER DATABASE TEMPFILE '/oradata/ORCL/temp01.dbf' AUTOEXTEND ON NEXT 256M MAXSIZE 4096M;
使用中のブロックを解放後、TEMP 表領域を縮小して他に容量を返せます。
ALTER TABLESPACE TEMP SHRINK SPACE KEEP 512M;KEEP で最小残留サイズを指定します。
UNDO 表領域の容量不足(ORA-30036 / ORA-01555)
UNDO 表領域は DML のロールバック情報と、一貫性読み取り用の旧データを保持します。不足すると ORA-30036(拡張不可)や ORA-01555(スナップショット古すぎ)が発生します。
Step 1:UNDO 使用状況と保持設定を確認する
-- UNDO 表領域の使用状況 SELECT tablespace_name, status, ROUND(SUM(bytes) / 1024 / 1024, 0) AS mb FROM dba_undo_extents GROUP BY tablespace_name, status ORDER BY tablespace_name, status; -- status: ACTIVE(使用中)/ UNEXPIRED(保持期間内)/ EXPIRED(解放可能) -- UNDO_RETENTION 設定を確認(秒単位) SHOW PARAMETER undo_retention; -- 現在の UNDO 表領域サイズ SELECT file_name, ROUND(bytes / 1024 / 1024, 0) AS current_mb, autoextensible FROM dba_data_files WHERE tablespace_name = (SELECT value FROM v$parameter WHERE name = 'undo_tablespace');
Step 2:応急処置
-- A: データファイルを追加(ORA-30036 の即時解消) ALTER TABLESPACE UNDOTBS1 ADD DATAFILE '/oradata/ORCL/undotbs02.dbf' SIZE 2048M; -- B: UNDO_RETENTION を短縮して UNEXPIRED 領域を早期に解放(ORA-01555 が増える可能性あり) ALTER SYSTEM SET UNDO_RETENTION = 900; -- デフォルト 900 秒(15分)に戻す -- C: AUTOEXTEND を有効化 ALTER DATABASE DATAFILE '/oradata/ORCL/undotbs01.dbf' AUTOEXTEND ON NEXT 512M MAXSIZE 10240M;
UNDO_RETENTION を短縮すると長時間実行クエリ(レポートや夜間バッチ)が ORA-01555: snapshot too old を発生させやすくなります。本番環境では短縮する前に実行中の長時間クエリの有無を確認してください。
アーカイブログ領域(FRA)が満杯(ORA-19809 / ORA-16014)
FRA(Fast Recovery Area)が満杯になると、Oracle はアーカイブ REDO ログを書き出せずデータベース全体が停止する最も深刻なケースです。即座に対処が必要です。
Step 1:FRA の使用状況を確認する
-- FRA の全体使用量 SELECT space_limit / 1024 / 1024 / 1024 AS limit_gb, space_used / 1024 / 1024 / 1024 AS used_gb, space_reclaimable / 1024 / 1024 / 1024 AS reclaimable_gb, ROUND(space_used / space_limit * 100, 1) AS used_pct FROM v$recovery_file_dest; -- FRA 内のファイル種別ごとの使用量 SELECT file_type, percent_space_used, number_of_files FROM v$recovery_area_usage ORDER BY percent_space_used DESC;
Step 2:緊急対処(優先度順)
-- A: RMAN でアーカイブログを削除(バックアップ適用済み分) RMAN TARGET / DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1'; -- 1日以上前を削除 -- B: 適用済みであることを確認してから削除(安全策) DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1' BACKED UP 1 TIMES TO DEVICE TYPE DISK; -- C: FRA のサイズ上限を拡張する(ディスクに余裕がある場合) ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G;
rm コマンドで直接削除すると RMAN のカタログと不整合が生じ、バックアップ・リカバリができなくなります。必ず RMAN の DELETE コマンド で削除してください。
共通の恒久対策:監視と自動拡張の整備
全表領域の使用率を定期監視するSQL
-- データ表領域 + TEMP 表領域を一覧化(使用率 80% 以上を警告扱い)
SELECT
tablespace_name,
type,
total_mb,
free_mb,
used_pct,
CASE WHEN used_pct >= 90 THEN '危険'
WHEN used_pct >= 80 THEN '警告'
ELSE '正常' END AS status
FROM (
-- データ表領域
SELECT
df.tablespace_name,
'DATA' AS type,
ROUND(df.total_mb, 0) AS total_mb,
ROUND(NVL(fs.free_mb, 0), 0) AS free_mb,
ROUND((1 - 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
UNION ALL
-- TEMP 表領域
SELECT
tf.tablespace_name,
'TEMP' AS type,
ROUND(tf.total_mb, 0),
ROUND(tf.total_mb - NVL(tu.used_mb, 0), 0),
ROUND(NVL(tu.used_mb, 0) / tf.total_mb * 100, 1)
FROM
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_temp_files GROUP BY tablespace_name) tf
LEFT JOIN
(SELECT tablespace_name, SUM(bytes_used)/1024/1024 AS used_mb
FROM v$temp_space_header GROUP BY tablespace_name) tu
ON tf.tablespace_name = tu.tablespace_name
)
ORDER BY used_pct DESC NULLS LAST;
よくある質問(FAQ)
AUTOEXTEND ON でも MAXSIZE の上限に達した場合や、OS のファイルシステムが満杯の場合は拡張できず ORA-01653 が発生します。dba_data_files で maxbytes(MAXSIZE)と bytes(現在のサイズ)を比較し、上限に達していないか確認してください。
また、OS レベルのディスク空き容量も df -h(Linux)や「ディスクの管理」(Windows)で確認が必要です。
一時セグメント(ソート領域)はセッション終了時に解放されます。ただし TEMP 表領域の TempFile 自体は縮小されません。TempFile が拡張したサイズはインスタンス再起動か ALTER TABLESPACE TEMP SHRINK SPACE まで維持されます。
頻繁に TEMP 不足が起きる場合はソートが大きいクエリのチューニング(インデックス利用・ROWNUM での早期絞り込み)も検討してください。
ACTIVE は現在コミット/ロールバック前のトランザクションが使用中のため、強制解放はできません。対応するトランザクションが完了するまで待つか、長時間コミットしていないセッションを ALTER SYSTEM KILL SESSION で強制終了してください。
UNEXPIRED は保持期間内の解放可能なセグメントなので、領域が足りない場合は Oracle が自動で上書きします。
FRA が満杯で DB が停止した場合、STARTUP しても MOUNT 状態で止まることがあります。RMAN で STARTUP MOUNT 後にアーカイブログを削除し、ALTER DATABASE OPEN で開いてください。
RMAN TARGET / STARTUP MOUNT DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1'; ALTER DATABASE OPEN;
ASM 環境ではデータファイルのパスに OS パスではなく ASM ディスクグループ名を指定します。
-- ASM 環境でデータファイルを追加する例 ALTER TABLESPACE USERS ADD DATAFILE '+DATA/ORCL/DATAFILE/users02.dbf' SIZE 2048M;
ASM ディスクグループの空き容量は V$ASM_DISKGROUP ビューの FREE_MB で確認できます。
まとめ:エラー別対処の早見表
| エラー | 対象領域 | 即時対処 | 恒久対策 |
|---|---|---|---|
ORA-01653/01654 |
データ表領域 | RESIZE / ADD DATAFILE | AUTOEXTEND ON + 定期監視 |
ORA-01652 |
TEMP 表領域 | セッション終了 / ADD TEMPFILE | AUTOEXTEND ON / クエリチューニング |
ORA-30036/01650 |
UNDO 表領域 | ADD DATAFILE / AUTOEXTEND | 適切な UNDO_RETENTION 設定 |
ORA-01555 |
UNDO(旧データ消滅) | クエリを再実行 | UNDO_RETENTION 延長 / UNDO 表領域拡張 |
ORA-19809/16014 |
FRA(アーカイブログ) | RMAN DELETE ARCHIVELOG | FRA サイズ拡張 / バックアップ自動化 |
容量不足への対応は「エラーコード → 領域特定 → 応急処置 → 恒久対策」の 4 ステップが基本です。特に FRA 満杯はデータベース停止につながるため最優先で対処し、他の表領域も使用率 80% を超えたら事前に対処する運用を心がけてください。

