ORA-01653 と ORA-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_FILES、DBA_FREE_SPACE、DBA_TABLES、DBA_INDEXES を使って、データファイルに空きがあるか、AUTOEXTENDが有効か、MAXSIZEに達していないか、OSやASM側の空きがあるか、対象が表なのか索引なのかを順に確認します。
- エラー文の表領域名を確認する
- ORA-01653なら表、ORA-01654なら索引の表領域を見る
- 空きMBとMAXSIZEまでの余地を確認する
- 余地がなければデータファイル追加、余地があるならAUTOEXTEND設定を確認する
- 一時対応後、増加傾向と監視閾値を見直す
TEMP表領域不足のエラーは ORA-01652の原因と解決方法 で扱っています。今回の記事では通常の表領域で表や索引を拡張できないケースに絞ります。
エラーメッセージの読み方
ORA-01653は表、ORA-01654は索引を拡張できない時に出ます。エラー文には、対象オブジェクト、必要なブロック数、表領域名が含まれるため、まずここを確認します。
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設定、ストレージ空きによって拡張できないことがあります。
空きがあるのに拡張できない主な理由
確認SQL
表領域の使用率を確認する
まず、エラーに出ている表領域の現在サイズ、最大サイズ、空き容量を確認します。DBA_DATA_FILES でデータファイルの現在サイズと最大サイズ、DBA_FREE_SPACE で表領域内の空き領域を見ます。AUTOEXTENDを考慮した最大サイズまで見ると、今すぐ足りないのか、上限設定で止まっているのかを判断しやすくなります。
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なら、設定変更かデータファイル追加が必要です。
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では索引が対象です。表と索引が別表領域にある構成では、表領域名を取り違えないようにします。
-- 表の表領域
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の運用ルールを確認してから実行します。
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側の空き、バックアップ運用、ファイルシステム上限を確認します。
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf' RESIZE 50G;
AUTOEXTENDを有効化または上限変更する
AUTOEXTENDがOFFの場合、またはMAXSIZEが小さすぎる場合は、設定変更で解消できることがあります。ただし、無制限に伸ばすとストレージを使い切るリスクがあるため、監視とセットで設定します。
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
索引表領域だけ不足している場合
ORA-01654では、表ではなく索引の表領域が不足している可能性があります。表本体のUSERS表領域に空きがあっても、索引用のINDX表領域が足りなければエラーになります。
-- 索引表領域にファイルを追加する例 ALTER TABLESPACE indx ADD DATAFILE '/u01/oradata/ORCL/indx02.dbf' SIZE 5G AUTOEXTEND ON NEXT 512M MAXSIZE 30G;
やってはいけない対応
ORA-01652との違い
ORA-01652 は、ソート、ハッシュ結合、CREATE INDEX、集計などでTEMPセグメントを拡張できない時に発生します。一方、ORA-01653は表、ORA-01654は索引の通常セグメントを拡張できない時のエラーです。
TEMP不足の確認手順は ORA-01652の原因と解決方法 を参照してください。
本番対応チェックリスト
- エラー文から対象オブジェクトと表領域名を控えた
- 表領域使用率、空き容量、最大サイズを確認した
- データファイルごとのAUTOEXTEND、NEXT、MAXSIZEを確認した
- OSまたはASM側に拡張できる空きがあるか確認した
- 表と索引の表領域を取り違えていないか確認した
- ADD DATAFILE、RESIZE、AUTOEXTEND変更のどれで対処するか決めた
- バックアップ、監視、容量アラートを見直した
再発防止
ORA-01653/ORA-01654の再発防止では、表領域の現在使用率だけでなく、増加傾向と拡張上限を監視します。月次・日次の増加量、バッチ投入量、索引再作成、パーティション追加、アーカイブ方針を合わせて確認します。
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設定変更が中心です。本番では一時的に解消するだけでなく、増加傾向、容量アラート、バックアップ対象、索引表領域の設計まで見直しましょう。

