【Oracle】表領域(Tablespace)完全ガイド|種類・CREATE・ALTER・DROP・DBA_TABLESPACESまで解説

【Oracle】表領域(Tablespace)完全ガイド|種類・CREATE・ALTER・DROP・DBA_TABLESPACESまで解説 Oracle

Oracle データベースでオブジェクト(テーブル・インデックスなど)を作成するとき、実際のデータは表領域(Tablespace)に格納されます。適切な表領域を設計しておかないと、すべてのデータが SYSTEM 表領域に積み上がり、システム表領域が肥大化してデータベース全体が停止するリスクがあります。

表領域はデータベース管理の基盤ですが、「BIGFILE と SMALLFILE の違い」「LOCAL 管理と DICTIONARY 管理」「ONLINE/OFFLINE 切り替えの意味」など、理解すべき概念が多い分野でもあります。

この記事では、表領域の種類からCREATE TABLESPACE の全構文、ALTER TABLESPACE による運用操作、DROP TABLESPACE の安全な手順、DBA_TABLESPACES / DBA_DATA_FILES の各列の意味まで体系的に解説します。

この記事でわかること
・表領域の種類(PERMANENT / TEMP / UNDO / BIGFILE / SMALLFILE)と使い分け
・CREATE TABLESPACE の全構文と重要オプション(EXTENT MANAGEMENT・SEGMENT SPACE MANAGEMENT)
・TEMP 表領域・UNDO 表領域の作成方法
・ALTER TABLESPACE:ONLINE/OFFLINE 切り替え・READ ONLY 設定・名前変更
・DROP TABLESPACE の安全な手順と必要なオプション
・DBA_TABLESPACES / DBA_DATA_FILES の各列の意味と確認 SQL
・表領域作成・変更に必要な権限
スポンサーリンク

表領域の種類と役割

Oracle の表領域には、格納するデータの性質に応じていくつかの種類があります。

種類 用途 主なデフォルト表領域名
PERMANENT(永続) テーブル・インデックスなどの恒久データを格納する通常の表領域 USERS, EXAMPLE など任意
TEMPORARY(一時) ソート・ハッシュ結合などの一時作業領域。セッション終了後に解放 TEMP
UNDO トランザクションのロールバック情報・読み取り一貫性のための UNDO データを格納 UNDOTBS1
SYSTEM データディクショナリ(表・列・制約の定義情報)を格納。DBA が管理 SYSTEM
SYSAUX AWR・Statspack など Oracle 内部ツールのデータを格納。SYSTEM の補助 SYSAUX

SMALLFILE 表領域と BIGFILE 表領域

種類 特徴 使いどころ
SMALLFILE(デフォルト) 複数のデータファイルを持てる。1 ファイルの最大サイズは OS 制限(通常 32GB 前後) 汎用。ほとんどのケースで SMALLFILE を使う
BIGFILE 1 つの表領域に 1 つのデータファイルのみ。最大 128TB(8KB ブロック時)。ALTER TABLESPACE でファイル名を意識せずサイズ操作できる 巨大なデータウェアハウスや大規模 LOB 格納
BIGFILE 表領域の注意点
1 表領域 = 1 データファイルの制約があるため、I/O の分散ができません。OLTP システムでは複数データファイルで I/O を分散できる SMALLFILE が一般的です。BIGFILE は主に DWH(データウェアハウス)や ASM(Automatic Storage Management)環境で使われます。

表領域の管理方式:EXTENT MANAGEMENT と SEGMENT SPACE MANAGEMENT

CREATE TABLESPACE 時に指定する 2 つの重要なオプションです。

EXTENT MANAGEMENT(エクステント管理)

設定 説明 推奨
LOCAL(推奨) 各データファイルのビットマップで空き領域を追跡。管理が高速でデータディクショナリ競合なし ◎ Oracle 9i 以降のデフォルト。必ずこちらを使う
DICTIONARY データディクショナリ(SYS.FET$ / UET$ テーブル)で空き領域を管理。旧方式 × Oracle 10g 以降は非推奨。レガシー DB との互換性のみ

SEGMENT SPACE MANAGEMENT(セグメント空間管理)

設定 説明 推奨
AUTO(推奨) Automatic Segment Space Management(ASSM)。ビットマップブロックで空き領域を自動管理。高並列 INSERT に強い ◎ Oracle 9i 以降のデフォルト。OLTP 環境はこちら
MANUAL フリーリストで空き領域を管理。旧方式。高並列環境では競合が起きやすい × レガシー互換目的のみ

