【Oracle】ORA-01653/ORA-01654の原因と解決方法|unable to extend table/index・表領域不足の確認と対処

【Oracle】ORA-01653/ORA-01654の原因と解決方法|unable to extend table/index・表領域不足の確認と対処 Oracle

ORA-01653ORA-01654 は、Oracleが表または索引を拡張するための領域を確保できない時に発生するエラーです。どちらも表領域不足として扱われることが多いですが、対象が表なのか索引なのか、AUTOEXTENDで伸ばせる余地があるのか、ストレージ自体が足りないのかで対応が変わります。

Oracle公式のエラー説明でも、ORA-01653は表セグメント、ORA-01654は索引セグメントで必要なエクステントを割り当てられなかった状態として説明されています。この記事では、エラー文の読み方、確認SQL、データファイル追加、AUTOEXTEND、リサイズ、再発防止までを一通り整理します。表領域全般の基本は Oracle表領域完全ガイド、使用率確認SQLは 表領域の使用状況を確認するSQLまとめ も参考にしてください。

この記事で分かること

  • ORA-01653とORA-01654の違い
  • 表領域、データファイル、AUTOEXTEND、MAXSIZEの確認SQL
  • ADD DATAFILE、RESIZE、AUTOEXTEND ONの使い分け
  • ORA-01652 TEMP表領域不足との切り分け
  • 再発防止の監視・容量設計ポイント
スポンサーリンク

最初に結論:空き容量だけでなく上限と対象セグメントを見る

ORA-01653/ORA-01654が出た時は、単に表領域使用率だけを見ても判断を誤ることがあります。最初に、エラー文の表領域名、対象オブジェクト、必要ブロック数を控えます。次に DBA_DATA_FILESDBA_FREE_SPACEDBA_TABLESDBA_INDEXES を使って、データファイルに空きがあるか、AUTOEXTENDが有効か、MAXSIZEに達していないか、OSやASM側の空きがあるか、対象が表なのか索引なのかを順に確認します。

対象を読むエラー文に出ている表名、索引名、表領域名、拡張しようとしたブロック数を控えます。
表領域の余地を見る空き領域、データファイルサイズ、AUTOEXTEND、MAXSIZEを確認します。
安全な対処を選ぶ短期対応はデータファイル追加やAUTOEXTEND変更、恒久対応は増加傾向と容量設計の見直しです。
TEMP不足と分けるORA-01652はTEMPセグメント不足です。通常の表・索引不足とは確認先が変わります。
緊急時の判断フロー

  1. エラー文の表領域名を確認する
  2. ORA-01653なら表、ORA-01654なら索引の表領域を見る
  3. 空きMBとMAXSIZEまでの余地を確認する
  4. 余地がなければデータファイル追加、余地があるならAUTOEXTEND設定を確認する
  5. 一時対応後、増加傾向と監視閾値を見直す

TEMP表領域不足のエラーは ORA-01652の原因と解決方法 で扱っています。今回の記事では通常の表領域で表や索引を拡張できないケースに絞ります。

エラーメッセージの読み方

ORA-01653は表、ORA-01654は索引を拡張できない時に出ます。エラー文には、対象オブジェクト、必要なブロック数、表領域名が含まれるため、まずここを確認します。

ora-01653-01654-message.txt
ORA-01653: unable to extend table APP.ORDERS by 128 in tablespace USERS

ORA-01654: unable to extend index APP.IX_ORDERS_01 by 128 in tablespace INDX

by 128 は拡張しようとしたブロック数です。同じ表領域に空きがあっても、必要な連続領域、データファイル上限、AUTOEXTEND設定、ストレージ空きによって拡張できないことがあります。

空きがあるのに拡張できない主な理由

MAXSIZEに達しているAUTOEXTENDがONでも、データファイルのMAXSIZEに達していればそれ以上は伸びません。
AUTOEXTENDがOFF表領域全体として余地が少ない状態でAUTOEXTENDがOFFだと、次のエクステントを確保できません。
OS/ASM側の空きがないOracle上の設定で伸ばせるように見えても、実ファイルを置くディスクやASMディスクグループに空きがなければ失敗します。
表と索引の表領域を見間違えている表はUSERS、索引はINDXのように分かれている場合、空きを見る対象を取り違えると解消しません。

