技術・開発

【Oracle】肥大化した一時表領域(TEMPファイル)の削除と再作成手順メモ

2013年2月22日

開発環境のDB(Oracle Database)サーバーにて、ディスク容量が100%に到達してしまう事象が発生しました。

過去に何度かHDD領域を拡張して対応していたものの、すぐにまた100%になってしまうため、根本的な原因を調査することに。
すると、Oracleの一時表領域(TEMP領域のデータファイル)が「32GB+11GB」と異常に肥大化していることが判明しました。

容量不足を解消するため、肥大化した一時ファイル(Tempfile)を一度削除し、再作成する対応を行った際の備忘録です。

ステップ1:肥大化した一時ファイル(Tempfile)の削除

まずは、Oracleのシステム情報から対象となる一時ファイルの格納先を指定し、論理的に削除します。

ALTER DATABASE TEMPFILE '【ファイル格納場所】/temp01.dbf' DROP;

【重要】物理ファイルの削除を忘れずに!
上記のSQLを実行してOracle上の管理から外しても、OS上には物理的なデータファイル(temp01.dbf)がそのまま残っています。ディスク容量を空けるために、必ずOSのコマンド等で物理的にもファイルを削除してください。

ステップ2:表領域の管理方式(ローカル管理か否か)を確認

次に、対象の表領域が「ローカル管理(LOCAL)」かどうかを調べます。この管理方式によって、後続のファイル追加(再作成)の構文が若干異なります。

以下のSQLを実行して確認します。

SELECT TABLESPACE_NAME, EXTENT_MANAGEMENT FROM DBA_TABLESPACES;

結果の EXTENT_MANAGEMENT の値が LOCAL か、それ以外かを確認してください。

ステップ3:一時ファイルの再作成(追加)

確認した管理方式に合わせて、一時ファイルを再作成(追加)します。

パターンA:extent_managementが「LOCAL」の場合

一時表領域(TEMP)に対して、一時ファイル(Tempfile)を追加します。

ALTER TABLESPACE TEMP
ADD TEMPFILE '【ファイル格納場所】/temp01.dbf'
SIZE 100M;

パターンB:extent_managementが「LOCAL」以外の場合

※ディクショナリ管理などの通常の表領域に対してデータファイルを追加・再利用する場合の構文です。

ALTER TABLESPACE my_tablespace
ADD DATAFILE '【ファイル格納場所】/temp01.dbf'
SIZE 10M
REUSE
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;

これで一時表領域のクリアと再割り当てが完了しました。
とりあえず開発環境のDBは正常に動くようになったので、しばらくはこれで様子を見ようと思います!

-技術・開発
-, , , , , ,