「表領域の容量が足りない!」
「表領域拡張したいけど、どんな手順で実行すればいいんだっけ?」
この記事では、初めて表領域拡張を行う方はもちろん、経験者の方にも役立つよう、表領域を拡張するための2つのアプローチと、具体的な確認・実行手順をまとめました。
前提と注意事項
- この記事では、smallfileの永続表領域を対象に手順の解説を行っております。
- 一時表領域、UNDO表領域、bigfile表領域の拡張手順については、手順やSQLコマンドの構文が異なり、内容が複雑になってしまうため本記事では対象外とさせていただきます。
- マルチコンテナ環境では、対象表領域を持つDBへ接続して手順を実行してください。
動作確認環境
- OS:Red Hat Enterprise Linux 8 (64-bit)
- Oracleバージョン:Oracle Database 19c / Grid Infrastructure 19c
作業前の確認:ディスクの空き容量チェック
表領域の拡張を行うためには、OSのディスク(またはASM)に十分な空き容量が残っている必要があります。
作業に入る前に以下コマンドで空き容量を確認してください。
ファイルシステムにデータファイルを配置している場合
以下コマンドを実行し、確認してください。
[oracle@ホスト名 ~]$ df -h <データファイルを保存しているディレクトリ>
ASMを利用している場合
ASM管理ユーザー(本手順ではgridユーザー)で以下コマンドを実行し、確認してください。
[grid@ホスト名 ~]$ asmcmd lsdg
事前に空き容量を確認し、もし余裕がない場合は、先に容量を確保してから手順を実行してください。
表領域拡張の全体像
表領域を拡張する方法としては、大きく分けて2つあります。
- 既存データファイルの拡張
- 新規データファイルの追加
上記2つの拡張方法を踏まえて、全体的な手順としては以下の通りです。
- 対象表領域の確認
- 表領域におけるデータファイルの最大サイズの確認
- データファイルの確認
- 既存データファイルの拡張
- 新規データファイルの追加
それでは、上から順に進めていきましょう。
Step1:対象表領域の確認
最初に、対象の表領域について確認します。
SQL> SELECT tablespace_name, bigfile, contents, status, block_size
FROM dba_tablespaces
WHERE tablespace_name = '<対象の表領域名>';
各項目の内容については以下の通りです。
- TABLESPACE_NAME:表領域の名前
- BIGFILE:表領域がbigfile表領域か(YES)、smallfile表領域か(NO)
- CONTENTS:表領域の種類(PERMANENTの場合は永続表領域)
- STATUS:表領域のステータス(ONLINE、OFFLINE、READ ONLY)
- BLOCK_SIZE:表領域のブロック・サイズ(バイト)
(参照:Oracle Database リファレンス - 6.49 DBA_TABLESPACES)
「BIGFILE = YES」、または「CONTENTS = TEMPORARY / UNDO」だった場合は、本記事の手順からは対象外となりますのでご注意ください。
「BLOCK_SIZE」の値については、次章で「データファイルのサイズをどこまで大きくできるか」を確認するために使用します。
Step2:表領域におけるデータファイルの最大サイズの確認
先ほど確認した「BLOCK_SIZE」から、表領域における「1データファイル当たりの最大サイズ」を確認します。
ここで最大サイズを把握しておく理由としては、次章以降で「既存のデータファイルを拡張するか」それとも「新規データファイルを追加すべきか」を判断する基準になるためです。
データファイルの最大サイズは「データ・ブロック・サイズ」と「データ・ブロック数」で決まります。1つのデータファイルに格納できるブロック数の上限はすでに決まっているため(4,194,303ブロック)、ブロック・サイズが分かれば、1ファイル当たりの最大サイズを把握することができます。
以下の表を参考に、ご自身の環境のデータファイルの最大サイズをご確認ください。
【データ・ブロック・サイズごとの最大サイズ早見表】
| ブロック・サイズ (BLOCK_SIZE) | 1データファイル当たりの最大サイズ |
| 2KB (2048) | 約 8GB |
| 4KB (4096) | 約 16GB |
| 8KB (8192) | 約 32GB |
| 16KB (16384) | 約 64GB |
| 32KB (32768) | 約 128GB |
(参照:Oracle Database リファレンス - 物理データベースの制限)
ここで確認した最大サイズは、次章で現在のファイルサイズ(CURRENT_MB)や自動拡張上限(MAX_MB)と比較するために使います。
これらの値が最大サイズに達していなければ、既存のデータファイルをさらに拡張することが可能です。達していれば、新規データファイルの追加が必要になります。
Step3:データファイルの確認
次に、表領域を構成しているデータファイルについて確認します。
SQL> SELECT
file_name,
tablespace_name,
bytes / 1024 / 1024 AS current_mb,
autoextensible,
maxbytes / 1024 / 1024 AS max_mb,
increment_by * <ブロック・サイズ(バイト単位)> / 1024 / 1024 AS increment_mb,
online_status
FROM dba_data_files
WHERE tablespace_name = '<対象の表領域名>';
各項目の内容については以下の通りです。
- FILE_NAME:データファイル名
- TABLESPACE_NAME:ファイルが属する表領域の名前
- BYTES(CURRENT_MB):現在のデータファイルサイズ
- AUTOEXTENSIBLE:自動拡張の有無
- MAXBYTES(MAX_MB):自動拡張できる上限サイズ
- INCREMENT_BY(INCREMENT_MB):自動拡張1回当たりの増加サイズ
- ONLINE_STATUS:データファイルの状態
(参照:Oracle Database リファレンス -4.246 DBA_DATA_FILES)
「INCREMENT_MB」に関しては、Step1で確認したブロック・サイズの値を当てはめてください。
例として、ブロック・サイズが8KB(8192 byte)の場合は、
increment_by * 8192 / 1024 / 1024 AS increment_mb
となります。
上記のSQLを実行して現在のデータファイルの状態が確認できたら、その結果をもとに今後の対応方針を決定します。
以下の表と照らし合わせて、ご自身の環境がどのパターンに当てはまるかを確認し、次に進むステップ(Step4 または Step5)を判断してください。
確認結果から、次に進む章を決める
|
確認結果 |
次に進む章 |
|
「AUTOEXTENSIBLE = NO」、かつ「CURRENT_MB」が「Step2の最大サイズ」より小さい。 |
「Step4:既存データファイルの拡張」へ進む。 |
|
「AUTOEXTENSIBLE = NO」、かつ「CURRENT_MB」が「Step2の最大サイズ」と同じ、またはほぼ同じ。 |
「Step5:新規データファイル追加」へ進む。 |
|
「AUTOEXTENSIBLE = YES」、かつ「CURRENT_MB」が「MAX_MB」より十分に小さい。 |
OSディスク領域に余裕があれば対処不要(自動拡張に任せればOK)。 |
|
「AUTOEXTENSIBLE = YES」、かつ「CURRENT_MB」と「MAX_MB」が同じ、またはほぼ同じで、「MAX_MB」が「Step2の最大サイズ」より小さい。 |
「Step4:既存データファイルの拡張」へ進む。 |
|
「AUTOEXTENSIBLE = YES」、かつ「CURRENT_MB」と「MAX_MB」が同じ、またはほぼ同じで、「MAX_MB」が「Step2の最大サイズ」と同じ、またはほぼ同じ。 |
「Step5:新規データファイル追加」へ進む。 |
※上記の内容をフローチャートにまとめました。

Step4:既存データファイルの拡張
Step3 の確認結果からこちらに進んだ場合、既存のデータファイルに拡張の余地がある状態です。新しくファイルを追加する必要はないため、現在の「自動拡張上限(MAXSIZE)」を引き上げるか、データファイルのサイズを手動拡張(RESIZE)することで対応できます。
自動拡張上限を引き上げる場合
以下SQLを実行し、指定したサイズまで自動拡張上限を引き上げてください。
SQL> ALTER DATABASE DATAFILE '<対象データファイルのパス>'
AUTOEXTEND ON
NEXT <〇〇M / 〇〇G>
MAXSIZE <〇〇M / 〇〇G / UNLIMITED>;
各項目の内容については以下の通りです。
- NEXT:自動拡張する際の1回当たりの増分サイズ
- MAXSIZE:自動拡張の上限サイズ
「MAXSIZE」で「UNLIMITED」と指定することで、自動でそのデータファイルの最大サイズまで自動拡張上限を引き上げることができます。
手動拡張(RESIZE)する場合
運用上の都合などで自動拡張(AUTOEXTEND)をONにしたくない場合などは、「RESIZE」を使用して手動でデータファイルを拡張することも可能です。
以下SQLを実行し、指定したサイズまでデータファイルを手動拡張してください。
SQL> ALTER DATABASE DATAFILE '<対象データファイルのパス>'
RESIZE <〇〇M / 〇〇G>;
(参照:Oracle Database SQL言語リファレンス - ALTER DATABASE)
データファイルの拡張実行後は、 Step3 の確認SQLをもう一度実行し、「AUTOEXTENSIBLE」と「MAX_MB」(手動拡張の場合は、「CURRENT_MB」)が意図した値になっていることを確認できれば、「既存データファイルの拡張」は完了です。
Step5:新規データファイルの追加
Step3 の確認結果からこちらに進んだ場合、既存のデータファイルがすでに最大サイズ(上限)に近い、もしくは達している状態です。そのため、既存ファイルの拡張ではなく「新しいデータファイルを追加する」アプローチをとります。
新規データファイルの追加前に、まずはOMF(Oracle Managed Files)の設定を確認しましょう。
SQL> show parameter db_create_file_dest;
OMFとは、データファイルの保存先(パス)やファイル名をOracleが自動で決定・管理してくれる機能のことです。
VALUEに「ディレクトリパス」や「+DATA」と表示される場合、OMF用の保存先が設定されています。この場合は、新規データファイル追加時のSQLでパスの記述を省略できます。
OMFの設定が確認できたら、実際に以下SQLでデータファイルの追加を実行します。
OMFが設定されている場合
SQL> ALTER TABLESPACE <対象の表領域名>
ADD DATAFILE
SIZE <〇〇M / 〇〇G>
AUTOEXTEND ON
NEXT <〇〇M / 〇〇G>
MAXSIZE <〇〇M / 〇〇G / UNLIMITED>;
OMFが設定されていない場合
SQL> ALTER TABLESPACE <対象の表領域名>
ADD DATAFILE '<新規データファイルのパス>'
SIZE <〇〇M / 〇〇G>
AUTOEXTEND ON
NEXT <〇〇M / 〇〇G>
MAXSIZE <〇〇M / 〇〇G / UNLIMITED>;
各項目の内容については以下の通りです。
- SIZE:初期状態のファイルサイズ
- NEXT:自動拡張する際の1回当たりの増分サイズ
- MAXSIZE:自動拡張の上限サイズ
(参照:Oracle Database SQL言語リファレンス - ALTER TABLESPACE)
「MAXSIZE」について、容量を指定する箇所を「UNLIMITED」 に設定することで、自動でそのデータファイルの最大拡張サイズ(例:32GB)まで引き上げることができます。
実行後は、Step3 で実行した確認SQLをもう一度実行します。新しいデータファイルが増えていることや、「AUTOEXTENSIBLE」「NEXT」「MAXSIZE」などが意図した値になっていることを確認できれば、データファイル追加は完了です。
まとめ
以上が表領域の拡張手順になります。
一度この流れを経験しておくと、次に容量不足のエラーが出ても、落ち着いて対応していけるようになると思います。
この記事が、日々の運用やトラブル対応の助けとなれば幸いです。
最後まで読んでいただき、ありがとうございます!