確認SQL

表領域の使用率を確認する

まず、エラーに出ている表領域の現在サイズ、最大サイズ、空き容量を確認します。DBA_DATA_FILES でデータファイルの現在サイズと最大サイズ、DBA_FREE_SPACE で表領域内の空き領域を見ます。AUTOEXTENDを考慮した最大サイズまで見ると、今すぐ足りないのか、上限設定で止まっているのかを判断しやすくなります。

tablespace-usage.sql
SELECT df.tablespace_name,
       ROUND(df.bytes / 1024 / 1024) AS size_mb,
       ROUND(df.maxbytes / 1024 / 1024) AS max_mb,
       ROUND(NVL(fs.free_bytes, 0) / 1024 / 1024) AS free_mb,
       ROUND((df.bytes - NVL(fs.free_bytes, 0)) / df.bytes * 100, 1) AS used_pct
FROM (
  SELECT tablespace_name,
         SUM(bytes) AS bytes,
         SUM(CASE WHEN autoextensible = 'YES' THEN maxbytes ELSE bytes END) AS maxbytes
  FROM dba_data_files
  GROUP BY tablespace_name
) df
LEFT JOIN (
  SELECT tablespace_name,
         SUM(bytes) AS free_bytes
  FROM dba_free_space
  GROUP BY tablespace_name
) fs
  ON fs.tablespace_name = df.tablespace_name
WHERE df.tablespace_name = 'USERS';

より詳しい使用率確認やTEMP/UNDOを含む一覧は 表領域の使用状況を確認するSQLまとめ にまとめています。

データファイルとAUTOEXTENDを確認する

次に、対象表領域のデータファイルごとのサイズ、AUTOEXTEND、NEXT、MAXSIZEを確認します。MAXSIZEに近い、またはAUTOEXTENDがOFFなら、設定変更かデータファイル追加が必要です。

