タイトル: テーブルスペースの容量の確認および拡張
SEOタイトル: DB テーブルスペースの容量確認および拡張
| この記事の要点 |
|---|
|
テーブルスペースとは
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 程度で足りる、肥大化するのはユーザデータが入り込んでいるサイン
- 権限: 拡張操作は
SYSDBAやALTER TABLESPACE権限が必要