「突然DBが止まった」「ORA-01653が出た」——その原因、ほぼテーブルスペース不足です。本記事では現場エンジニアが知っておくべきテーブルスペースの確認・監視・対処法を完全解説します。
目次
1. テーブルスペースとは(30秒でわかる) {#about}
テーブルスペースはOracleデータベースの論理的な記憶域の単位です。テーブルやインデックスはいずれかのテーブルスペースに属しています。
テーブルスペース(論理)
└── データファイル(物理 .dbfファイル)
└── テーブル / インデックスのデータ主なテーブルスペースの種類:
| テーブルスペース名 | 用途 |
|---|---|
| SYSTEM | データディクショナリ(触らない) |
| SYSAUX | 補助システム情報(触らない) |
| UNDOTBS1 | UNDOデータ(ロールバック用) |
| TEMP | 一時領域(ソート・結合で使用) |
| USERS | ユーザーデータのデフォルト |
2. 残量をすぐ確認するSQL {#check-usage}
基本の残量確認クエリ
SELECT
df.TABLESPACE_NAME AS テーブルスペース名,
ROUND(df.TOTAL_MB, 1) AS 合計MB,
ROUND(df.TOTAL_MB - NVL(fs.FREE_MB, 0), 1) AS 使用MB,
ROUND(NVL(fs.FREE_MB, 0), 1) AS 空きMB,
ROUND((df.TOTAL_MB - NVL(fs.FREE_MB, 0)) / df.TOTAL_MB * 100, 1) AS 使用率
FROM
(SELECT TABLESPACE_NAME, SUM(BYTES) / 1024 / 1024 AS TOTAL_MB
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) df
LEFT JOIN
(SELECT TABLESPACE_NAME, SUM(BYTES) / 1024 / 1024 AS FREE_MB
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) fs
ON df.TABLESPACE_NAME = fs.TABLESPACE_NAME
ORDER BY
使用率 DESC;出力例:
テーブルスペース名 合計MB 使用MB 空きMB 使用率
-------------- ------ ------ ------ ------
USERS 10240 9850 390 96.2 ← 🚨 危険!
UNDOTBS1 5120 1200 3920 23.4
SYSAUX 1024 610 414 59.6
SYSTEM 700 580 120 82.9一時テーブルスペース(TEMP)の確認
TEMPはDBA_FREE_SPACEに載らないため別クエリが必要です。
SELECT
ts.TABLESPACE_NAME,
ROUND(ts.TOTAL_MB, 1) AS 合計MB,
ROUND(ts.TOTAL_MB - tf.FREE_MB, 1) AS 使用MB,
ROUND(tf.FREE_MB, 1) AS 空きMB,
ROUND((ts.TOTAL_MB - tf.FREE_MB) / ts.TOTAL_MB * 100, 1) AS 使用率
FROM
(SELECT TABLESPACE_NAME, SUM(BYTES) / 1024 / 1024 AS TOTAL_MB
FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME) ts,
(SELECT TABLESPACE_NAME, SUM(FREE_BLOCKS * 8192) / 1024 / 1024 AS FREE_MB
FROM V$TEMP_SPACE_HEADER GROUP BY TABLESPACE_NAME) tf
WHERE ts.TABLESPACE_NAME = tf.TABLESPACE_NAME;3. 自動拡張(AUTOEXTEND)の確認と設定 {#autoextend}
自動拡張の設定状況を確認する
SELECT
TABLESPACE_NAME,
FILE_NAME,
ROUND(BYTES / 1024 / 1024, 1) AS 現在のサイズMB,
AUTOEXTENSIBLE AS 自動拡張,
ROUND(MAXBYTES / 1024 / 1024, 1) AS 最大サイズMB,
ROUND(INCREMENT_BY * 8192 / 1024 / 1024, 1) AS 拡張単位MB
FROM
DBA_DATA_FILES
ORDER BY
TABLESPACE_NAME, FILE_NAME;自動拡張を有効にする
-- AUTOEXTENDをONにして最大32GBまで自動拡張
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
AUTOEXTEND ON
NEXT 128M
MAXSIZE 32767M;⚠️ 注意: AUTOEXTENDをONにしても、OSディスクの空き容量がゼロになれば停止します。過信は禁物です。
自動拡張を無効にする
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
AUTOEXTEND OFF;4. テーブルスペースにデータファイルを追加する {#add-datafile}
自動拡張の上限に達したか、すでに最大サイズの場合は新しいデータファイルを追加します。
データファイルを追加する
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/oradata/ORCL/users02.dbf'
SIZE 2048M
AUTOEXTEND ON
NEXT 256M
MAXSIZE 32767M;データファイルのパスを確認してから追加する
-- 既存のデータファイルパスを確認
SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'USERS';5. 各テーブルスペースの用途と注意点 {#types}
SYSTEM / SYSAUX テーブルスペース
- データディクショナリが格納されている
- ユーザーデータを置かない(SYSTEM TBSへのデータ格納はアンチパターン)
- 80%を超えたら調査必要
UNDOTBS1(UNDOテーブルスペース)
- ロールバックや読み取り一貫性に使用
- ORA-01555(スナップショットが古すぎます) の原因になる
- 長時間の長大トランザクション実行時は特に注意
-- UNDO設定の確認
SHOW PARAMETER undo_retention;
SHOW PARAMETER undo_tablespace;TEMP(一時テーブルスペース)
- ORDER BY・GROUP BY・大きな結合で使用
- セッションが終われば自動開放
- ただし実行中に枯渇するとSQL失敗する
6. テーブルスペース不足で出るエラーと対処 {#errors}
| エラーコード | メッセージ概要 | 原因 | 対処法 |
|---|---|---|---|
| ORA-01653 | 表を拡張できません | データTBS不足 | データファイル追加・AUTOEXTEND ON |
| ORA-01652 | 一時セグメントを拡張できません | TEMP不足 | 一時ファイル追加 |
| ORA-30036 | UNDOセグメントを拡張できません | UNDO不足 | UNDO TBSサイズ拡張 |
| ORA-01555 | スナップショットが古すぎます | UNDO_RETENTION不足 | undo_retention パラメータ調整 |
ORA-01653 発生時の即時対処
-- Step1: 残量を確認
SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/1024/1024, 1) AS FREE_MB
FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
-- Step2: AUTOEXTENDがOFFなら有効化
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
AUTOEXTEND ON NEXT 128M MAXSIZE UNLIMITED;
-- Step3: それでも足りなければデータファイル追加
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/oradata/ORCL/users02.dbf' SIZE 4096M;7. 監視・アラート設定のポイント {#monitoring}
使用率80%を超えているTBSをアラート
SELECT
df.TABLESPACE_NAME,
ROUND((df.TOTAL_MB - NVL(fs.FREE_MB, 0)) / df.TOTAL_MB * 100, 1) AS 使用率
FROM
(SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) df
LEFT JOIN
(SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) fs
ON df.TABLESPACE_NAME = fs.TABLESPACE_NAME
WHERE
(df.TOTAL_MB - NVL(fs.FREE_MB, 0)) / df.TOTAL_MB * 100 > 80
ORDER BY
使用率 DESC;💡 このSQLをシェルスクリプトや監視ツール(Zabbix・Prometheusなど)に組み込むと、閾値超過時にアラートを飛ばせます。
8. まとめ:残量管理チェックリスト {#summary}
| チェック項目 | 確認コマンド / 対処 |
|---|---|
| 全TBSの使用率確認 | DBA_DATA_FILES + DBA_FREE_SPACEのJOIN |
| TEMP領域の確認 | DBA_TEMP_FILES + V$TEMP_SPACE_HEADER |
| AUTOEXTEND設定確認 | DBA_DATA_FILES の AUTOEXTENSIBLE列 |
| 自動拡張の有効化 | ALTER DATABASE DATAFILE ... AUTOEXTEND ON |
| データファイル追加 | ALTER TABLESPACE ... ADD DATAFILE |
| ORA-01653発生時 | AUTOEXTENDまたはデータファイル追加 |
| 監視閾値 | 使用率80%でWARN、90%でCRITICAL推奨 |
ポイントまとめ:
- テーブルスペース不足はDB停止の直接原因になる
- 定期的な残量監視は必須——気づいたときには手遅れになりやすい
- AUTOEXTENDは便利だが、OSディスクとMAXSIZEを必ずセットで確認すること
- TEMP・UNDO・SYSTEMは特性が違うので個別に監視する
関連記事:








コメント