表領域の作成:CREATE TABLESPACE

表領域の作成には CREATE TABLESPACE 文を使います。必要な権限は CREATE TABLESPACE システム権限(DBA ロール保有者は自動的に持つ)です。

PERMANENT 表領域の作成

SQL(PERMANENT 表領域:基本的な作成)
-- 最もシンプルな作成(LOCAL管理・AUTO セグメント管理)
CREATE TABLESPACE app_data
    DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf' SIZE 500M
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO;
SQL(PERMANENT 表領域:AUTOEXTEND と MAXSIZE を指定)
CREATE TABLESPACE app_data
    DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf'
        SIZE 500M
        AUTOEXTEND ON NEXT 100M MAXSIZE 10G
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M  -- エクステントサイズを1Mに統一
    SEGMENT SPACE MANAGEMENT AUTO;
AUTOEXTEND の設定について
AUTOEXTEND ON を設定すると、データファイルが満杯になった際に自動拡張します。MAXSIZE UNLIMITED は無制限拡張となりディスク枯渇のリスクがあるため、必ず上限を設定してください。AUTOEXTEND の詳細確認・変更方法は【Oracle】表領域の自動拡張(AUTOEXTEND)設定を確認・変更する方法を参照してください。
SQL(PERMANENT 表領域:複数データファイルで作成)
-- 複数のデータファイルを持つ表領域(I/O分散が目的)
CREATE TABLESPACE app_data
    DATAFILE '/u01/oradata/ORCL/app_data01.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 10G,
             '/u02/oradata/ORCL/app_data02.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 10G
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO;

BIGFILE 表領域の作成

SQL(BIGFILE 表領域の作成)
CREATE BIGFILE TABLESPACE big_data
    DATAFILE '/u01/app/oracle/oradata/ORCL/big_data01.dbf' SIZE 100G
    AUTOEXTEND ON NEXT 10G MAXSIZE 128T
    EXTENT MANAGEMENT LOCAL
    SEGMENT SPACE MANAGEMENT AUTO;

-- BIGFILE はファイル名を指定せずサイズ変更できる
ALTER TABLESPACE big_data RESIZE 200G;

TEMP(一時)表領域の作成

SQL(TEMP 表領域の作成)
-- TEMPORARY キーワードを使い、TEMPFILE でファイルを指定
CREATE TEMPORARY TABLESPACE temp_data
    TEMPFILE '/u01/app/oracle/oradata/ORCL/temp_data01.dbf' SIZE 2G
    AUTOEXTEND ON NEXT 512M MAXSIZE 20G
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

-- 作成後、デフォルト一時表領域として設定
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_data;

UNDO 表領域の作成

SQL(UNDO 表領域の作成と切り替え)
-- UNDO 表領域の作成(UNDO MANAGEMENT=AUTO 環境)
CREATE UNDO TABLESPACE undotbs2
    DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs2.dbf' SIZE 2G
    AUTOEXTEND ON NEXT 512M MAXSIZE 30G;

-- 使用する UNDO 表領域を切り替え
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS2';

表領域の変更:ALTER TABLESPACE

ALTER TABLESPACE で表領域の状態変更・名前変更・データファイルの追加などを行います。

ONLINE / OFFLINE の切り替え

表領域をオフラインにすると、その表領域に格納されているオブジェクトへのアクセスが停止します。データファイルのバックアップや移動時に使います。

SQL(ONLINE / OFFLINE の切り替え)
-- 表領域をオフラインにする
ALTER TABLESPACE app_data OFFLINE;

-- 表領域をオンラインに戻す
ALTER TABLESPACE app_data ONLINE;

-- IMMEDIATE: チェックポイントなしで即時オフライン(メディア障害時)
-- 通常は NORMAL(デフォルト)を使う
ALTER TABLESPACE app_data OFFLINE IMMEDIATE;
OFFLINE オプション 動作 使いどころ
NORMAL(デフォルト) すべてのデータファイルのチェックポイントを実施してからオフライン 通常のメンテナンス
TEMPORARY チェックポイントできないファイルはスキップ 一部のファイルに問題がある場合
IMMEDIATE チェックポイントなしで即時オフライン メディア障害発生時のみ。オンライン化に RECOVER が必要

READ ONLY / READ WRITE の切り替え

READ ONLY に設定すると SELECT のみ許可され、DML(INSERT/UPDATE/DELETE)が禁止されます。アーカイブデータや参照専用テーブルの保護に使います。

