【Oracle】データファイルを追加・変更する方法|ALTER TABLESPACE ADD DATAFILE・リサイズ・移動・削除・TEMP ファイルまで解説

【Oracle】データファイルを追加・変更する方法|ALTER TABLESPACE ADD DATAFILE・リサイズ・移動・削除・TEMP ファイルまで解説 Oracle

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 の緊急対処
スポンサーリンク

データファイルを追加する(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 の詳しい設定方法は「表領域の自動拡張(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 してください。
操作 可否 制限
拡大(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 の手順が必要です。

データファイルの削除

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 つだけ残ったデータファイルは削除できません。

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 まとめ」も併せて参照してください。