【完全ガイド】Oracle Tablespace 管理|USERS/SYSTEM 拡張・AUTOEXTEND・使用率確認まで徹底解説
- 作成日 2026.07.17
- git
Oracle DBA・開発者が日常的に直面する運用課題:
ORA-01653: unable to extend table SCOTT.EMP by 128 in tablespace USERS
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
ORA-01631: max # extents 505 reached
tablespace の空き容量不足が原因のエラー。適切なtablespace 管理ができていないと、深夜に呼び出されて緊急対応、というシナリオになりがちです。
現場では:
- USERS tablespace がいっぱいで INSERT できない
- SYSAUX が肥大化し続けて怖い
- SYSTEM tablespace の空きがゼロ近く(超緊急)
- TEMP が足りず大きい SORT でエラー
- UNDO の管理が謎
- AUTOEXTEND ON でも突然エラー(MAXSIZE 到達)
- BIGFILE vs SMALLFILE どっち?
- どのくらいのサイズに設定するべき?
Oracle の tablespace 管理は、単なる**「容量を増やす」ではなく、DB のパフォーマンス・可用性・運用コストのバランスを取る戦略的な作業。適切に設計すれば、無停止でTB級までスケールできますが、間違うと復旧困難な障害**を招きます。
さらに、Oracle 12c 以降の Multitenant (CDB/PDB) アーキテクチャや、Oracle Cloud (Autonomous DB)、AWS RDS Oracle など、環境ごとの制約もあり、管理手法を使い分ける必要があります。
本記事では、Oracle Tablespace 管理 の完全な使い方を、リファレンスとして実用的に整理します。5つの主要 tablespace の役割、使用状況確認クエリ、拡張3手法(AUTOEXTEND・ADD DATAFILE・RESIZE)、データファイル操作、TEMP/UNDO の特殊管理、BIGFILE vs SMALLFILE、実践シナリオ、ORA-01653/01652/01631 トラブル対処、予防のベストプラクティス、FAQまで完全網羅。この1本で tablespace を業務レベルで確実に管理できるようになります。
- 1. 結論:まず現状把握と拡張3手法
- 2. まず理解する:Tablespace の仕組み
- 3. 使用状況確認クエリ
- 4. 拡張手法①:AUTOEXTEND(自動拡張)
- 5. 拡張手法②:ADD DATAFILE(新規追加)
- 6. 拡張手法③:RESIZE(サイズ変更)
- 7. データファイル操作
- 8. TEMP tablespace の管理
- 9. UNDO tablespace の管理
- 10. BIGFILE vs SMALLFILE
- 11. 実践シナリオ
- 12. トラブルシューティング
- 13. 予防のベストプラクティス
- 14. よくある質問(FAQ)
- 14.1. Q1. AUTOEXTEND ON の危険性
- 14.2. Q2. tablespace を暗号化したい
- 14.3. Q3. Multitenant (CDB/PDB) での違い
- 14.4. Q4. Autonomous DB での制約
- 14.5. Q5. AWS RDS Oracle
- 14.6. Q6. tablespace のバックアップ単位
- 14.7. Q7. READ ONLY tablespace のメリット
- 14.8. Q8. tablespace のリネーム
- 14.9. Q9. 複数 datafile 追加の順序
- 14.10. Q10. Rails migration での tablespace 指定
- 14.11. Q11. Docker Oracle の初期 tablespace
- 14.12. Q12. インデックスは別 tablespace が良い?
- 14.13. Oracle 公式
- 15. まとめ
結論:まず現状把握と拡張3手法
時間がない方向けに、最短の対処を先に示します。
使用率確認(一発)
SELECT
df.tablespace_name,
ROUND(df.total_size/1024/1024, 2) AS "SIZE_MB",
ROUND(NVL(fs.free_size, 0)/1024/1024, 2) AS "FREE_MB",
ROUND((df.total_size - NVL(fs.free_size, 0))/df.total_size * 100, 2) AS "USED_PCT"
FROM
(SELECT tablespace_name, SUM(bytes) total_size
FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN
(SELECT tablespace_name, SUM(bytes) free_size
FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY 4 DESC;
拡張3手法
① AUTOEXTEND 有効化(既存 datafile):
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
② ADD DATAFILE(新規追加):
ALTER TABLESPACE users
ADD DATAFILE '/u01/oradata/orcl/users02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
③ RESIZE(サイズ変更):
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
RESIZE 5G;
5大 tablespace の役割
| 名前 | 役割 | 削除可 |
|---|---|---|
| SYSTEM | データディクショナリ | ❌ |
| SYSAUX | Oracle 内部機能 | ❌ |
| USERS | 一般ユーザーデータ(デフォルト) | ⚠️ |
| TEMP | ソート・一時領域 | ✅ 別作成可 |
| UNDO (UNDOTBS1) | ロールバック情報 | ✅ 別作成可 |
詳細は以下で解説します。
まず理解する:Tablespace の仕組み
論理と物理の関係
[論理層]
Tablespace(論理コンテナ)
↓ 1対多
Datafile(物理ファイル)
↓
[物理層]
実際の OS ファイル (.dbf)
Tablespace は論理的な入れ物、Datafile は物理的な OS ファイル。1つの tablespace に複数の datafile を割り当て可能。
主要 tablespace の役割
SYSTEM tablespace
Oracle DB の心臓部。データディクショナリ(システムカタログ)を保持:
DBA_TABLES,USER_OBJECTSなどのメタデータ- パッケージ・プロシージャ定義
- ユーザー情報
制約:
- 削除不可
- 名前変更不可
- オフライン不可
- 満杯になると DB 停止
SYSAUX tablespace
Oracle 10g で登場。SYSTEM の補助として、Oracle 内部機能のデータを保存:
- AWR(自動ワークロードリポジトリ)
- Optimizer 統計履歴
- SPACE Advisor
- Logical Standby
- OEM Repository
特徴:
- 削除不可
- 肥大化しやすい(AWR/統計)
- 定期的なメンテナンス推奨
USERS tablespace
デフォルトのユーザーデータ格納場所:
- ユーザーが CREATE TABLE したときのデフォルト
- アプリケーションデータの初期配置
特徴:
- 削除可能(別デフォルトを設定すれば)
- 一般的には別 tablespace を使うのが推奨
TEMP tablespace
一時的な作業領域:
- ORDER BY / GROUP BY のソート
- ハッシュ結合の中間結果
- グローバル一時テーブル
- 大きい INDEX 作成
特徴:
- 特殊なファイル形式(TEMPFILE)
- REDO ログに記録されない
- 必要に応じて自動拡張
UNDO tablespace(UNDOTBS1)
トランザクションの取り消し情報:
- ROLLBACK 用
- Read Consistency
- Flashback Query
特徴:
- Oracle が自動管理(AUM)
- 通常1つだけ(RAC は各インスタンス)
UNDO_RETENTIONで保持期間制御
使用状況確認クエリ
全 tablespace の使用状況
SELECT
df.tablespace_name,
ROUND(df.total_size/1024/1024, 2) AS size_mb,
ROUND(NVL(fs.free_size, 0)/1024/1024, 2) AS free_mb,
ROUND((df.total_size - NVL(fs.free_size, 0))/1024/1024, 2) AS used_mb,
ROUND((df.total_size - NVL(fs.free_size, 0))/df.total_size * 100, 2) AS used_pct,
ROUND(df.max_size/1024/1024, 2) AS max_mb,
ROUND((df.total_size - NVL(fs.free_size, 0))/df.max_size * 100, 2) AS used_max_pct
FROM
(SELECT tablespace_name,
SUM(bytes) total_size,
SUM(DECODE(autoextensible, 'YES', maxbytes, bytes)) max_size
FROM dba_data_files
GROUP BY tablespace_name) df
LEFT JOIN
(SELECT tablespace_name, SUM(bytes) free_size
FROM dba_free_space
GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY used_max_pct DESC;
AUTOEXTEND 込みの最大容量まで考慮した使用率。
DBA_DATA_FILES で datafile 一覧
SELECT
tablespace_name,
file_name,
ROUND(bytes/1024/1024, 2) AS size_mb,
autoextensible,
ROUND(maxbytes/1024/1024, 2) AS max_mb,
ROUND(increment_by*(bytes/blocks)/1024/1024, 2) AS increment_mb,
status
FROM dba_data_files
ORDER BY tablespace_name, file_name;
DBA_TABLESPACES で属性確認
SELECT
tablespace_name,
block_size,
status,
contents,
extent_management,
segment_space_management,
bigfile,
encrypted
FROM dba_tablespaces
ORDER BY tablespace_name;
TEMP の使用状況
SELECT
tablespace_name,
ROUND(SUM(bytes_used)/1024/1024, 2) AS used_mb,
ROUND(SUM(bytes_free)/1024/1024, 2) AS free_mb,
ROUND(SUM(bytes_used)/SUM(bytes_used + bytes_free)*100, 2) AS used_pct
FROM v$temp_space_header
GROUP BY tablespace_name;
UNDO の使用状況
SELECT
tablespace_name,
status,
COUNT(*) AS undo_records,
ROUND(SUM(bytes)/1024/1024, 2) AS size_mb
FROM dba_undo_extents
GROUP BY tablespace_name, status;
現在の UNDO 保持期間
SELECT name, value FROM v$parameter
WHERE name IN ('undo_management', 'undo_tablespace', 'undo_retention');
一気に確認する便利スクリプト
-- 総合ダッシュボード
SELECT
ts.name AS tablespace_name,
ts.contents,
ts.status,
ROUND(df.total/1024/1024, 2) AS size_mb,
ROUND(fs.free/1024/1024, 2) AS free_mb,
ROUND((df.total - fs.free)/df.total * 100, 2) AS used_pct
FROM v$tablespace ts
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files GROUP BY tablespace_name
) df ON ts.name = df.tablespace_name
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space GROUP BY tablespace_name
) fs ON ts.name = fs.tablespace_name
ORDER BY used_pct DESC NULLS LAST;
拡張手法①:AUTOEXTEND(自動拡張)
基本
既存 datafile を自動拡張ONにする方法:
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON
NEXT 100M
MAXSIZE 10G;
- NEXT: 拡張時の増分(100MB ずつ)
- MAXSIZE: 上限(10GB まで)
AUTOEXTEND OFF
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND OFF;
MAXSIZE UNLIMITED
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON
NEXT 512M
MAXSIZE UNLIMITED;
注意: UNLIMITED でも 32GB が上限(SMALLFILE の場合、ブロックサイズによる)。
AUTOEXTEND の確認
SELECT file_name, bytes/1024/1024 size_mb,
autoextensible, maxbytes/1024/1024 max_mb
FROM dba_data_files
WHERE tablespace_name = 'USERS';
メリット
- 深夜の緊急対応不要
- 自動でスケール
- 運用負荷減
デメリット
- 無制限拡張で OS ディスクを食い潰すリスク
- 統計・監視の見落とし
- MAXSIZE 到達で結局エラー
ベストプラクティス
-- 段階的に拡張、明確な上限
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON
NEXT 512M
MAXSIZE 20G;
-- OS のディスク容量も監視
-- Linux で df -h コマンド、iostat 等での監視推奨
Linux のディスク使用量確認方法は、find オプション一覧の記事、iostat 見方の記事、ss コマンドの使い方の記事も参照してください。
拡張手法②:ADD DATAFILE(新規追加)
基本
新しい datafile を tablespace に追加:
ALTER TABLESPACE users
ADD DATAFILE '/u01/oradata/orcl/users02.dbf'
SIZE 1G
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
用途
- 既存 datafile が MAXSIZE 到達
- **1ファイルが 32GB 上限(SMALLFILE)**に近づいた
- ディスク分散したい
複数 datafile の管理
-- 現状確認
SELECT file_name, ROUND(bytes/1024/1024/1024, 2) size_gb
FROM dba_data_files
WHERE tablespace_name = 'USERS';
-- 追加
ALTER TABLESPACE users
ADD DATAFILE '/u02/oradata/orcl/users03.dbf'
SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
別ディスク(/u02)に追加することで I/O 分散の効果も。
ASM 環境
Oracle ASM (Automatic Storage Management) 使用時:
ALTER TABLESPACE users
ADD DATAFILE '+DATA'
SIZE 10G
AUTOEXTEND ON NEXT 1G MAXSIZE 32767M;
+DATA は ASM ディスクグループ名。Oracle が自動でファイル配置。
datafile 削除
-- 空の datafile 削除
ALTER TABLESPACE users
DROP DATAFILE '/u01/oradata/orcl/users03.dbf';
注意: データを含む datafile は削除不可。事前にデータ移動が必要。
拡張手法③:RESIZE(サイズ変更)
拡張
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
RESIZE 5G;
既存 datafile を明示的にリサイズ。AUTOEXTEND とは別に強制的にサイズ変更。
縮小(未使用領域の解放)
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
RESIZE 500M;
注意: 使用中データの範囲までしか縮小できない。
縮小可能な最小サイズを確認
SELECT file_id, file_name,
CEIL((NVL(hwm, 1) * (blocks/bytes))/1024/1024) AS smallest_mb,
ROUND(bytes/1024/1024, 2) AS current_mb
FROM dba_data_files df
LEFT JOIN (
SELECT file_id, MAX(block_id + blocks - 1) hwm
FROM dba_extents
GROUP BY file_id
) fx ON df.file_id = fx.file_id
WHERE tablespace_name = 'USERS';
HWM(High Water Mark) 以下には縮小できない。
縮小のリスク
縮小コマンド自体は破壊的ではないが、バックアップは必須。
データファイル操作
RENAME(名前変更)
DB を MOUNT or datafile を OFFLINE 状態で:
-- 1. tablespace オフライン
ALTER TABLESPACE users OFFLINE;
-- 2. OS ファイル移動
-- $ mv /u01/oradata/orcl/users01.dbf /u02/oradata/orcl/users01.dbf
-- 3. Oracle に反映
ALTER DATABASE RENAME FILE
'/u01/oradata/orcl/users01.dbf'
TO '/u02/oradata/orcl/users01.dbf';
-- 4. オンライン化
ALTER TABLESPACE users ONLINE;
OFFLINE / ONLINE
-- 単一 datafile
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf' OFFLINE;
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf' ONLINE;
-- tablespace 全体
ALTER TABLESPACE users OFFLINE;
ALTER TABLESPACE users ONLINE;
READ ONLY モード
変更されないデータ(履歴データ、アーカイブ):
ALTER TABLESPACE archive_2023 READ ONLY;
-- 元に戻す
ALTER TABLESPACE archive_2023 READ WRITE;
メリット:
- バックアップ対象から除外可能
- 誤って変更されない
TEMP tablespace の管理
TEMP の作成
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/u01/oradata/orcl/temp02.dbf'
SIZE 5G
AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
注意: TEMP は TEMPFILE を使う(DATAFILE ではない)。
デフォルト TEMP の設定
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
古い TEMP の削除
DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
TEMP に TEMPFILE 追加
ALTER TABLESPACE temp
ADD TEMPFILE '/u01/oradata/orcl/temp02.dbf'
SIZE 5G AUTOEXTEND ON MAXSIZE 10G;
TEMP のユーザー変更
-- 全ユーザーを新 TEMP に変更
BEGIN
FOR u IN (SELECT username FROM dba_users WHERE temporary_tablespace = 'TEMP') LOOP
EXECUTE IMMEDIATE 'ALTER USER ' || u.username || ' TEMPORARY TABLESPACE temp2';
END LOOP;
END;
/
TEMP 縮小(12c+)
ALTER TABLESPACE temp SHRINK SPACE KEEP 1G;
TEMP 使用量の詳細
SELECT
s.username, s.osuser, s.sid,
s.serial#, s.status,
u.tablespace,
ROUND(u.blocks*p.value/1024/1024, 2) AS used_mb
FROM v$sort_usage u
JOIN v$session s ON u.session_addr = s.saddr
JOIN v$parameter p ON p.name = 'db_block_size'
ORDER BY used_mb DESC;
大きい SORT を実行中のセッションを特定。
UNDO tablespace の管理
UNDO 管理モード
-- 現在の設定
SELECT name, value FROM v$parameter
WHERE name LIKE 'undo%';
-- 自動管理(推奨)
ALTER SYSTEM SET undo_management = 'AUTO' SCOPE = SPFILE;
UNDO の切り替え
新しい UNDO tablespace 作成:
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/orcl/undotbs02.dbf'
SIZE 5G AUTOEXTEND ON;
-- 切り替え
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS2';
-- 古いのを削除
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;
UNDO_RETENTION(保持期間)
-- 現在
SHOW PARAMETER undo_retention;
-- 変更(秒単位)
ALTER SYSTEM SET undo_retention = 3600;
Flashback Query で参照する時間を延ばしたい場合に増やす。
UNDO_RETENTION GUARANTEE
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
必ず保持する設定(他のトランザクションが待つ可能性あり)。
BIGFILE vs SMALLFILE
SMALLFILE tablespace(デフォルト)
- 複数の datafile を持てる
- 1 datafile = 最大 32GB(8KB ブロック時)
- 柔軟だが管理が複雑
BIGFILE tablespace(Oracle 10g+)
- 単一の datafile のみ
- 最大 32TB(8KB ブロック時)
- 管理がシンプル
- VLDB(Very Large DB)向け
BIGFILE 作成
CREATE BIGFILE TABLESPACE big_data
DATAFILE '/u01/oradata/orcl/big_data01.dbf'
SIZE 10G AUTOEXTEND ON MAXSIZE 32T;
BIGFILE の RESIZE
-- BIGFILE は ADD DATAFILE 不可、代わりに RESIZE
ALTER TABLESPACE big_data
RESIZE 50G;
-- または AUTOEXTEND
ALTER TABLESPACE big_data
AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
ALTER TABLESPACE で直接操作(DATAFILE 指定不要)。
使い分け
| 用途 | 推奨 |
|---|---|
| 通常業務 | SMALLFILE |
| VLDB / DWH | BIGFILE |
| ASM 環境 | BIGFILE 相性良い |
| バックアップ細分化 | SMALLFILE |
実践シナリオ
シナリオ1:ORA-01653 の緊急対応
ORA-01653: unable to extend table SCOTT.EMP by 128 in tablespace USERS
手順:
-- 1. 現状把握
SELECT tablespace_name, file_name,
ROUND(bytes/1024/1024, 2) size_mb,
autoextensible,
ROUND(maxbytes/1024/1024, 2) max_mb
FROM dba_data_files WHERE tablespace_name = 'USERS';
-- 2. 選択肢A: AUTOEXTEND 有効化
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
-- 選択肢B: MAXSIZE 引き上げ
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf'
AUTOEXTEND ON NEXT 500M MAXSIZE 50G;
-- 選択肢C: 新規 datafile 追加
ALTER TABLESPACE users
ADD DATAFILE '/u02/oradata/orcl/users02.dbf'
SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
シナリオ2:SYSAUX 肥大化対応
-- SYSAUX の内訳
SELECT occupant_name, occupant_desc,
ROUND(space_usage_kbytes/1024, 2) AS used_mb
FROM v$sysaux_occupants
ORDER BY space_usage_kbytes DESC;
-- AWR が大きい場合、保持期間短縮
SELECT * FROM dba_hist_wr_control;
BEGIN
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 7 * 24 * 60, -- 7日間(分)
interval => 60 -- 1時間ごと
);
END;
/
-- Optimizer 統計履歴短縮
EXEC DBMS_STATS.ALTER_STATS_HISTORY_RETENTION(7);
シナリオ3:SYSTEM tablespace 逼迫(緊急)
-- SYSTEM の空き確認
SELECT * FROM dba_free_space WHERE tablespace_name = 'SYSTEM';
-- 拡張(DBAとしての最終手段)
ALTER TABLESPACE system
ADD DATAFILE '/u01/oradata/orcl/system02.dbf'
SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
SYSTEM が満杯は DB 停止級。優先対応。
シナリオ4:TEMP 不足でソート失敗
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
-- TEMP の使用状況
SELECT * FROM v$temp_space_header;
-- TEMPFILE 追加
ALTER TABLESPACE temp
ADD TEMPFILE '/u02/oradata/orcl/temp02.dbf'
SIZE 5G AUTOEXTEND ON MAXSIZE 20G;
-- 既存 TEMPFILE の拡張
ALTER DATABASE TEMPFILE '/u01/oradata/orcl/temp01.dbf'
RESIZE 10G;
シナリオ5:UNDO 不足
ORA-30036: unable to extend segment by 128 in undo tablespace 'UNDOTBS1'
-- UNDO の状態
SELECT tablespace_name, status, COUNT(*)
FROM dba_undo_extents
GROUP BY tablespace_name, status;
-- UNDO datafile 拡張
ALTER DATABASE DATAFILE '/u01/oradata/orcl/undotbs01.dbf'
AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
-- または新 UNDO tablespace
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/orcl/undotbs02.dbf'
SIZE 10G AUTOEXTEND ON MAXSIZE 30G;
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS2';
シナリオ6:新プロジェクト用 tablespace 作成
-- データ用
CREATE TABLESPACE app_data
DATAFILE '/u01/oradata/orcl/app_data01.dbf'
SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 32G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
-- インデックス用(分離推奨)
CREATE TABLESPACE app_index
DATAFILE '/u02/oradata/orcl/app_index01.dbf'
SIZE 2G AUTOEXTEND ON NEXT 200M MAXSIZE 16G;
-- ユーザーのデフォルトに設定
CREATE USER app_user IDENTIFIED BY password
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data
QUOTA UNLIMITED ON app_index;
シナリオ7:Rails 開発での tablespace 分離
Rails マイグレーションで指定:
# config/database.yml
production:
adapter: oracle_enhanced
database: prod_db
username: app_user
password: password
# デフォルト tablespace は事前に app_data に設定済み
Rails 8 系の詳細は Rails 8 アップグレードガイドの記事、rails db:migrate 使い方の記事、Solid Queue 使い方の記事も参照してください。
シナリオ8:定期監視スクリプト
#!/bin/bash
# tablespace_monitor.sh
sqlplus -s /nolog <<EOF
connect / as sysdba
SET LINESIZE 200
SET PAGESIZE 100
COL tablespace_name FORMAT A20
SELECT tablespace_name,
ROUND((total - free)/total * 100, 2) AS used_pct
FROM (
SELECT df.tablespace_name,
SUM(df.bytes) total,
NVL(SUM(fs.bytes), 0) free
FROM dba_data_files df
LEFT JOIN dba_free_space fs
ON df.tablespace_name = fs.tablespace_name
GROUP BY df.tablespace_name
)
WHERE (total - free)/total > 0.85
ORDER BY 2 DESC;
EXIT;
EOF
cron で定期実行し、閾値超過時にメール通知。
crontab や cron の使い方は crontab 使い方の記事、Linux でプロセスをバックグラウンド実行する方法の記事も参照してください。
シナリオ9:Kamal デプロイと連動
# config/deploy.yml (Kamal)
# デプロイ前にDB容量確認を実行するフック
env:
clear:
DB_MONITOR_THRESHOLD: 85
Kamal デプロイの詳細は Kamal 2 デプロイの記事を参照してください。
シナリオ10:Docker Oracle での tablespace 管理
# コンテナ内で tablespace 拡張
docker exec -it oracle-xe sqlplus / as sysdba <<EOF
ALTER DATABASE DATAFILE '/opt/oracle/oradata/XE/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 5G;
EXIT;
EOF
Docker 関連のトラブル対処は、docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。
トラブルシューティング
ORA-01653: unable to extend table
原因: tablespace の空き容量不足
対処:
-- 拡張3手法のいずれか
ALTER DATABASE DATAFILE '/path/to/file.dbf' AUTOEXTEND ON MAXSIZE 20G;
-- または
ALTER TABLESPACE users ADD DATAFILE '/path/to/file2.dbf' SIZE 5G;
-- または
ALTER DATABASE DATAFILE '/path/to/file.dbf' RESIZE 10G;
ORA-01652: unable to extend temp segment
原因: TEMP tablespace 不足
対処:
ALTER TABLESPACE temp
ADD TEMPFILE '/path/to/temp02.dbf' SIZE 5G AUTOEXTEND ON MAXSIZE 20G;
ORA-01631: max # extents reached
原因: ローカル管理でない古い tablespace で MAX_EXTENTS 到達
対処:
-- storage 変更
ALTER TABLE scott.emp STORAGE (MAXEXTENTS UNLIMITED);
根本的対処: Locally Managed Tablespace に移行推奨。
ORA-01536: space quota exceeded
原因: ユーザーの quota 制限
対処:
-- quota 変更
ALTER USER scott QUOTA UNLIMITED ON users;
-- 現状確認
SELECT * FROM dba_ts_quotas WHERE username = 'SCOTT';
AUTOEXTEND ON でも突然エラー
原因: MAXSIZE 到達 or OS ディスク不足
診断:
SELECT file_name, bytes/1024/1024 size_mb, maxbytes/1024/1024 max_mb
FROM dba_data_files
WHERE tablespace_name = 'USERS';
# OS 側の空き
df -h /u01
Linux でのディスク容量確認方法は、Linux find オプション一覧の記事、Linux diff コマンドの記事、iostat 見方の記事、systemctl vs service の記事等も参照してください。
tablespace 削除できない
原因: 使用中のオブジェクトあり
対処:
-- 中身ごと削除
DROP TABLESPACE users INCLUDING CONTENTS;
-- OS ファイルも削除
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
-- 依存関係あるオブジェクトは cascade
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
RESIZE できない
ORA-03297: file contains used data beyond requested RESIZE value
原因: 縮小サイズ以上のデータあり
対処: 事前に HWM 以下まで空きを作る(テーブル shrink 等)
予防のベストプラクティス
1. 監視の自動化
-- 使用率 85% 超えたら警告
SELECT tablespace_name, used_pct
FROM (...)
WHERE used_pct > 85;
cron や DBMS_SCHEDULER で定期実行。
2. 適切な AUTOEXTEND 設定
-- 良い例
AUTOEXTEND ON NEXT 500M MAXSIZE 32G
-- 悪い例
AUTOEXTEND ON MAXSIZE UNLIMITED -- ディスク食い潰し
AUTOEXTEND OFF -- 手動対応必須
3. tablespace の分離
- データ用:
APP_DATA - インデックス用:
APP_INDEX - 一時作業用:
TEMP - UNDO:
UNDOTBS1
用途別に分離して I/O 分散。
4. Locally Managed Tablespace
CREATE TABLESPACE ...
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
現代の Oracle は LMT + ASSM がデフォルト。
5. BIGFILE の活用
TB 級なら BIGFILE で管理を簡素化。
6. Quota の設定
ALTER USER scott QUOTA 10G ON users;
暴走した user の影響を局所化。
7. 定期的なリクレイム
未使用領域の解放:
-- テーブル shrink
ALTER TABLE emp ENABLE ROW MOVEMENT;
ALTER TABLE emp SHRINK SPACE;
-- datafile 縮小
ALTER DATABASE DATAFILE '...' RESIZE 5G;
8. バックアップ習慣
拡張・縮小前は RMAN バックアップ推奨。
よくある質問(FAQ)
Q1. AUTOEXTEND ON の危険性
- OS ディスク食い潰し
- 気付かないうちに巨大化
MAXSIZE を必ず設定、監視を組む。
Q2. tablespace を暗号化したい
CREATE TABLESPACE secure_data
DATAFILE '...' SIZE 1G
ENCRYPTION USING 'AES256' ENCRYPT;
Transparent Data Encryption (TDE) が必要。
Q3. Multitenant (CDB/PDB) での違い
- CDB$ROOT の SYSTEM/SYSAUX は共通
- 各 PDB は独自の USERS 等
- PDB 単位で管理
Q4. Autonomous DB での制約
Oracle Cloud Autonomous DB では:
- tablespace 作成不可
- Oracle が自動管理
Q5. AWS RDS Oracle
マスターユーザーで一部管理可。SYSTEM/SYSAUX の直接操作は不可。
Q6. tablespace のバックアップ単位
RMAN で tablespace 単位のバックアップ可能:
BACKUP TABLESPACE users;
Q7. READ ONLY tablespace のメリット
- バックアップ対象から除外可能
- 誤操作防止
Q8. tablespace のリネーム
ALTER TABLESPACE old_name RENAME TO new_name;
Oracle 10g+ で可能(SYSTEM/SYSAUX 除く)。
Q9. 複数 datafile 追加の順序
-- 順次追加でOK
ALTER TABLESPACE users ADD DATAFILE '...' SIZE 1G;
ALTER TABLESPACE users ADD DATAFILE '...' SIZE 1G;
書き込みは Oracle が自動的に負荷分散。
Q10. Rails migration での tablespace 指定
create_table :orders, options: 'TABLESPACE app_data' do |t|
# ...
end
Q11. Docker Oracle の初期 tablespace
Oracle XE Docker イメージには基本 tablespace のみ。用途に応じて追加。
Q12. インデックスは別 tablespace が良い?
I/O 分散の観点で推奨。ただし、SSD 環境では効果は薄い。
Oracle 公式
まとめ
Oracle Tablespace 管理 の要点を再整理します。
5つの主要 Tablespace
| 名前 | 役割 | 特徴 |
|---|---|---|
| SYSTEM | データディクショナリ | 削除不可、要注意 |
| SYSAUX | Oracle 内部機能 | 肥大化しやすい |
| USERS | 一般ユーザーデータ | デフォルト |
| TEMP | 一時作業 | TEMPFILE |
| UNDO | ロールバック情報 | AUM 管理 |
使用率確認クエリ(決定版)
SELECT df.tablespace_name,
ROUND(df.total_size/1024/1024, 2) size_mb,
ROUND(NVL(fs.free_size, 0)/1024/1024, 2) free_mb,
ROUND((df.total_size - NVL(fs.free_size, 0))/df.total_size * 100, 2) used_pct
FROM (SELECT tablespace_name, SUM(bytes) total_size
FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN (SELECT tablespace_name, SUM(bytes) free_size
FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY 4 DESC;
拡張3手法
-- ① AUTOEXTEND
ALTER DATABASE DATAFILE '/path/file.dbf'
AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
-- ② ADD DATAFILE
ALTER TABLESPACE users
ADD DATAFILE '/path/file2.dbf'
SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 20G;
-- ③ RESIZE
ALTER DATABASE DATAFILE '/path/file.dbf' RESIZE 10G;
主要ビュー
DBA_TABLESPACES -- tablespace 属性
DBA_DATA_FILES -- データファイル情報
DBA_TEMP_FILES -- TEMPFILE 情報
DBA_FREE_SPACE -- 空き領域
DBA_UNDO_EXTENTS -- UNDO 使用状況
V$TABLESPACE -- 動的な tablespace 情報
V$DATAFILE -- 動的な datafile 情報
V$TEMP_SPACE_HEADER -- TEMP 使用状況
V$SYSAUX_OCCUPANTS -- SYSAUX の内訳
エラー対応表
| エラー | 対処 |
|---|---|
| ORA-01653 | 拡張3手法のいずれか |
| ORA-01652 | TEMPFILE 追加/拡張 |
| ORA-01631 | Locally Managed 化 |
| ORA-01536 | ユーザー quota 変更 |
| ORA-30036 | UNDO 拡張 |
| ORA-03297 | RESIZE の前に shrink |
予防のベストプラクティス
- 監視の自動化(85% 超え警告)
- AUTOEXTEND + MAXSIZE(無制限は避ける)
- tablespace の用途分離(DATA/INDEX/TEMP/UNDO)
- Locally Managed Tablespace
- Quota 設定
- 定期的な状態チェック
- バックアップ習慣
BIGFILE vs SMALLFILE
| 用途 | 推奨 |
|---|---|
| 通常業務 | SMALLFILE |
| VLDB / DWH | BIGFILE |
| ASM 環境 | BIGFILE 相性良い |
現代の推奨
- AUM (Automatic Undo Management)
- LMT (Locally Managed Tablespace)
- ASSM (Automatic Segment Space Management)
- 監視の自動化
- クラウド環境なら Autonomous DB / RDS を検討
これらの知識は、Oracle DB の日常運用・障害対応・新規プロジェクト設計・データ移行・パフォーマンスチューニング・Rails / Kamal 環境構築など、あらゆる場面で活用できます。本記事をブックマークしておけば、tablespace 関連の問題に確実に対処できるようになります。
本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜23ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。
-
前の記事
【完全ガイド】ORA-00054: resource busy の原因と解決方法|NOWAIT・DDL_LOCK_TIMEOUT・ロック元セッション特定まで徹底解説 2026.07.17
-
次の記事
【完全ガイド】ORA-01843: not a valid month の原因と解決方法|NLS_DATE_FORMAT・TO_DATE・暗黙変換・環境差異まで徹底解説 2026.07.17
コメントを書く