SQL(READ ONLY / READ WRITE の切り替え)
-- READ ONLY に変更(DML を禁止する)
ALTER TABLESPACE archive_data READ ONLY;

-- READ WRITE に戻す
ALTER TABLESPACE archive_data READ WRITE;
READ ONLY 表領域の用途
・過去データのアーカイブ(変更されないことを保証)
・バックアップの最適化(READ ONLY 表領域はバックアップ後の再バックアップ不要)
・マスタデータや静的参照テーブルを誤更新から保護
READ ONLY 設定中でも既存トランザクションのロールバックは動作します。

表領域の名前変更(Oracle 11g 以降)

SQL(表領域の名前変更)
-- 表領域の名前を変更(11g 以降)
ALTER TABLESPACE app_data RENAME TO app_data_new;

-- 変更後の確認
SELECT tablespace_name, status FROM dba_tablespaces
WHERE  tablespace_name = 'APP_DATA_NEW';
名前変更の制限
以下の表領域は名前変更できません。
・SYSTEM 表領域
・SYSAUX 表領域
・現在使用中の UNDO 表領域
・現在デフォルト一時表領域として設定されている TEMP 表領域

データファイルの追加

SQL(データファイルの追加)
-- 既存の表領域にデータファイルを追加して容量を拡張
ALTER TABLESPACE app_data
    ADD DATAFILE '/u02/oradata/ORCL/app_data02.dbf'
    SIZE 1G AUTOEXTEND ON NEXT 256M MAXSIZE 5G;
データファイル追加の詳細(既存ファイルのリサイズ・RESIZE・移動手順)は【Oracle】データファイルを追加する方法完全解説を参照してください。

ホットバックアップ用の設定(BEGIN / END BACKUP)

SQL(ホットバックアップ用の BEGIN/END BACKUP)
-- ユーザー管理バックアップ(ARCHIVELOG モード環境)でのホットバックアップ
-- バックアップ開始前に表領域を「バックアップモード」に設定
ALTER TABLESPACE app_data BEGIN BACKUP;

-- ここで OS コマンドでデータファイルをコピーする
-- (例)cp /u01/oradata/ORCL/app_data01.dbf /backup/app_data01.dbf

-- バックアップ完了後に解除
ALTER TABLESPACE app_data END BACKUP;
BEGIN BACKUP を設定したまま忘れると REDO ログが大量生成されます。現代では RMAN(Recovery Manager)を使ったバックアップが推奨されており、BEGIN/END BACKUP を手動で行う機会は減っています。RMAN を使えば BEGIN/END BACKUP の管理は自動化されます。

表領域の削除:DROP TABLESPACE

表領域を削除するには DROP TABLESPACE 文を使います。削除前にオブジェクトが空になっているかを必ず確認してください。

SQL(DROP TABLESPACE のパターン別構文)
-- パターン①: 表領域のみ削除(データファイルは OS 上に残る)
DROP TABLESPACE app_data;
-- → 注意: 表領域にオブジェクトが残っていると ORA-01549 エラー

-- パターン②: 表領域とデータファイルをまとめて削除(最も一般的)
DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES;

-- パターン③: 他表領域の参照制約(FK)も含めて削除
DROP TABLESPACE app_data INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
オプション 意味
(オプションなし) 表領域のメタデータのみ削除。OS 上のデータファイルは残る。表領域が空でないとエラー(ORA-01549)
INCLUDING CONTENTS 表領域内のすべてのオブジェクト(セグメント)も削除
AND DATAFILES INCLUDING CONTENTS と併用。OS 上のデータファイルも削除(OSへの rm 相当)
CASCADE CONSTRAINTS 他表領域のテーブルからこの表領域のテーブルへの参照整合性制約も削除
DROP TABLESPACE は取り消し不可の操作です
・SYSTEM・SYSAUX・現在使用中の UNDO・デフォルト TEMP 表領域は削除できません
・AND DATAFILES を指定すると OS 上のファイルも削除されます。バックアップを確認してから実行してください
・本番環境での DROP 前には必ず DBA_TABLES / DBA_INDEXES で格納オブジェクトを確認してください
SQL(DROP TABLESPACE 前の格納オブジェクト確認)
-- 対象表領域に存在するオブジェクトを確認してから削除する
SELECT owner, segment_name, segment_type, bytes / 1024 / 1024 AS mb
FROM   dba_segments
WHERE  tablespace_name = 'APP_DATA'
ORDER  BY bytes DESC;

