Oracle で表領域の「使用率」「サイズ」を正しく確認し、必要に応じて容量を拡張するためのディクショナリビュー(DBA_*)と動的ビュー(V$*)の使い分け・実用SQLをまとめます。はじめに「表領域 とは」何かを整理し、日常運用で迷わない最短手順を提示します(対象:Linux/19c 非CDB)。
表領域に関してはコチラ。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
結論・最短手順(スニペット用)
- 全体像を確認
DBA_TABLESPACES(状態/種別/BIGFILE)で対象を把握。 - ファイル単位のサイズ確認
常用:DBA_DATA_FILES、TEMP:DBA_TEMP_FILES。 - 表領域の使用率を確認
常用:DBA_TABLESPACE_USAGE_METRICSまたはDBA_FREE_SPACE集計。
TEMP:V$TEMP_SPACE_HEADERを集計。 - リアルタイムの状態確認
V$TABLESPACE/V$DATAFILE(ONLINE/OFFLINE、読取専用など)。 - 足りないときの拡張
ALTER TABLESPACE ... ADD DATAFILE/AUTOEXTEND ON/RESIZEを選ぶ。 - 運用の基本
変更前に参照系で確認 → 変更 → 結果確認/アラートログ確認。
表領域とは?(背景と基礎)
- 表領域とは:表や索引などのセグメントを格納する論理コンテナ。実体は 1 本以上のデータファイル(.dbf)です。
- PERMANENT/TEMPORARY:通常データ用(PERMANENT)とソート・一時領域(TEMPORARY)。
- BIGFILE/SMALLFILE:ファイル本数と上限の考え方が異なります(BIGFILE は 1 ファイル大容量)。
- 使用率の基本:
- PERMANENT:データファイル合計サイズ − 空き(
DBA_FREE_SPACE) - TEMP:現在使用中の一時領域(
V$TEMP_SPACE_HEADER)
- PERMANENT:データファイル合計サイズ − 空き(
一口メモ:
DBA_TABLESPACE_USAGE_METRICSは PERMANENT の概要を一度に把握でき、日次レポートに便利です。TEMP は別クエリで見ます。
前提・検証用の作成(再現性のための最小セット)
- OS:Oracle Linux(例)
- DB:Oracle Database 19c(非CDB)
- 権限:
SYSDBA(DBA_* 参照のため) - パス:本記事は
/u01/app/oracle/oradata/ORCLを使用
目的:以降のクエリで使用率やサイズの変化を可視化できるよう、検証用の表領域とユーザー、テーブルを作成します。
-- 小さな検証用表領域(サイズ 50MB、必要に応じて自動拡張)
CREATE TABLESPACE TBS_APP
DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
解説:CREATE TABLESPACE は新しい表領域を作成します。SIZE は初期サイズ、AUTOEXTEND ON は満杯時に自動拡張する設定、MAXSIZE は自動拡張の上限です。
-- アプリ用ユーザー作成(デフォルト表領域を TBS_APP に)
CREATE USER APPUSER IDENTIFIED BY "Passw0rd1"
DEFAULT TABLESPACE TBS_APP
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON TBS_APP;
GRANT CREATE SESSION, CREATE TABLE TO APPUSER;
解説:CREATE USER でアプリユーザーを作成し、デフォルト表領域を TBS_APP に設定します。GRANT はログインと表作成に必要な最低限の権限を付与します。
-- 検証用テーブル作成+データ投入(使用率の変化を確認しやすく)
CONN APPUSER/"Passw0rd1"
CREATE TABLE T1 (id NUMBER, pad CHAR(1000));
INSERT INTO T1 SELECT LEVEL, RPAD('x',1000,'x') FROM dual CONNECT BY LEVEL <= 5000;
COMMIT;
解説:CREATE TABLE で検証用表を作り、INSERT ... CONNECT BY で 5,000 行を一括投入して表領域の使用率を意図的に上げています。COMMIT で変更を確定します。
手順・実装
1) 俯瞰:どの表領域が対象か確認
-- 表領域の状態・種別・ブロックサイズ・BIGFILE かを一覧
SELECT tablespace_name, status, contents, bigfile, block_size
FROM dba_tablespaces
ORDER BY tablespace_name;
解説:全表領域の基本属性を一覧化します。status(ONLINE/OFFLINE)、contents(PERMANENT/TEMPORARY)、bigfile の有無、block_size を見て監視対象の性質を確認します。
コマンド実行例
SQL> SELECT tablespace_name, status, contents, bigfile, block_size
2 FROM dba_tablespaces
3 ORDER BY tablespace_name;
TABLESPACE_NAME STATUS CONTENTS BIG BLOCK_SIZE
------------------------------ --------- --------------------- --- ----------
SYSAUX ONLINE PERMANENT NO 8192
SYSTEM ONLINE PERMANENT NO 8192
TBS_APP ONLINE PERMANENT NO 8192
TEMP ONLINE TEMPORARY NO 8192
UNDOTBS1 ONLINE UNDO NO 8192
USERS ONLINE PERMANENT NO 8192
2) ファイル単位のサイズ/自動拡張設定を確認
-- PERMANENT のデータファイル(現在サイズ・自動拡張の有無・上限)
SELECT tablespace_name, file_name,
bytes/1024/1024 AS size_mb,
autoextensible,
maxbytes/1024/1024 AS max_mb
FROM dba_data_files
ORDER BY tablespace_name, file_name;
解説:PERMANENT 用のデータファイルごとに現在サイズ(MB)、AUTOEXTENSIBLE、上限 MAXBYTES を把握し、拡張余地を見積もります。
コマンド実行例
SQL> col tablespace_name for a20
SQL> col file_name for a50
SQL> SELECT tablespace_name, file_name,
2 bytes/1024/1024 AS size_mb,
3 autoextensible,
4 maxbytes/1024/1024 AS max_mb
5 FROM dba_data_files
6 ORDER BY tablespace_name, file_name;
TABLESPACE_NAME FILE_NAME SIZE_MB AUT MAX_MB
-------------------- -------------------------------------------------- ---------- --- ----------
SYSAUX /u01/app/oracle/oradata/ORCL/sysaux01.dbf 510 YES 32767.9844
SYSTEM /u01/app/oracle/oradata/ORCL/system01.dbf 900 YES 32767.9844
TBS_APP /u01/app/oracle/oradata/ORCL/tbs_app01.dbf 50 YES 500
UNDOTBS1 /u01/app/oracle/oradata/ORCL/undotbs01.dbf 345 YES 32767.9844
USERS /u01/app/oracle/oradata/ORCL/users01.dbf 5 YES 32767.9844
-- TEMP のファイル(TEMPFILE)
SELECT tablespace_name, file_name,
bytes/1024/1024 AS size_mb,
autoextensible,
maxbytes/1024/1024 AS max_mb
FROM dba_temp_files
ORDER BY tablespace_name, file_name;
解説:TEMPFILE の現在サイズと自動拡張設定を確認します。ソートやハッシュ結合が増えると TEMP の消費が増えるため、上限も併せて監視します。
補足:
AUTOEXTENSIBLE=YESでも「今すぐ使える容量」は現在サイズまで。上限(MAXSIZE)も併記して判断します。
コマンド実行例
SQL> SELECT tablespace_name, file_name,
2 bytes/1024/1024 AS size_mb,
3 autoextensible,
4 maxbytes/1024/1024 AS max_mb
5 FROM dba_temp_files
6 ORDER BY tablespace_name, file_name;
TABLESPACE_NAME FILE_NAME SIZE_MB AUT MAX_MB
-------------------- -------------------------------------------------- ---------- --- ----------
TEMP /u01/app/oracle/oradata/ORCL/temp01.dbf 32 YES 32767.9844
3) PERMANENT の使用率を簡潔に確認(推奨)
-- 使用率を一括表示(PERMANENT)。block_size を考慮して MB に換算
SELECT m.tablespace_name,
t.block_size,
ROUND(m.tablespace_size * t.block_size / 1024/1024) AS size_mb,
ROUND(m.used_space * t.block_size / 1024/1024) AS used_mb,
ROUND( (m.used_space/m.tablespace_size) * 100, 1 ) AS used_pct
FROM dba_tablespace_usage_metrics m
JOIN dba_tablespaces t
ON m.tablespace_name = t.tablespace_name
ORDER BY used_pct DESC;
解説:DBA_TABLESPACE_USAGE_METRICS のブロック数を DBA_TABLESPACES.BLOCK_SIZE で換算し、表領域別の総量・使用量・使用率(used_pct) を一括で確認します。
コマンド実行例
SQL> SELECT m.tablespace_name,
2 t.block_size,
3 ROUND(m.tablespace_size * t.block_size / 1024/1024) AS size_mb,
4 ROUND(m.used_space * t.block_size / 1024/1024) AS used_mb,
5 ROUND( (m.used_space/m.tablespace_size) * 100, 1 ) AS used_pct
6 FROM dba_tablespace_usage_metrics m
7 JOIN dba_tablespaces t
8 ON m.tablespace_name = t.tablespace_name
9 ORDER BY used_pct DESC;
TABLESPACE_NAME BLOCK_SIZE SIZE_MB USED_MB USED_PCT
-------------------- ---------- ---------- ---------- ----------
SYSTEM 8192 32768 892 2.7
SYSAUX 8192 32768 507 1.5
TBS_APP 8192 500 7 1.4
USERS 8192 32417 3 0
TEMP 8192 32461 0 0
-- 代替:FREE_SPACE 集計で使用率を算出(USING では修飾子を外す)
WITH df AS (
SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_data_files GROUP BY tablespace_name
), fs AS (
SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space GROUP BY tablespace_name
)
SELECT tablespace_name, -- ★USING を使うため未修飾で出力
df.total_mb,
NVL(fs.free_mb,0) AS free_mb,
(df.total_mb - NVL(fs.free_mb,0)) AS used_mb,
ROUND( (df.total_mb - NVL(fs.free_mb,0)) / NULLIF(df.total_mb,0) * 100, 1 ) AS used_pct
FROM df
LEFT JOIN fs USING (tablespace_name)
ORDER BY used_pct DESC;
解説:DBA_DATA_FILES の総量から DBA_FREE_SPACE の空きを差し引いて使用率を算出する方法です。USING 句を使うため、SELECT では tablespace_name を未修飾で参照します。
コマンド実行例
SQL> WITH df AS (
2 SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
3 FROM dba_data_files GROUP BY tablespace_name
4 ), fs AS (
5 SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
6 FROM dba_free_space GROUP BY tablespace_name
7 )
8 SELECT tablespace_name,
9 df.total_mb,
10 NVL(fs.free_mb,0) AS free_mb,
11 (df.total_mb - NVL(fs.free_mb,0)) AS used_mb,
12 ROUND( (df.total_mb - NVL(fs.free_mb,0)) / NULLIF(df.total_mb,0) * 100, 1 ) AS used_pct
13 FROM df
14 LEFT JOIN fs USING (tablespace_name)
15 ORDER BY used_pct DESC;
TABLESPACE_NAME TOTAL_MB FREE_MB USED_MB USED_PCT
-------------------- ---------- ---------- ---------- ----------
UNDOTBS1 345 2 343 99.4
SYSTEM 900 8.375 891.625 99.1
SYSAUX 540 29.5625 510.4375 94.5
USERS 5 2.3125 2.6875 53.8
TBS_APP 50 43 7 14
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
4) TEMP の使用率をリアルタイムに確認
SELECT tablespace_name,
ROUND(SUM(bytes_used)/1024/1024) AS used_mb,
ROUND(SUM(bytes_free)/1024/1024) AS free_mb,
ROUND(SUM(bytes_used)/NULLIF(SUM(bytes_used)+SUM(bytes_free),0) * 100, 1) AS used_pct
FROM v$temp_space_header
GROUP BY tablespace_name
ORDER BY used_pct DESC;
解説:V$TEMP_SPACE_HEADER を集計して TEMP の現在使用率を即時に把握します。セッション単位の内訳を追う場合は V$TEMPSEG_USAGE を参照します。
コマンド実行例
SQL> SELECT tablespace_name,
2 ROUND(SUM(bytes_used)/1024/1024) AS used_mb,
3 ROUND(SUM(bytes_free)/1024/1024) AS free_mb,
4 ROUND(SUM(bytes_used)/NULLIF(SUM(bytes_used)+SUM(bytes_free),0) * 100, 1) AS used_pct
5 FROM v$temp_space_header
6 GROUP BY tablespace_name
7 ORDER BY used_pct DESC;
TABLESPACE_NAME USED_MB FREE_MB USED_PCT
-------------------- ---------- ---------- ----------
TEMP 32 0 100
5) リアルタイム状態(ONLINE/OFFLINE、読み取り専用)を確認
-- 表領域 ONLINE/OFFLINE など
SELECT tablespace_name, status, contents
FROM dba_tablespaces
ORDER BY tablespace_name;
解説:インスタンス視点での表領域状態(status/contents)を即時に確認します。運用切替や障害時の一時確認に有効です。
コマンド実行例
SQL> SELECT tablespace_name, status, contents
2 FROM dba_tablespaces
3 ORDER BY tablespace_name;
TABLESPACE_NAME STATUS CONTENTS
-------------------- --------- ---------------------
SYSAUX ONLINE PERMANENT
SYSTEM ONLINE PERMANENT
TBS_APP ONLINE PERMANENT
TEMP ONLINE TEMPORARY
UNDOTBS1 ONLINE UNDO
USERS ONLINE PERMANENT
6 rows selected.
-- データファイルのオンライン状態(有効/無効など)を確認
SELECT file#, status, enabled
FROM v$datafile
ORDER BY file#;
解説:V$DATAFILE の status と enabled を確認して、各データファイルが読み書き可能か/読み取り専用か/無効かを把握します。
コマンド実行例
SQL> SELECT file#, status, enabled
2 FROM v$datafile
3 ORDER BY file#;
FILE# STATUS ENABLED
---------- ------- ----------
1 SYSTEM READ WRITE
3 ONLINE READ WRITE
4 ONLINE READ WRITE
5 ONLINE READ WRITE
7 ONLINE READ WRITE
6) 容量が足りないときの拡張(安全手順)
変更系は必ず事前に確認→変更→結果確認。まずは「参照系クエリ」で根拠を押さえます。
-- 追加でファイルを作成して拡張(推奨。リスクが低い)
ALTER TABLESPACE TBS_APP ADD DATAFILE
'/u01/app/oracle/oradata/ORCL/tbs_app02.dbf' SIZE 100M AUTOEXTEND ON NEXT 20M MAXSIZE 2G;
解説:ADD DATAFILE は新規ファイルの追加で表領域を拡張します。既存ファイルを動かさず、断片化の影響も相対的に少ないため安全度が高い方法です。
-- 既存ファイルを RESIZE(OS 空きと連動。拡張できない場合あり)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf' RESIZE 100M;
解説:既存ファイルのサイズを直接変更します。OS 側の空きとセグメント配置の制約を受け、失敗(ORA-03206/03217)する可能性がある点に注意します。
-- 自動拡張を有効化/設定変更
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_app01.dbf'
AUTOEXTEND ON NEXT 20M MAXSIZE 2G;
解説:データファイルに自動拡張を設定します。NEXT は拡張単位、MAXSIZE は上限で、無制限な増加を防ぎます。
戻し方:追加ファイルは 空であれば
DROP DATAFILE可能(制約あり)。安易に縮小しすぎると ORA-03206/03217(縮小不可)を招くため、縮小は慎重に。
テキスト図:運用フロー(alt: Oracle 表領域 使用率 確認→拡張 の流れ)
┌──────────────┐ ┌────────────────┐ ┌─────────────────────┐
│ 参照系で確認 │ → │ 原因の特定 │ → │ 拡張方式を選ぶ │
│ ・使用率/サイズ│ │ ・TEMPか常用か │ │ ADD/RESIZE/AUTOEXTEND│
│ ・ONLINE状態 │ │ ・急増の要因 │ │ ロールバック方針 │
└─────┬────────┘ └───────┬─────────┘ └───────────┬─────────┘
│(OK) │(実施)
▼ ▼
結果を再確認(クエリ/アラートログ/監視)
実行例(抜粋:PERMANENT 使用率の推移を目視)
-- 拡張前
SELECT tablespace_name, used_pct
FROM (
SELECT m.tablespace_name,
ROUND((m.used_space/m.tablespace_size)*100,1) AS used_pct
FROM dba_tablespace_usage_metrics m
) WHERE tablespace_name = 'TBS_APP';
解説:対象表領域(TBS_APP)の使用率だけを抽出し、拡張前の状況をスナップショットとして記録します。
-- データ増加 → 再確認
INSERT INTO APPUSER.T1 SELECT LEVEL+5000, RPAD('y',1000,'y')
FROM dual CONNECT BY LEVEL <= 5000;
COMMIT;
解説:テーブルにさらに 5,000 行を投入して使用率を意図的に上げ、拡張前後の差分を観測できるようにします。COMMIT で確定します。
-- 拡張後に再確認
ALTER TABLESPACE TBS_APP ADD DATAFILE
'/u01/app/oracle/oradata/ORCL/tbs_app03.dbf' SIZE 100M;
解説:ADD DATAFILE で拡張を行い、前段の確認クエリを再実行して使用率が低下した(余裕が増えた)ことを確認します。
意図:同じクエリで前後比較できる形にしておくと、影響範囲と効果が明確です。
トラブルシューティング(代表エラーの見方)
| 症状/エラー | 主な原因 | まずやる確認(参照系) | 対処の優先順(参照→変更) |
|---|---|---|---|
| ORA-01653(拡張不可) | 表領域の空き不足 | PERMANENT の使用率・最大サイズ・AUTOEXTENSIBLE | 1) 不要セグメント削除→2) ADD DATAFILE→3) AUTOEXTEND ON |
| ORA-01652(TEMP不足) | TEMP の一時領域不足 | V$TEMP_SPACE_HEADER の 使用率 | 1) SQL見直し/PGA_AGGREGATE_TARGET 検討→2) TEMPFILE 追加 |
| ORA-01659(表作成失敗) | 作成先の空きが断片化 | DBA_FREE_SPACE の最大エクステント | 1) 断片化確認→2) ファイル追加 or RESIZE で連続領域確保 |
| ORA-03206/03217(縮小不可) | セグメント配置により縮小できず | DBA_EXTENTS の末尾使用状況 | 縮小は最後の手段。MOVE/SHRINK 等で再配置後に再試行 |
まずは参照系で確認→根拠を持って最小限の拡張から。
運用・監視・セキュリティの注意
- 監視:
DBA_TABLESPACE_USAGE_METRICS(PERMANENT)とV$TEMP_SPACE_HEADER(TEMP)を定期確認。しきい値で通知。 - 容量設計:
AUTOEXTENDは便利だが、上限(MAXSIZE)とファイルシステム空きに要注意。 - 変更管理:拡張は低リスク(
ADD DATAFILEが基本)。縮小は原則避け、実施時は十分な検証を。 - 権限:参照系は最小権限で。変更系は運用手順と二重承認を。
- ログ:アラートログで事後確認(拡張・障害の記録を追える体制に)。
FAQ
Q1. DBA_TABLESPACE_USAGE_METRICS の数値単位は?
A1. ブロック数です。表領域ごとに DBA_TABLESPACES.BLOCK_SIZE を参照して MB/GB に換算します。
Q2. TEMP の使用率はどこで見ますか?
A2. V$TEMP_SPACE_HEADER を合算します。セッション別は V$TEMPSEG_USAGE。
Q3. まず何を確認すれば良いですか?
A3. 1) 表領域の種別/状態 2) ファイルの現在サイズ/上限 3) 使用率(PERMANENT/TEMP それぞれ)です。
Q4. どの拡張方法を選べば良い?
A4. 原則は ADD DATAFILE。やむを得ず RESIZE/AUTOEXTEND を併用します。縮小は慎重に。
Q5. BIGFILE 表領域の注意点は?
A5. 1 ファイル大容量ゆえにバックアップ/復旧時の影響が大きくなりがち。ブロックサイズや上限設計を事前に詰めましょう。
まとめ(要点)
- 表領域とは:セグメント格納の論理コンテナ。実体はデータファイル。
- 使用率の確認:PERMANENT は
DBA_TABLESPACE_USAGE_METRICS、TEMP はV$TEMP_SPACE_HEADER。 - サイズ設計:
AUTOEXTENDの上限とファイルシステム空きの二重管理。 - 拡張の原則:低リスクな
ADD DATAFILEを優先。縮小は最終手段。 - 運用:参照系で根拠→変更→結果の確認をルーチン化。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Databaseデータベース管理者ガイド 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント