【完全ガイド】Oracle Tablespace 管理|USERS/SYSTEM 拡張・AUTOEXTEND・使用率確認まで徹底解説

  • 作成日 2026.07.17
  • git
【完全ガイド】Oracle Tablespace 管理|USERS/SYSTEM 拡張・AUTOEXTEND・使用率確認まで徹底解説

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 を業務レベルで確実に管理できるようになります。


目次

結論:まず現状把握と拡張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データディクショナリ
SYSAUXOracle 内部機能
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 / DWHBIGFILE
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データディクショナリ削除不可、要注意
SYSAUXOracle 内部機能肥大化しやすい
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-01652TEMPFILE 追加/拡張
ORA-01631Locally Managed 化
ORA-01536ユーザー quota 変更
ORA-30036UNDO 拡張
ORA-03297RESIZE の前に shrink

予防のベストプラクティス

  • 監視の自動化(85% 超え警告)
  • AUTOEXTEND + MAXSIZE(無制限は避ける)
  • tablespace の用途分離(DATA/INDEX/TEMP/UNDO)
  • Locally Managed Tablespace
  • Quota 設定
  • 定期的な状態チェック
  • バックアップ習慣

BIGFILE vs SMALLFILE

用途推奨
通常業務SMALLFILE
VLDB / DWHBIGFILE
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)もあわせてご確認ください。