-- 0件であることを確認してから DROP TABLESPACE を実行する

表領域の確認:DBA_TABLESPACES / DBA_DATA_FILES

DBA_TABLESPACES の主な列

DBA_TABLESPACES ビューには表領域のメタデータが格納されています。

列名 データ型 説明
TABLESPACE_NAME VARCHAR2(30) 表領域名
BLOCK_SIZE NUMBER ブロックサイズ(バイト)。通常 8192(8KB)
INITIAL_EXTENT NUMBER 初期エクステントサイズ(バイト)
MAX_EXTENTS NUMBER 最大エクステント数
EXTENT_MANAGEMENT VARCHAR2(10) エクステント管理方式(LOCAL / DICTIONARY)
SEGMENT_SPACE_MANAGEMENT VARCHAR2(6) セグメント空間管理(AUTO / MANUAL)
STATUS VARCHAR2(9) 状態(ONLINE / OFFLINE / READ ONLY)
CONTENTS VARCHAR2(9) 種類(PERMANENT / TEMPORARY / UNDO)
LOGGING VARCHAR2(9) ログ記録方式(LOGGING / NOLOGGING)
BIGFILE VARCHAR2(3) BIGFILE 表領域かどうか(YES / NO)
ENCRYPTED VARCHAR2(3) 透過的データ暗号化(TDE)が有効か(YES / NO)
COMPRESS_FOR VARCHAR2(30) 圧縮方式(NULL / BASIC / OLTP / QUERY HIGH など)
SQL(DBA_TABLESPACES で全表領域の状態を確認)
SELECT tablespace_name,
       contents,
       status,
       extent_management,
       segment_space_management,
       bigfile,
       logging
FROM   dba_tablespaces
ORDER  BY tablespace_name;

DBA_DATA_FILES の主な列

DBA_DATA_FILES には PERMANENT・UNDO 表領域のデータファイル情報が格納されています。一時表領域のファイルは DBA_TEMP_FILES で確認します。

列名 データ型 説明
FILE_NAME VARCHAR2(513) データファイルのフルパス
FILE_ID NUMBER ファイルの一意な ID
TABLESPACE_NAME VARCHAR2(30) 所属する表領域名
BYTES NUMBER 現在のファイルサイズ(バイト)
MAXBYTES NUMBER MAXSIZE 設定値(AUTOEXTEND OFF の場合は 0)
AUTOEXTENSIBLE VARCHAR2(3) 自動拡張が有効か(YES / NO)
INCREMENT_BY NUMBER 自動拡張時の増分(ブロック数)
STATUS VARCHAR2(9) ファイルの状態(AVAILABLE / INVALID)
ONLINE_STATUS VARCHAR2(7) オンライン状態(ONLINE / OFFLINE / SYSOFF / SYSTEM / RECOVER)
SQL(DBA_DATA_FILES で各表領域のデータファイルを確認)
SELECT tablespace_name,
       file_name,
       ROUND(bytes / 1024 / 1024, 0)     AS size_mb,
       ROUND(maxbytes / 1024 / 1024, 0)  AS maxsize_mb,
       autoextensible,
       status,
       online_status
FROM   dba_data_files
ORDER  BY tablespace_name, file_id;
SQL(TEMP 表領域のファイルを確認:DBA_TEMP_FILES)
-- 一時ファイルは DBA_TEMP_FILES で確認
SELECT tablespace_name,
       file_name,
       ROUND(bytes / 1024 / 1024, 0)     AS size_mb,
       ROUND(maxbytes / 1024 / 1024, 0)  AS maxsize_mb,
       autoextensible
FROM   dba_temp_files
ORDER  BY tablespace_name;
表領域ごとの使用率・空き容量の確認(DBA_FREE_SPACE を使った割合計算)については
【Oracle】表領域の使用状況を確認するSQLまとめおよび【Oracle】表領域の空き容量を調べる方法を参照してください。

必要な権限

操作 必要な権限
CREATE TABLESPACE CREATE TABLESPACE システム権限(DBA ロールに含まれる)
DROP TABLESPACE DROP TABLESPACE システム権限(DBA ロールに含まれる)
ALTER TABLESPACE ALTER TABLESPACE システム権限(DBA ロールに含まれる)
DBA_TABLESPACES を参照 SELECT ANY DICTIONARY または SELECT_CATALOG_ROLE
DBA_DATA_FILES を参照 SELECT ANY DICTIONARY または SELECT_CATALOG_ROLE
ユーザーへの権限付与・確認方法の詳細は【Oracle】ユーザ権限を確認する方法完全ガイドを参照してください。

よくある質問

表領域のデータファイルを別のディスクに移動するにはどうすればよいですか?
オフラインでの移動と Oracle Managed Files(OMF)を使った方法があります。手順は ① ALTER TABLESPACE offline → ② OS コマンドでファイルをコピー → ③ ALTER TABLESPACE RENAME DATAFILE で Oracle 側のパスを更新 → ④ ALTER TABLESPACE online です。12c 以降はオンラインのままデータファイルを移動できます(ALTER DATABASE MOVE DATAFILE)。
CREATE TABLESPACE で EXTENT MANAGEMENT LOCAL と DICTIONARY はどちらを使うべきですか?
必ず LOCAL を選んでください。DICTIONARY 管理は Oracle 10g 以降で非推奨となっています。LOCAL 管理の方がデータディクショナリへの競合が発生せず、パフォーマンスが優れています。現代の Oracle データベースでは LOCAL がデフォルト値のため、明示的な指定は省略しても問題ありません。
SYSTEM 表領域や SYSAUX 表領域にユーザーのオブジェクトを作成してもよいですか?
強くお勧めしません。SYSTEM 表領域はデータディクショナリを格納しており、ユーザーデータで肥大化するとデータベース全体が影響を受けます。ユーザーのデータは専用の PERMANENT 表領域を作成して格納し、CREATE USER 時に DEFAULT TABLESPACE を指定してください。詳細は【Oracle】表領域にユーザーを割り当てる方法を参照してください。
DROP TABLESPACE を実行したらデータファイルが OS に残っていました。削除できますか?
AND DATAFILES オプションをつけ忘れた場合、データファイルは OS 上に残ります。再利用や別のデータベースへのアタッチが不要であれば、OS コマンド(rm / del)で手動削除できます。削除前に当該ファイルが Oracle から参照されていないことを V$DATAFILE で確認してください。
TEMP 表領域が肥大化して縮小したい場合はどうすればよいですか?
TEMP 表領域のサイズ縮小は通常の RESIZE では困難で、再作成(DROP + CREATE)または SHRINK SPACE が必要です。TEMP 表領域の肥大化対応については【Oracle】TEMP表領域の肥大化の原因とクリーンアップ方法で詳しく解説しています。
表領域の圧縮(COMPRESS)を有効にするにはどうすればよいですか?
CREATE TABLESPACE 時に COMPRESS を指定するか、ALTER TABLESPACE で既存の表領域に対してデフォルト圧縮を設定できます。圧縮には BASIC(DML 不向き)・OLTP 圧縮・ARCHIVE 圧縮などの種類があります。詳細は Oracle の圧縮機能を専門に扱った記事を参照してください。

まとめ

Oracle 表領域の操作要点をまとめます。

やりたいこと 方法・ポイント
PERMANENT 表領域を作成する CREATE TABLESPACE … DATAFILE … EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
TEMP 表領域を作成する CREATE TEMPORARY TABLESPACE … TEMPFILE … で作成し ALTER DATABASE DEFAULT TEMPORARY TABLESPACE で設定
UNDO 表領域を作成・切り替える CREATE UNDO TABLESPACE → ALTER SYSTEM SET undo_tablespace
BIGFILE 表領域を使う CREATE BIGFILE TABLESPACE。1ファイル最大 128TB だが I/O 分散不可のため DWH/ASM 向き
表領域をオフラインにする ALTER TABLESPACE … OFFLINE(通常は NORMAL オプション)
表領域を READ ONLY にする ALTER TABLESPACE … READ ONLY でアーカイブデータを保護
表領域の名前を変更する ALTER TABLESPACE … RENAME TO …(11g 以降、SYSTEM/SYSAUX 以外)
表領域を安全に削除する DROP TABLESPACE … INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS
表領域の状態を確認する DBA_TABLESPACES(STATUS・CONTENTS・EXTENT_MANAGEMENT 等)
データファイルの場所を確認する DBA_DATA_FILES(PERMANENT・UNDO)/ DBA_TEMP_FILES(TEMP)

表領域の空き容量・使用率の確認は【Oracle】表領域の使用状況を確認するSQLまとめ、AUTOEXTEND の設定変更は【Oracle】表領域の自動拡張(AUTOEXTEND)設定を確認・変更する方法、ユーザーへのデフォルト表領域割り当ては【Oracle】表領域にユーザーを割り当てる方法を参照してください。