Oracle の表領域(Tablespace)は 1 つ以上のデータファイルで構成されています。表領域の容量が不足すると ORA-01653(表を拡張できません)が発生するため、データファイルの追加やリサイズが必要になります。
本記事では、データファイルの追加(ADD DATAFILE)、リサイズ(RESIZE)、AUTOEXTEND の設定、ファイルの移動と削除、TEMP ファイルの管理まで解説します。
この記事でわかること
・ALTER TABLESPACE ADD DATAFILE でデータファイルを追加する方法
・AUTOEXTEND ON / OFF の設定と MAXSIZE の指定
・既存データファイルのリサイズ(拡大 / 縮小)
・データファイルの確認 SQL(DBA_DATA_FILES)
・TEMP 表領域の TEMPFILE 追加方法
・データファイルの移動(RENAME)と削除
・ORA-01653 の緊急対処
・ALTER TABLESPACE ADD DATAFILE でデータファイルを追加する方法
・AUTOEXTEND ON / OFF の設定と MAXSIZE の指定
・既存データファイルのリサイズ(拡大 / 縮小)
・データファイルの確認 SQL(DBA_DATA_FILES)
・TEMP 表領域の TEMPFILE 追加方法
・データファイルの移動(RENAME)と削除
・ORA-01653 の緊急対処
データファイルを追加する(ADD DATAFILE)
SQL(基本構文)
-- 表領域にデータファイルを追加
ALTER TABLESPACE users
ADD DATAFILE '/oracle/oradata/ORCL/users02.dbf'
SIZE 1G;
-- AUTOEXTEND ON で自動拡張を有効化
ALTER TABLESPACE users
ADD DATAFILE '/oracle/oradata/ORCL/users03.dbf'
SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
-- AUTOEXTEND ON MAXSIZE UNLIMITED(ディスク上限まで拡張)
ALTER TABLESPACE users
ADD DATAFILE '/oracle/oradata/ORCL/users04.dbf'
SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
| パラメータ | 意味 | 例 |
|---|---|---|
| SIZE | データファイルの初期サイズ | SIZE 1G / SIZE 500M |
| AUTOEXTEND ON | 容量不足時に自動拡張 | AUTOEXTEND ON |
| NEXT | 1 回の自動拡張のサイズ | NEXT 100M |
| MAXSIZE | 自動拡張の上限サイズ | MAXSIZE 5G / MAXSIZE UNLIMITED |
| AUTOEXTEND OFF | 自動拡張を無効化(デフォルト) | AUTOEXTEND OFF |
AUTOEXTEND ON + MAXSIZE を指定するのがベストプラクティス
AUTOEXTEND ON にすれば容量不足(ORA-01653)を自動的に回避できます。ただし MAXSIZE UNLIMITED だとディスク全体を使い切るリスクがあるため、MAXSIZE を明示的に指定することを推奨します。
AUTOEXTEND ON にすれば容量不足(ORA-01653)を自動的に回避できます。ただし MAXSIZE UNLIMITED だとディスク全体を使い切るリスクがあるため、MAXSIZE を明示的に指定することを推奨します。
AUTOEXTEND の詳しい設定方法は「表領域の自動拡張(AUTOEXTEND)設定を確認・変更する方法」を参照してください。
ASM / OMF 環境でのデータファイル追加
SQL(ASM でデータファイルを追加)
-- ASM: ディスクグループ名で指定
ALTER TABLESPACE users
ADD DATAFILE '+DATA' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
-- ファイル名は ASM が自動生成
SQL(OMF: Oracle Managed Files)
-- OMF 有効時: ファイル名を省略可能 ALTER TABLESPACE users ADD DATAFILE SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 5G; -- db_create_file_dest に設定されたパスにファイルが自動作成される -- OMF の設定確認 SHOW PARAMETER db_create_file_dest;
データファイルの確認 SQL
SQL(全データファイルの一覧)
-- データファイルの一覧(サイズ / AUTOEXTEND / 最大サイズ)
SELECT tablespace_name, file_name,
ROUND(bytes/1024/1024) AS size_mb,
autoextensible AS autoext,
ROUND(maxbytes/1024/1024) AS max_mb,
ROUND(increment_by * 8192/1024/1024) AS next_mb
FROM dba_data_files
ORDER BY tablespace_name, file_name;
SQL(データファイル別の使用率)
-- データファイルごとの使用率
SELECT df.tablespace_name, df.file_name,
ROUND(df.bytes/1024/1024) AS file_mb,
ROUND((df.bytes - NVL(fs.free_bytes, 0))/1024/1024) AS used_mb,
ROUND(NVL(fs.free_bytes, 0)/1024/1024) AS free_mb,
df.autoextensible AS autoext
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;
SQL(TEMP ファイルの確認)
-- TEMP 表領域のファイル一覧
SELECT tablespace_name, file_name,
ROUND(bytes/1024/1024) AS size_mb,
autoextensible AS autoext,
ROUND(maxbytes/1024/1024) AS max_mb
FROM dba_temp_files
ORDER BY tablespace_name;
表領域の使用状況確認の詳細は「表領域の使用状況を確認する SQL まとめ」を参照してください。
既存データファイルのリサイズ(RESIZE)
SQL(データファイルの拡大)
-- 既存ファイルを 2GB に拡大 ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/users01.dbf' RESIZE 2G; -- ファイル番号で指定する場合 ALTER DATABASE DATAFILE 4 RESIZE 2G;
SQL(データファイルの縮小)
-- 使用中のブロックより小さくはできない ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/users01.dbf' RESIZE 500M; -- ORA-03297: ファイルは要求されたサイズより大きいデータを含んでいます -- → 使用中の HWM(High Water Mark)以下には縮小不可
RESIZE での縮小には制限がある
データファイルを縮小する場合、ファイル内で使用されているブロックの最上位位置(HWM)より小さくすることはできません。縮小したい場合は ALTER TABLE MOVE でテーブルを別の場所に移動し、空きブロックを確保してからRESIZE してください。
データファイルを縮小する場合、ファイル内で使用されているブロックの最上位位置(HWM)より小さくすることはできません。縮小したい場合は ALTER TABLE MOVE でテーブルを別の場所に移動し、空きブロックを確保してからRESIZE してください。
| 操作 | 可否 | 制限 |
|---|---|---|
| 拡大(RESIZE N で N > 現在サイズ) | 常に可能 | ディスク空き容量の範囲内 |
| 縮小(RESIZE N で N < 現在サイズ) | 条件付き | HWM 以下には縮小不可。ORA-03297 が出る場合あり |
既存ファイルの AUTOEXTEND を変更する
SQL(AUTOEXTEND の変更)
-- AUTOEXTEND を ON にする(NEXT と MAXSIZE を指定)
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
-- AUTOEXTEND を OFF にする
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/users01.dbf'
AUTOEXTEND OFF;
-- MAXSIZE を変更
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/users01.dbf'
AUTOEXTEND ON NEXT 200M MAXSIZE 32G;
TEMP 表領域の TEMPFILE 追加
TEMP 表領域にはデータファイル(DATAFILE)ではなく一時ファイル(TEMPFILE)を追加します。構文が異なるので注意してください。
SQL(TEMPFILE の追加)
-- TEMP 表領域に TEMPFILE を追加
ALTER TABLESPACE temp
ADD TEMPFILE '/oracle/oradata/ORCL/temp02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
-- TEMPFILE のリサイズ
ALTER DATABASE TEMPFILE '/oracle/oradata/ORCL/temp01.dbf' RESIZE 2G;
-- TEMPFILE の AUTOEXTEND を変更
ALTER DATABASE TEMPFILE '/oracle/oradata/ORCL/temp01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
TEMP にはDAT AFILE ではなく TEMPFILE を使う
ALTER TABLESPACE temp ADD DATAFILE ではなく ADD TEMPFILE です。同様にリサイズも ALTER DATABASE TEMPFILE を使います。DATAFILE と書くとエラーになります。データファイルの移動(RENAME)
SQL(オンラインでのデータファイル移動: 12c 以降)
-- 12c 以降: オンラインで移動可能
ALTER DATABASE MOVE DATAFILE
'/oracle/oradata/ORCL/users01.dbf'
TO '/oracle/new_disk/users01.dbf';
-- DB 稼働中に実行可能(ダウンタイムなし)
SQL(オフラインでの移動: 11g 以前)
-- (1) 表領域を OFFLINE
ALTER TABLESPACE users OFFLINE;
-- (2) OS でファイルをコピー
-- $ cp /oracle/oradata/ORCL/users01.dbf /oracle/new_disk/users01.dbf
-- (3) 制御ファイルのパスを更新
ALTER DATABASE RENAME FILE
'/oracle/oradata/ORCL/users01.dbf'
TO '/oracle/new_disk/users01.dbf';
-- (4) 表領域を ONLINE
ALTER TABLESPACE users ONLINE;
12c 以降は ALTER DATABASE MOVE DATAFILE が推奨
12c で導入された MOVE DATAFILE はオンライン(DB 稼働中)で実行でき、表領域を OFFLINE にする必要がありません。11g 以前では OFFLINE → OS コピー → RENAME の手順が必要です。
12c で導入された MOVE DATAFILE はオンライン(DB 稼働中)で実行でき、表領域を OFFLINE にする必要がありません。11g 以前では OFFLINE → OS コピー → RENAME の手順が必要です。
データファイルの削除
SQL(データファイルの削除)
-- 11g 以降: 空のデータファイルを削除 ALTER TABLESPACE users DROP DATAFILE '/oracle/oradata/ORCL/users04.dbf'; -- 注意: データが入っているファイルは削除できない -- ORA-03262: the file is non-empty -- → テーブルを MOVE で別ファイルに移動してからDROP
データが入っているファイルは DROP できない
DROP DATAFILE はファイルが空(使用ブロック 0)の場合のみ実行できます。データが入っている場合は、テーブルを ALTER TABLE MOVE で別のデータファイルに移動してから DROP してください。また、表領域に最後の 1 つだけ残ったデータファイルは削除できません。
DROP DATAFILE はファイルが空(使用ブロック 0)の場合のみ実行できます。データが入っている場合は、テーブルを ALTER TABLE MOVE で別のデータファイルに移動してから DROP してください。また、表領域に最後の 1 つだけ残ったデータファイルは削除できません。
ORA-01653 の緊急対処
エラーメッセージ
ORA-01653: unable to extend table HR.EMPLOYEES by 128 in tablespace USERS
| 対処法 | SQL | 即効性 |
|---|---|---|
| データファイルを追加 | ALTER TABLESPACE users ADD DATAFILE ‘…’ SIZE 1G AUTOEXTEND ON | 即時 |
| 既存ファイルをリサイズ | ALTER DATABASE DATAFILE ‘…’ RESIZE 2G | 即時 |
| AUTOEXTEND を ON にする | ALTER DATABASE DATAFILE ‘…’ AUTOEXTEND ON NEXT 100M MAXSIZE 10G | 即時 |
| MAXSIZE を拡大 | ALTER DATABASE DATAFILE ‘…’ AUTOEXTEND ON MAXSIZE 32G | 即時 |
| 不要データを削除 | TRUNCATE / DROP TABLE / DELETE + ALTER TABLE SHRINK SPACE | 中 |
容量不足の緊急対応の詳細は「容量不足の緊急対応完全ガイド」を参照してください。
BIGFILE 表領域のデータファイル
SQL(BIGFILE 表領域: 1 ファイルで最大 128TB)
-- BIGFILE 表領域の作成(データファイルは 1 つだけ)
CREATE BIGFILE TABLESPACE big_data
DATAFILE '/oracle/oradata/ORCL/big_data01.dbf'
SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
-- BIGFILE は ADD DATAFILE できない(1 ファイル固定)
-- リサイズでサイズを変更する
ALTER DATABASE DATAFILE '/oracle/oradata/ORCL/big_data01.dbf' RESIZE 50G;
| 種類 | ファイル数 | 最大サイズ(8KB ブロック) | 適するケース |
|---|---|---|---|
| SMALLFILE(デフォルト) | 複数可(1022 個まで) | 1 ファイルあたり 32GB | 一般的な表領域 |
| BIGFILE | 1 ファイルのみ | 128TB(8KB ブロック時) | 大規模表領域 / ASM 環境 |
実務パターン集
パターン(1): 本番の USERS 表領域に緊急でファイル追加
SQL
-- ORA-01653 が発生 → 緊急でデータファイルを追加
ALTER TABLESPACE users
ADD DATAFILE '/oracle/oradata/ORCL/users05.dbf'
SIZE 2G AUTOEXTEND ON NEXT 200M MAXSIZE 10G;
-- 追加後の確認
SELECT file_name, ROUND(bytes/1024/1024) AS size_mb, autoextensible
FROM dba_data_files WHERE tablespace_name = 'USERS';
パターン(2): 新しいディスクにデータファイルを分散
SQL
-- I/O 分散のため、新しいディスクにデータファイルを追加
ALTER TABLESPACE app_data
ADD DATAFILE '/oracle/disk2/app_data02.dbf'
SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
-- 既存テーブルを新しいファイルに移動
ALTER TABLE orders MOVE TABLESPACE app_data;
-- Oracle が空きのあるデータファイルに自動配置
パターン(3): TEMP 表領域のサイズ不足対処
SQL
-- ORA-01652(TEMP で拡張不可)対処
ALTER TABLESPACE temp
ADD TEMPFILE '/oracle/oradata/ORCL/temp02.dbf'
SIZE 2G AUTOEXTEND ON NEXT 200M MAXSIZE 10G;
パターン(4): 全データファイルの AUTOEXTEND を一括確認
SQL
-- AUTOEXTEND OFF のファイルを検出(容量不足リスク)
SELECT tablespace_name, file_name,
ROUND(bytes/1024/1024) AS size_mb
FROM dba_data_files
WHERE autoextensible = 'NO'
ORDER BY tablespace_name;
-- AUTOEXTEND ON にする一括 SQL を生成
SELECT 'ALTER DATABASE DATAFILE ''' || file_name || ''' AUTOEXTEND ON NEXT 100M MAXSIZE 10G;'
FROM dba_data_files
WHERE autoextensible = 'NO';
よくある質問
Qデータファイルを追加したら DB の再起動は必要ですか?
A不要です。ALTER TABLESPACE ADD DATAFILE は即時反映され、DB の再起動やリスナーの再起動は必要ありません。
Q1 つの表領域に何個までデータファイルを追加できますか?
ASMALLFILE 表領域は最大 1022 個のデータファイルを持てます。BIGFILE 表領域は 1 個のみです。実務では 10〜20 個程度で管理するのが一般的です。
Qデータファイルを縮小するとデータは消えますか?
ARESIZE で縮小してもデータは消えません。ただし、使用中のブロックより小さくすることはできず、ORA-03297 エラーになります。
QTEMP 表領域に DATAFILE を追加しようとしたらエラーになりました
ATEMP 表領域には DATAFILE ではなく TEMPFILE を使います。
ALTER TABLESPACE temp ADD TEMPFILE ... と指定してください。QAUTOEXTEND ON でも ORA-01653 が出ます
AMAXSIZE に達したか、OS のディスク空き容量が不足している可能性があります。MAXSIZE を拡大するか、ディスクの空き容量を確認してください。また、AUTOEXTEND の NEXT が小さすぎると拡張が追いつかない場合もあります。
QASM 環境ではファイル名をどう指定しますか?
AASM ではディスクグループ名を指定します。
ADD DATAFILE '+DATA' SIZE 1G AUTOEXTEND ON のように +ディスクグループ名 で指定すると、ASM がファイル名を自動生成します。まとめ
データファイルの管理操作をまとめます。
| やりたいこと | SQL |
|---|---|
| データファイルを追加 | ALTER TABLESPACE ts ADD DATAFILE ‘/path/file.dbf’ SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G |
| TEMPFILE を追加 | ALTER TABLESPACE temp ADD TEMPFILE ‘/path/temp.dbf’ SIZE 1G AUTOEXTEND ON |
| 既存ファイルを拡大 | ALTER DATABASE DATAFILE ‘/path/file.dbf’ RESIZE 2G |
| AUTOEXTEND を有効化 | ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND ON NEXT 100M MAXSIZE 10G |
| AUTOEXTEND を無効化 | ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND OFF |
| データファイルを移動(12c+) | ALTER DATABASE MOVE DATAFILE ‘/old/file.dbf’ TO ‘/new/file.dbf’ |
| 空のデータファイルを削除 | ALTER TABLESPACE ts DROP DATAFILE ‘/path/file.dbf’ |
| 全データファイルを確認 | SELECT file_name, bytes, autoextensible FROM dba_data_files |
表領域の管理全般は「表領域(Tablespace)完全ガイド」、AUTOEXTEND の詳細は「AUTOEXTEND 設定を確認・変更する方法」、使用状況の確認は「表領域の使用状況を確認する SQL まとめ」も併せて参照してください。

