Oracleテーブルスペースの確認と残量管理【容量不足でDB停止を防ぐ方法】

当ページのリンクには広告が含まれています。

「突然DBが止まった」「ORA-01653が出た」——その原因、ほぼテーブルスペース不足です。本記事では現場エンジニアが知っておくべきテーブルスペースの確認・監視・対処法を完全解説します。

目次

1. テーブルスペースとは(30秒でわかる) {#about}

テーブルスペースはOracleデータベースの論理的な記憶域の単位です。テーブルやインデックスはいずれかのテーブルスペースに属しています。

テーブルスペース(論理)
  └── データファイル(物理 .dbfファイル)
        └── テーブル / インデックスのデータ

主なテーブルスペースの種類:

テーブルスペース名用途
SYSTEMデータディクショナリ(触らない)
SYSAUX補助システム情報(触らない)
UNDOTBS1UNDOデータ(ロールバック用)
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-30036UNDOセグメントを拡張できません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は特性が違うので個別に監視する

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次