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 格納 |
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 表領域の作成
-- 最もシンプルな作成(LOCAL管理・AUTO セグメント管理)
CREATE TABLESPACE app_data
DATAFILE '/u01/app/oracle/oradata/ORCL/app_data01.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
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 ON を設定すると、データファイルが満杯になった際に自動拡張します。MAXSIZE UNLIMITED は無制限拡張となりディスク枯渇のリスクがあるため、必ず上限を設定してください。AUTOEXTEND の詳細確認・変更方法は【Oracle】表領域の自動拡張(AUTOEXTEND)設定を確認・変更する方法を参照してください。
-- 複数のデータファイルを持つ表領域(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 表領域の作成
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(一時)表領域の作成
-- 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 表領域の作成
-- 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 の切り替え
表領域をオフラインにすると、その表領域に格納されているオブジェクトへのアクセスが停止します。データファイルのバックアップや移動時に使います。
-- 表領域をオフラインにする 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)が禁止されます。アーカイブデータや参照専用テーブルの保護に使います。
-- READ ONLY に変更(DML を禁止する) ALTER TABLESPACE archive_data READ ONLY; -- READ WRITE に戻す ALTER TABLESPACE archive_data READ WRITE;
・過去データのアーカイブ(変更されないことを保証)
・バックアップの最適化(READ ONLY 表領域はバックアップ後の再バックアップ不要)
・マスタデータや静的参照テーブルを誤更新から保護
READ ONLY 設定中でも既存トランザクションのロールバックは動作します。
表領域の名前変更(Oracle 11g 以降)
-- 表領域の名前を変更(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 表領域
データファイルの追加
-- 既存の表領域にデータファイルを追加して容量を拡張
ALTER TABLESPACE app_data
ADD DATAFILE '/u02/oradata/ORCL/app_data02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 256M MAXSIZE 5G;
ホットバックアップ用の設定(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;
表領域の削除:DROP TABLESPACE
表領域を削除するには 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 | 他表領域のテーブルからこの表領域のテーブルへの参照整合性制約も削除 |
・SYSTEM・SYSAUX・現在使用中の UNDO・デフォルト TEMP 表領域は削除できません
・AND DATAFILES を指定すると OS 上のファイルも削除されます。バックアップを確認してから実行してください
・本番環境での DROP 前には必ず DBA_TABLES / DBA_INDEXES で格納オブジェクトを確認してください
-- 対象表領域に存在するオブジェクトを確認してから削除する 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 など) |
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) |
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;
-- 一時ファイルは 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;
【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 表領域の操作要点をまとめます。
| やりたいこと | 方法・ポイント |
|---|---|
| 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】表領域にユーザーを割り当てる方法を参照してください。