datafile-autoextend-check.sql
SELECT tablespace_name,
       file_name,
       ROUND(bytes / 1024 / 1024) AS size_mb,
       autoextensible,
       ROUND(increment_by * (SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024) AS next_mb,
       ROUND(maxbytes / 1024 / 1024) AS max_mb
FROM dba_data_files
WHERE tablespace_name IN ('USERS', 'INDX')
ORDER BY tablespace_name, file_id;

AUTOEXTENDの確認・変更を詳しく見る場合は 表領域の自動拡張(AUTOEXTEND)設定を確認・変更する方法 を確認してください。

対象オブジェクトの表領域を確認する

ORA-01653では表、ORA-01654では索引が対象です。表と索引が別表領域にある構成では、表領域名を取り違えないようにします。

object-tablespace-check.sql
-- 表の表領域
SELECT owner,
       table_name,
       tablespace_name
FROM dba_tables
WHERE owner = 'APP'
  AND table_name = 'ORDERS';

-- 索引の表領域
SELECT owner,
       index_name,
       table_owner,
       table_name,
       tablespace_name
FROM dba_indexes
WHERE owner = 'APP'
  AND index_name = 'IX_ORDERS_01';

対処方法を選ぶ

データファイルを追加する

もっとも分かりやすい対処は、対象表領域にデータファイルを追加することです。表領域の配置先、バックアップ対象、ディスク監視、ASMやOMFの運用ルールを確認してから実行します。

add-datafile.sql
ALTER TABLESPACE users
  ADD DATAFILE '/u01/oradata/ORCL/users02.dbf'
  SIZE 10G
  AUTOEXTEND ON
  NEXT 1G
  MAXSIZE 50G;

OMFを使っている環境ではファイル名を明示せず、DB_CREATE_FILE_DESTなどの設定に任せる運用もあります。表領域設計全体は Oracle表領域完全ガイド を確認してください。

既存データファイルをリサイズする

既存ファイルを大きくできる余地がある場合は、ALTER DATABASE DATAFILE ... RESIZE で拡張できます。OSやASM側の空き、バックアップ運用、ファイルシステム上限を確認します。

resize-datafile.sql
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
  RESIZE 50G;

AUTOEXTENDを有効化または上限変更する

AUTOEXTENDがOFFの場合、またはMAXSIZEが小さすぎる場合は、設定変更で解消できることがあります。ただし、無制限に伸ばすとストレージを使い切るリスクがあるため、監視とセットで設定します。

enable-autoextend.sql
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
  AUTOEXTEND ON
  NEXT 1G
  MAXSIZE 100G;

索引表領域だけ不足している場合

ORA-01654では、表ではなく索引の表領域が不足している可能性があります。表本体のUSERS表領域に空きがあっても、索引用のINDX表領域が足りなければエラーになります。

index-tablespace-example.sql
-- 索引表領域にファイルを追加する例
ALTER TABLESPACE indx
  ADD DATAFILE '/u01/oradata/ORCL/indx02.dbf'
  SIZE 5G
  AUTOEXTEND ON
  NEXT 512M
  MAXSIZE 30G;

やってはいけない対応

対象表領域を確認せずに別表領域を拡張する表と索引で表領域が分かれている場合、関係ない表領域を拡張しても解消しません。
AUTOEXTENDをUNLIMITEDにして放置する一時対応としては動いても、ストレージ枯渇や別障害につながります。上限と監視を決めます。
不要データ削除だけで済ませる削除後に領域が再利用できるとは限りません。セグメント、HWM、増加傾向を確認します。
TEMP不足と混同するORA-01652はTEMPセグメント不足です。通常の表領域不足とは確認先が違います。

ORA-01652との違い

ORA-01652 は、ソート、ハッシュ結合、CREATE INDEX、集計などでTEMPセグメントを拡張できない時に発生します。一方、ORA-01653は表、ORA-01654は索引の通常セグメントを拡張できない時のエラーです。

ORA-01652TEMP表領域不足。SQL実行計画、ソート、TEMP使用量、TEMPFILEを確認します。
ORA-01653表セグメント不足。対象表が属する表領域とデータファイルを確認します。
ORA-01654索引セグメント不足。対象索引が属する表領域とデータファイルを確認します。

TEMP不足の確認手順は ORA-01652の原因と解決方法 を参照してください。

本番対応チェックリスト

  • エラー文から対象オブジェクトと表領域名を控えた
  • 表領域使用率、空き容量、最大サイズを確認した
  • データファイルごとのAUTOEXTEND、NEXT、MAXSIZEを確認した
  • OSまたはASM側に拡張できる空きがあるか確認した
  • 表と索引の表領域を取り違えていないか確認した
  • ADD DATAFILE、RESIZE、AUTOEXTEND変更のどれで対処するか決めた
  • バックアップ、監視、容量アラートを見直した

再発防止

ORA-01653/ORA-01654の再発防止では、表領域の現在使用率だけでなく、増加傾向と拡張上限を監視します。月次・日次の増加量、バッチ投入量、索引再作成、パーティション追加、アーカイブ方針を合わせて確認します。

tablespace-growth-monitor.sql
SELECT tablespace_name,
       ROUND(SUM(bytes) / 1024 / 1024) AS allocated_mb,
       ROUND(SUM(CASE WHEN autoextensible = 'YES' THEN maxbytes ELSE bytes END) / 1024 / 1024) AS max_mb,
       SUM(CASE WHEN autoextensible = 'YES' THEN 1 ELSE 0 END) AS autoextend_files
FROM dba_data_files
GROUP BY tablespace_name
ORDER BY tablespace_name;

バックアップやリカバリ設計と表領域拡張は切り離せません。RMANの基本は Oracle RMAN完全ガイド、表領域単位の復旧は RMANで特定の表領域だけを復元する方法 も確認しておくと安心です。

まとめ

ORA-01653/ORA-01654は、Oracleが表または索引のエクステントを確保できない時のエラーです。まずエラー文から対象オブジェクトと表領域を読み取り、表領域の空き、AUTOEXTEND、MAXSIZE、ストレージ空きを確認します。

対処は、データファイル追加、既存データファイルのリサイズ、AUTOEXTEND設定変更が中心です。本番では一時的に解消するだけでなく、増加傾向、容量アラート、バックアップ対象、索引表領域の設計まで見直しましょう。