【Oracle】容量不足の緊急対応完全ガイド|エラー別診断・表領域/TEMP/UNDO/アーカイブログの対処手順

【Oracle】容量不足の緊急対応完全ガイド|エラー別診断・表領域/TEMP/UNDO/アーカイブログの対処手順 Oracle

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;
AUTOEXTEND ON で MAXSIZE を省略すると UNLIMITED になる
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 表領域は SHRINK で縮小できる(Oracle 11g 以降)
使用中のブロックを解放後、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 を引き起こす可能性がある
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;
アーカイブログの削除は OS コマンドでは行わない
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)

Q ORA-01653 が出たが AUTOEXTEND は ON になっている。なぜ?
A

AUTOEXTEND ON でも MAXSIZE の上限に達した場合や、OS のファイルシステムが満杯の場合は拡張できず ORA-01653 が発生します。dba_data_filesmaxbytes(MAXSIZE)と bytes(現在のサイズ)を比較し、上限に達していないか確認してください。

また、OS レベルのディスク空き容量も df -h(Linux)や「ディスクの管理」(Windows)で確認が必要です。

Q TEMP 表領域はセッション終了後に自動で解放される?
A

一時セグメント(ソート領域)はセッション終了時に解放されます。ただし TEMP 表領域の TempFile 自体は縮小されません。TempFile が拡張したサイズはインスタンス再起動か ALTER TABLESPACE TEMP SHRINK SPACE まで維持されます。

頻繁に TEMP 不足が起きる場合はソートが大きいクエリのチューニング(インデックス利用・ROWNUM での早期絞り込み)も検討してください。

Q UNDO 表領域の ACTIVE セグメントが多い。強制解放できる?
A

ACTIVE は現在コミット/ロールバック前のトランザクションが使用中のため、強制解放はできません。対応するトランザクションが完了するまで待つか、長時間コミットしていないセッションを ALTER SYSTEM KILL SESSION で強制終了してください。

UNEXPIRED は保持期間内の解放可能なセグメントなので、領域が足りない場合は Oracle が自動で上書きします。

Q アーカイブログ削除後もデータベースが起動しない
A

FRA が満杯で DB が停止した場合、STARTUP しても MOUNT 状態で止まることがあります。RMAN で STARTUP MOUNT 後にアーカイブログを削除し、ALTER DATABASE OPEN で開いてください。

RMAN TARGET /
STARTUP MOUNT
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
ALTER DATABASE OPEN;
Q 表領域を追加するとき ASM(Automatic Storage Management)環境ではどうする?
A

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% を超えたら事前に対処する運用を心がけてください。