6.

DB テーブルスペースの容量確認および拡張

編集
この記事の要点
  • Oracle のテーブルスペース容量確認・拡張方法
  • 確認: DBA_DATA_FILES / DBA_FREE_SPACE ビュー
  • 拡張 ①: ALTER DATABASE DATAFILE ... RESIZE(既存データファイルを拡大)
  • 拡張 ②: ALTER TABLESPACE ... ADD DATAFILE(データファイル追加)
  • 自動拡張: ALTER DATABASE DATAFILE ... AUTOEXTEND ON NEXT 100M MAXSIZE 10G

 

テーブルスペースとは

Oracle のテーブルスペースは論理的なデータ格納領域で、1 つ以上のデータファイル(OS の物理ファイル)から構成されます。テーブル・インデックス等のデータは特定のテーブルスペースに格納されます。

主要なテーブルスペース:

  • SYSTEM: データディクショナリ
  • SYSAUX: 補助システム情報
  • TEMP: 一時表領域(ソート等)
  • UNDOTBS1: UNDO データ
  • USERS: ユーザデータ(デフォルト)

容量確認

① テーブルスペース全体のサイズ

SELECT
    tablespace_name,
    ROUND(SUM(bytes) / 1024 / 1024, 2) AS total_mb
FROM dba_data_files
GROUP BY tablespace_name
ORDER BY tablespace_name;

# 結果例
TABLESPACE_NAME  TOTAL_MB
---------------  --------
SYSTEM           800
SYSAUX           600
USERS            1024

② 使用容量・空き容量

SELECT
    df.tablespace_name,
    ROUND(df.total_mb, 2) AS total_mb,
    ROUND(df.total_mb - NVL(fs.free_mb, 0), 2) AS used_mb,
    ROUND(NVL(fs.free_mb, 0), 2) AS free_mb,
    ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 2) AS used_pct
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 used_pct DESC;

# 結果例
TABLESPACE_NAME  TOTAL_MB  USED_MB  FREE_MB  USED_PCT
---------------  --------  -------  -------  --------
USERS            1024      950      74       92.77    ← 危険
SYSTEM           800       720      80       90.00
SYSAUX           600       400      200      66.67

③ データファイル個別の情報

SELECT
    tablespace_name,
    file_name,
    ROUND(bytes / 1024 / 1024, 2) AS size_mb,
    autoextensible AS auto_ext,
    ROUND(maxbytes / 1024 / 1024, 2) AS max_mb,
    ROUND(increment_by * (SELECT block_size FROM dba_tablespaces WHERE tablespace_name = ddf.tablespace_name) / 1024 / 1024, 2) AS increment_mb
FROM dba_data_files ddf
ORDER BY tablespace_name;

④ 一時表領域・UNDO 表領域

-- 一時表領域
SELECT
    tablespace_name,
    ROUND(SUM(bytes_used)/1024/1024, 2) AS used_mb,
    ROUND(SUM(bytes_free)/1024/1024, 2) AS free_mb
FROM v$temp_space_header
GROUP BY tablespace_name;

-- UNDO 表領域
SELECT
    tablespace_name,
    ROUND(SUM(bytes)/1024/1024, 2) AS total_mb
FROM dba_data_files
WHERE tablespace_name IN (SELECT value FROM v$parameter WHERE name = 'undo_tablespace');

容量拡張

方法 1: 既存データファイルを RESIZE

-- データファイルのサイズを 2GB に拡大
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 2G;

-- 1GB → 5GB
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 5120M;

-- 縮小も可(空き領域がある場合のみ)
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 500M;

方法 2: データファイル追加

-- 既存テーブルスペースにデータファイルを追加
ALTER TABLESPACE users
ADD DATAFILE '/u01/oradata/users02.dbf' SIZE 2G;

-- 自動拡張も同時に設定
ALTER TABLESPACE users
ADD DATAFILE '/u01/oradata/users02.dbf'
SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

-- 確認
SELECT file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files WHERE tablespace_name = 'USERS';

方法 3: 自動拡張を有効化

-- 既存ファイルの自動拡張を ON
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf'
AUTOEXTEND ON
NEXT 100M           -- 100MB ずつ拡張
MAXSIZE 10G;        -- 10GB が上限 (UNLIMITED も可)

-- UNLIMITED の場合
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

-- 自動拡張を OFF
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' AUTOEXTEND OFF;

方法 4: BIGFILE テーブルスペース(単一巨大ファイル)

-- BIGFILE 形式(1 つのデータファイルが最大 128TB)
CREATE BIGFILE TABLESPACE huge_data
DATAFILE '/u01/oradata/huge_data.dbf' SIZE 100G
AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;

一時表領域の拡張

-- 一時データファイル追加
ALTER TABLESPACE temp
ADD TEMPFILE '/u01/oradata/temp02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;

-- 既存一時ファイルのサイズ変更
ALTER DATABASE TEMPFILE '/u01/oradata/temp01.dbf' RESIZE 5G;

UNDO 表領域の拡張

-- UNDO データファイル追加
ALTER TABLESPACE undotbs1
ADD DATAFILE '/u01/oradata/undotbs02.dbf'
SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 5G;

新規テーブルスペース作成

-- 通常 (SMALLFILE) テーブルスペース
CREATE TABLESPACE app_data
DATAFILE '/u01/oradata/app_data01.dbf' SIZE 1G
AUTOEXTEND ON NEXT 100M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;

-- BIGFILE
CREATE BIGFILE TABLESPACE app_huge
DATAFILE '/u01/oradata/app_huge.dbf' SIZE 10G
AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;

テーブルスペースの監視(運用向け)

-- 使用率 80% 超のテーブルスペースを抽出(アラート対象)
SELECT
    df.tablespace_name,
    ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 2) AS used_pct
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 used_pct DESC;

注意点

  • 事前のバックアップ: データファイル変更前は必ずバックアップ
  • RESIZE は一括: ファイル拡張中は短時間のロックあり、本番では計画停止
  • 自動拡張の落とし穴: MAXSIZE UNLIMITED にすると気付かぬ間にディスクフル
  • OS のディスク容量: テーブルスペース拡張前に df -h で OS 側を確認
  • SYSTEM 表領域はあまり拡張しない: 通常 800MB 程度で足りる、肥大化するのはユーザデータが入り込んでいるサイン
  • 権限: 拡張操作は SYSDBAALTER TABLESPACE 権限が必要

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法